From 3c75c3cfc64538068419d916b94029dfe2f0f802 Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Sat, 21 Mar 2015 20:05:15 +0000
Subject: [PATCH] Clear jmptable map between each file ir Test jmptable
 detection code when in shared library

Former-commit-id: 334533e895f76f1f9593efa5a0f23e84dfa2b091
---
 .gitattributes                                |  3 +
 libIRDB/test/fill_in_indtargs.cpp             |  2 +
 libIRDB/test/tests/switchtable/Makefile       | 22 +++--
 libIRDB/test/tests/switchtable/jmp.main.cpp   | 11 +++
 libIRDB/test/tests/switchtable/jmp.shared.cpp | 49 ++++++++++
 .../test/tests/switchtable/jmp2.shared.cpp    | 92 +++++++++++++++++++
 6 files changed, 172 insertions(+), 7 deletions(-)
 create mode 100644 libIRDB/test/tests/switchtable/jmp.main.cpp
 create mode 100644 libIRDB/test/tests/switchtable/jmp.shared.cpp
 create mode 100644 libIRDB/test/tests/switchtable/jmp2.shared.cpp

diff --git a/.gitattributes b/.gitattributes
index 2d3086a3a..ad8885e11 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -257,8 +257,11 @@ libIRDB/test/read_variantir.cpp -text
 libIRDB/test/rename_function.cpp -text
 libIRDB/test/tests/switchtable/Makefile -text
 libIRDB/test/tests/switchtable/README -text
+libIRDB/test/tests/switchtable/jmp.main.cpp -text
+libIRDB/test/tests/switchtable/jmp.shared.cpp -text
 libIRDB/test/tests/switchtable/jmp1.cpp -text
 libIRDB/test/tests/switchtable/jmp2.cpp -text
+libIRDB/test/tests/switchtable/jmp2.shared.cpp -text
 libIRDB/test/unfix_calls.cpp -text
 libIRDB/test/unwind-pe.h -text
 libMEDSannotation/LICENSE.txt -text
diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp
index 80fb91897..a6eb6bd31 100644
--- a/libIRDB/test/fill_in_indtargs.cpp
+++ b/libIRDB/test/fill_in_indtargs.cpp
@@ -1142,6 +1142,8 @@ main(int argc, char* argv[])
 		        pqxx::largeobject lo(elfoid);
         		lo.to_file(pqxx_interface.GetTransaction(),"readeh_tmp_file.exe");
 
+			jmptables.clear();
+
         		ELFIO::elfio*    elfiop=new ELFIO::elfio;
         		elfiop->load("readeh_tmp_file.exe");
 		
diff --git a/libIRDB/test/tests/switchtable/Makefile b/libIRDB/test/tests/switchtable/Makefile
index 0695aea29..096fd1d68 100644
--- a/libIRDB/test/tests/switchtable/Makefile
+++ b/libIRDB/test/tests/switchtable/Makefile
@@ -1,12 +1,11 @@
 INCLUDES= -I../../../../include -I../../../include/ -I../../../../beaengine/include 
 LIBS=-L ../../../lib/ -lIRDB-core -lIRDB-cfg -lIRDB-util -lpqxx -L ../../../../beaengine/lib/Linux.gnu.Debug -lBeaEngine_s_d 
-#OPT=-g -fPIE -fPIC -O2
-# OPT=-g -O2  oops no switch tables generated with -O2
-OPT=-g  -O
+OPT=-g -fPIE -fPIC -O2
+#OPT=-g  -O
 .SUFFIXES: .exe .cpp .peasoup
 
-PROGS=jmp1.exe jmp2.exe
-PEASOUP_PROGS=jmp1.peasoup jmp2.peasoup
+PROGS=jmp1.exe jmp2.exe jmp.shared.exe
+PEASOUP_PROGS=jmp1.peasoup jmp2.peasoup jmp.shared.peasoup
 
 all: $(PROGS)
 peasoup: $(PEASOUP_PROGS)
@@ -14,7 +13,7 @@ peasoup: $(PEASOUP_PROGS)
 $(PROGS): ../../../../lib/*
 
 .exe.peasoup: $<
-	$(PEASOUP_HOME)/tools/ps_analyze.sh $< $@ --step integertransform=off --step p1transform=off --step ilr=off
+	LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):." $(PEASOUP_HOME)/tools/ps_analyze.sh $< $@ --step integertransform=off --step p1transform=off --step ilr=off
 
 .o.exe:  $< ../lib/libIRDB-core.a ../lib/libIRDB-cfg.a
 	g++ $< $(INCLUDES) $(LIBS) $(OPT)  -o $@
@@ -22,5 +21,14 @@ $(PROGS): ../../../../lib/*
 .cpp.o:  $< 
 	g++ $< $(INCLUDES) $(LIBS) $(OPT) -o $@ -c
 
+jmp.shared.so: jmp.shared.cpp jmp2.shared.cpp
+	g++ -fPIC -c jmp.shared.cpp
+	g++ -fPIC -c jmp2.shared.cpp
+	g++ -shared -Wl,-soname,libjmp.so -o libjmp.so jmp.shared.o jmp2.shared.o
+
+jmp.shared.exe: jmp.shared.so jmp.main.cpp
+	g++ -c jmp.main.cpp
+	g++ jmp.main.o -L. -ljmp -o $@
+
 clean:
-	rm -fr $(PROGS) *.o peasoup_executable* *.peasoup
+	rm -fr $(PROGS) *.o *.so peasoup_executable* *.peasoup 
diff --git a/libIRDB/test/tests/switchtable/jmp.main.cpp b/libIRDB/test/tests/switchtable/jmp.main.cpp
new file mode 100644
index 000000000..13d92e21c
--- /dev/null
+++ b/libIRDB/test/tests/switchtable/jmp.main.cpp
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+extern int switch_table(int, char**);
+extern int switch_table_2(int, char**);
+
+int main(int argc, char** argv)
+{
+	printf("testing switch tables in shared library\n");
+	switch_table(argc, argv);
+	switch_table_2(argc, argv);
+}
diff --git a/libIRDB/test/tests/switchtable/jmp.shared.cpp b/libIRDB/test/tests/switchtable/jmp.shared.cpp
new file mode 100644
index 000000000..f03c7085f
--- /dev/null
+++ b/libIRDB/test/tests/switchtable/jmp.shared.cpp
@@ -0,0 +1,49 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+int add(int a, int b)
+{
+	int x = a + b;
+	printf("add(): %d + %d = %d\n", a, b, x);
+	return x;
+}
+
+int switch_table(int argc, char **argv)
+{
+	int i = atoi(argv[1]);
+
+	switch(i) 
+	{
+		case 20:
+			printf("i = 20\n");
+			break;
+		case 22:
+			printf("i = 22\n");
+			break;
+		case 23:
+			printf("hello: ");
+			printf("i = 23\n");
+			break;
+		case 24:
+			printf("i = 24\n");
+			break;
+		case 25:
+			printf("i = 25\n");
+			break;
+		case 26:
+			printf("bar: ");
+			printf("i = 26\n");
+			break;
+		case 27:
+			printf("i = 27\n");
+			break;
+		case 28:
+			printf("i = 28\n");
+			break;
+		default:
+			printf("i = %d\n", i);
+	}
+
+	int val = add(i,i);
+	printf("main(): %d + %d = %d\n", i, i, val);
+}
diff --git a/libIRDB/test/tests/switchtable/jmp2.shared.cpp b/libIRDB/test/tests/switchtable/jmp2.shared.cpp
new file mode 100644
index 000000000..e4b263f44
--- /dev/null
+++ b/libIRDB/test/tests/switchtable/jmp2.shared.cpp
@@ -0,0 +1,92 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+extern int add(int, int);
+
+int switch_table_2(int argc, char **argv)
+{
+	int i = atoi(argv[1]);
+
+	switch(i) 
+	{
+		case 20:
+			printf("i = 20\n");
+			break;
+		case 22:
+			printf("i = 22\n");
+			break;
+		case 23:
+			printf("hello: ");
+			printf("i = 23\n");
+			break;
+		case 24:
+			printf("i = 24\n");
+			break;
+		case 25:
+			printf("i = 25\n");
+			break;
+		case 26:
+			printf("bar: ");
+			printf("i = 26\n");
+			break;
+		case 27:
+			printf("i = 27\n");
+			break;
+		case 28:
+			printf("i = 28\n");
+			break;
+		default:
+			printf("i = %d\n", i);
+	}
+
+	int val = add(i,i);
+	printf("main(): %d + %d = %d\n", i, i, val);
+
+	switch(val) 
+	{
+		case 20:
+			val = 35;
+			printf("a\n");
+			break;
+		case 22:
+			val = add(21,31);
+			printf("36\n");
+			break;
+		case 23:
+			val = add(val, val);
+			printf("37\n");
+			break;
+		case 24:
+			val = add(val, 34);
+			printf("38\n");
+			break;
+		case 25:
+			val = 38;
+			printf("39\n");
+			break;
+		case 26:
+			val = 45;
+			printf("45\n");
+			break;
+		case 27:
+			val = 55;
+			printf("55\n");
+			break;
+		case 28:
+			val = 69;
+			printf("69\n");
+			break;
+		case 29:
+			val = 72;
+			break;
+		case 31:
+			val = 82;
+			printf("82\n");
+			break;
+		default:
+			val = 99;
+	}
+
+	printf("val = %d\n", val);
+
+}
-- 
GitLab