From 0ce2f633f7cbd3b273a84e300d0f1a7c9fdcc704 Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Sat, 28 Mar 2015 20:01:40 +0000
Subject: [PATCH] cleaner ibtarget interface

Former-commit-id: 6edfee134422cbb1de158db169ff1f7cd91b527a
---
 libIRDB/include/core/file.hpp        |  14 ++--
 libIRDB/include/core/fileir.hpp      |  16 ++--
 libIRDB/include/core/function.hpp    |   2 -
 libIRDB/include/core/ibtargets.hpp   |   1 +
 libIRDB/include/core/instruction.hpp |   5 +-
 libIRDB/include/libIRDB-core.hpp     |   4 +-
 libIRDB/src/core/Makefile            |   2 +-
 libIRDB/src/core/file.cpp            |   7 +-
 libIRDB/src/core/fileir.cpp          | 106 +++++++++++++++++++++++++--
 libIRDB/src/core/ibtargets.cpp       |   2 +
 libIRDB/src/core/instruction.cpp     |  14 ++--
 libIRDB/src/core/variantid.cpp       |  37 +++++++---
 libIRDB/test/fill_in_indtargs.cpp    |  12 ++-
 libIRDB/test/fix_calls.cpp           |  30 +-------
 libIRDB/test/read_variantir.cpp      |  19 ++---
 15 files changed, 186 insertions(+), 85 deletions(-)

diff --git a/libIRDB/include/core/file.hpp b/libIRDB/include/core/file.hpp
index e6c49d258..f6c860aa9 100644
--- a/libIRDB/include/core/file.hpp
+++ b/libIRDB/include/core/file.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 - Zephyr Software LLC
+ * Copyright (c) 2014-2015 - Zephyr Software LLC
  *
  * This file may be used and modified for non-commercial purposes as long as
  * all copyright, permission, and nonwarranty notices are preserved.
@@ -24,7 +24,7 @@ class File_t : public BaseObj_t
     public:
         // create new item.
         File_t(db_id_t file_id, db_id_t orig_fid, std::string url, std::string hash, std::string arch, int elfoid, 
-		std::string atn, std::string ftn, std::string itn, std::string ibn, std::string rtn, std::string typ, db_id_t doipid);
+		std::string atn, std::string ftn, std::string itn, std::string icfs, std::string icfs_map, std::string rtn, std::string typ, db_id_t doipid);
 
         File_t(db_id_t file_id) : BaseObj_t(NULL) { assert(0);}          // read from DB       
         void WriteToDB() { assert(0); }   // writes to DB ID is not -1.
@@ -32,7 +32,9 @@ class File_t : public BaseObj_t
         std::string GetAddressTableName() { return address_table_name; }
         std::string GetFunctionTableName() { return function_table_name; }
         std::string GetInstructionTableName() { return instruction_table_name; }
-        std::string GetIBTargetsTableName() { return ibtargets_table_name; }
+// xxx        std::string GetIBTargetsTableName() { return ibtargets_table_name; }
+        std::string GetICFSTableName() { return icfs_table_name; }
+        std::string GetICFSMapTableName() { return icfs_map_table_name; }
         std::string GetRelocationsTableName() { return relocs_table_name; }
         std::string GetTypesTableName() { return types_table_name; }
         std::string GetURL() { return url; }
@@ -52,7 +54,8 @@ class File_t : public BaseObj_t
         friend class PointerType_t;
         friend class AggregateType_t;
         friend class FuncType_t;
-        friend class IBTargets;
+        friend class ICFS_t;
+//        friend class IBTargets;
 
     private:
 	db_id_t orig_fid;
@@ -62,7 +65,8 @@ class File_t : public BaseObj_t
         std::string address_table_name;
         std::string function_table_name;
         std::string instruction_table_name;
-        std::string ibtargets_table_name;
+        std::string icfs_table_name;
+        std::string icfs_map_table_name;
         std::string relocs_table_name;
         std::string types_table_name;
 	int elfoid;
diff --git a/libIRDB/include/core/fileir.hpp b/libIRDB/include/core/fileir.hpp
index f1e5184d4..c88986f2a 100644
--- a/libIRDB/include/core/fileir.hpp
+++ b/libIRDB/include/core/fileir.hpp
@@ -22,7 +22,6 @@
 
 typedef std::set<Function_t*> FunctionSet_t;
 typedef std::set<AddressID_t*> AddressSet_t;
-typedef std::map<Instruction_t*, InstructionCFGNodeSet_t> IBTargetMap_t;
 
 // A variant of a problem, this
 // may be an original variant
@@ -43,7 +42,7 @@ class FileIR_t : public BaseObj_t
 	InstructionSet_t& GetInstructions() { return insns; }
 	AddressSet_t&     GetAddresses() { return addrs; }
 	RelocationSet_t&  GetRelocations() { return relocs; }
-	IBTargets&  	  GetIBTargets() { return ibtargets; }
+	ICFSSet_t&        GetAllICFS() { return icfs_set; }
 
 	// generate the spri rules into the output file, fout.
 	void GenerateSPRI(std::ostream &fout, bool with_ilr=false);
@@ -81,7 +80,7 @@ class FileIR_t : public BaseObj_t
 	#define ASM_REG_MAX_SIZE 500000
 
 	typedef std::map<Instruction_t*,std::string> registry_type;
-	typedef std::map<Instruction_t*,InstructionCFGNode_t*> ICFGNodeMap_t;
+// xxx	typedef std::map<Instruction_t*,InstructionCFGNode_t*> ICFGNodeMap_t;
 
 	// a pointer to the original variants IR, NULL means not yet loaded.
 	FileIR_t* orig_variant_ir_p;
@@ -96,8 +95,8 @@ class FileIR_t : public BaseObj_t
 	RelocationSet_t   relocs;
 	TypeSet_t         types;
 	VariantID_t       progid;
+	ICFSSet_t         icfs_set;
 	File_t*           fileptr;
-	IBTargets         ibtargets; // instructions* --> target set
 
 	std::map<db_id_t,AddressID_t*> ReadAddrsFromDB();
 	std::map<db_id_t,Function_t*> ReadFuncsFromDB
@@ -108,14 +107,17 @@ class FileIR_t : public BaseObj_t
 	std::map<db_id_t,Instruction_t*> ReadInsnsFromDB 
 	(	
 		std::map<db_id_t,Function_t*> &funcMap,
-		std::map<db_id_t,AddressID_t*> &addrMap
-	) ;
+		std::map<db_id_t,AddressID_t*> &addrMap,
+		std::map<db_id_t,Instruction_t*> &addressToInstructionMap,
+		std::map<Instruction_t*, db_id_t> &unresolvedICFS
+	);
 	void ReadRelocsFromDB
 	(
 		std::map<db_id_t,Instruction_t*>		&insnMap
 	);
 
 	std::map<db_id_t, Type_t*> ReadTypesFromDB(TypeSet_t& types);
-	void ReadIBTargetsFromDB(std::map<db_id_t,Instruction_t*> &insnMap);
+	void ReadAllICFSFromDB(std::map<db_id_t,Instruction_t*> &addr2insnMap,
+		std::map<Instruction_t*, db_id_t> &unresolvedICFS);
 };
 
diff --git a/libIRDB/include/core/function.hpp b/libIRDB/include/core/function.hpp
index 01d86a154..cfe32f719 100644
--- a/libIRDB/include/core/function.hpp
+++ b/libIRDB/include/core/function.hpp
@@ -20,8 +20,6 @@
 
 #include "core/type.hpp"
 
-typedef        std::set<Instruction_t*> InstructionSet_t;
-
 // The basic Function of a variant.
 class Function_t : public BaseObj_t
 {
diff --git a/libIRDB/include/core/ibtargets.hpp b/libIRDB/include/core/ibtargets.hpp
index dae773d65..7d2342512 100644
--- a/libIRDB/include/core/ibtargets.hpp
+++ b/libIRDB/include/core/ibtargets.hpp
@@ -18,6 +18,7 @@
  *
  */
 
+DEPRECATED DO NOT USE
 #ifndef _ibtargets_
 #define _ibtargets_
 
diff --git a/libIRDB/include/core/instruction.hpp b/libIRDB/include/core/instruction.hpp
index d85377e6e..674588b66 100644
--- a/libIRDB/include/core/instruction.hpp
+++ b/libIRDB/include/core/instruction.hpp
@@ -38,17 +38,18 @@ class Instruction_t : public BaseObj_t
         db_id_t GetOriginalAddressID() const { return orig_address_id; } 
         Instruction_t* GetFallthrough() const { return fallthrough; } 
         Instruction_t* GetTarget() const { return target; } 
+		ICFS_t* GetIBTargets() const { return icfs; }
         std::string GetDataBits()  const { return data; } 
         std::string GetCallback()  const { return callback; } 
         std::string GetComment()   const { return comment; } 
 
-		InstructionCFGNodeSet_t& GetIBTargets(); 
   
         void SetAddress(AddressID_t* newaddr)  { my_address=newaddr; }
         void SetFunction(Function_t* func   )  { my_function=func;}
         void SetOriginalAddressID(db_id_t origid) { orig_address_id=origid; /* you shouldn't do this, unless you know what you're doing! */}
         void SetFallthrough(Instruction_t* i) { fallthrough=i; }
         void SetTarget(Instruction_t* i)      { target=i; }
+        void SetIBTargets(ICFS_t *p_icfs)     { icfs=p_icfs; }
         void SetDataBits(std::string orig)    { data=orig; }
         void SetCallback(std::string orig)    { callback=orig; }
         void SetComment(std::string orig)     { comment=orig; }
@@ -82,5 +83,5 @@ class Instruction_t : public BaseObj_t
         std::string     comment;
 		AddressID_t*    indTarg;
 		RelocationSet_t relocs;
-		InstructionCFGNodeSet_t ibtargets; // IB targets
+		ICFS_t*         icfs;
 };
diff --git a/libIRDB/include/libIRDB-core.hpp b/libIRDB/include/libIRDB-core.hpp
index c44f98a14..85b7addd2 100644
--- a/libIRDB/include/libIRDB-core.hpp
+++ b/libIRDB/include/libIRDB-core.hpp
@@ -42,9 +42,9 @@ class Instruction_t; // forward decl for many classes
 #include <core/baseobj.hpp>
 #include <core/reloc.hpp>
 #include <core/address.hpp>
-#include <core/instructioncfg.hpp>
+// xxx #include <core/instructioncfg.hpp>
+#include <core/icfs.hpp>
 #include <core/instruction.hpp>
-#include <core/ibtargets.hpp>
 #include <core/file.hpp>
 #include <core/function.hpp>
 #include <core/variantid.hpp>
diff --git a/libIRDB/src/core/Makefile b/libIRDB/src/core/Makefile
index 93bfc5792..21680626f 100644
--- a/libIRDB/src/core/Makefile
+++ b/libIRDB/src/core/Makefile
@@ -2,7 +2,7 @@
 LIB=../../lib/libIRDB-core.a
 
 
-OBJS=baseobj.o type.o variantid.o pqxxdb.o dbinterface.o function.o fileir.o file.o instruction.o ibtargets.o address.o generate_spri.o
+OBJS=baseobj.o type.o variantid.o pqxxdb.o dbinterface.o function.o fileir.o file.o instruction.o address.o generate_spri.o
 
 all: $(OBJS)
 
diff --git a/libIRDB/src/core/file.cpp b/libIRDB/src/core/file.cpp
index 68fadbfff..bbaae5778 100644
--- a/libIRDB/src/core/file.cpp
+++ b/libIRDB/src/core/file.cpp
@@ -32,9 +32,9 @@ using namespace std;
 
 
 File_t::File_t(db_id_t myfile_id, db_id_t my_orig_fid, std::string myurl, std::string myhash, std::string myarch, int myoid, 
-		std::string atn, std::string ftn, std::string itn, std::string ibn, std::string rtn, std::string typ, db_id_t mydoipid) :
+		std::string atn, std::string ftn, std::string itn, std::string icfs, std::string icfs_map, std::string rtn, std::string typ, db_id_t mydoipid) :
 	BaseObj_t(NULL), url(myurl), hash(myhash), arch(myarch), elfoid(myoid),
-	address_table_name(atn), function_table_name(ftn), instruction_table_name(itn), ibtargets_table_name(ibn), 
+	address_table_name(atn), function_table_name(ftn), instruction_table_name(itn), icfs_table_name(icfs), icfs_map_table_name(icfs_map),
 	relocs_table_name(rtn), types_table_name(typ), orig_fid(my_orig_fid)
 {
 	SetBaseID(myfile_id);
@@ -53,7 +53,8 @@ void File_t::CreateTables()
 		address_table_name+" "+
 		function_table_name+" "+
 		instruction_table_name+" "+
-		ibtargets_table_name+" "+
+		icfs_table_name+" "+
+		icfs_map_table_name+" "+
 		relocs_table_name+" "+
 		types_table_name+" "+
 		tmpfile;
diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp
index 059a0c055..bbf9fe8c4 100644
--- a/libIRDB/src/core/fileir.cpp
+++ b/libIRDB/src/core/fileir.cpp
@@ -95,6 +95,8 @@ FileIR_t::~FileIR_t()
 	{
 		delete *i;
 	}
+
+	// @todo: clear icfs_t
 }
   
 // DB operations
@@ -105,9 +107,13 @@ void FileIR_t::ReadFromDB()
 	std::map<db_id_t,Type_t*> typesMap = ReadTypesFromDB(types); 
 	std::map<db_id_t,AddressID_t*> 	addrMap=ReadAddrsFromDB();
 	std::map<db_id_t,Function_t*> 	funcMap=ReadFuncsFromDB(addrMap, typesMap);
-	std::map<db_id_t,Instruction_t*> 	insnMap=ReadInsnsFromDB(funcMap,addrMap);
 
-	ReadIBTargetsFromDB(insnMap);
+	std::map<db_id_t,Instruction_t*> addressToInstructionMap;
+	std::map<Instruction_t*, db_id_t> unresolvedICFS;
+
+	std::map<db_id_t,Instruction_t*> insnMap=ReadInsnsFromDB(funcMap,addrMap,addressToInstructionMap, unresolvedICFS);
+
+	ReadAllICFSFromDB(addressToInstructionMap, unresolvedICFS);
 	ReadRelocsFromDB(insnMap);
 
 	UpdateEntryPoints(insnMap);
@@ -338,7 +344,9 @@ std::map<db_id_t,AddressID_t*> FileIR_t::ReadAddrsFromDB
 std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB 
 	(      
         std::map<db_id_t,Function_t*> &funcMap,
-        std::map<db_id_t,AddressID_t*> &addrMap
+        std::map<db_id_t,AddressID_t*> &addrMap,
+		std::map<db_id_t,Instruction_t*> &addressToInstructionMap,
+		std::map<Instruction_t*, db_id_t> &unresolvedICFS
         ) 
 {
 	std::map<db_id_t,Instruction_t*> idMap;
@@ -358,6 +366,7 @@ std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB
 //  orig_address_id           integer REFERENCES #PROGNAME#_address,
 //  fallthrough_address_id    integer,
 //  target_address_id         integer,
+//  icfs_id                   integer,
 //  data                      bytea,
 //  callback                  text,
 //  comment                   text,
@@ -370,6 +379,7 @@ std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB
 		db_id_t orig_address_id=atoi(dbintr->GetResultColumn("orig_address_id").c_str());
 		db_id_t fallthrough_address_id=atoi(dbintr->GetResultColumn("fallthrough_address_id").c_str());
 		db_id_t targ_address_id=atoi(dbintr->GetResultColumn("target_address_id").c_str());
+		db_id_t icfs_id=atoi(dbintr->GetResultColumn("icfs_id").c_str());
 		std::string data=(dbintr->GetResultColumn("data"));
 		std::string callback=(dbintr->GetResultColumn("callback"));
 		std::string comment=(dbintr->GetResultColumn("comment"));
@@ -397,8 +407,20 @@ std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB
 		fallthroughs[instruction_id]=fallthrough_address_id;
 		targets[instruction_id]=targ_address_id;
 
+		addressToInstructionMap[aid] = newinsn;
 		insns.insert(newinsn);
 
+		if (icfs_id == NOT_IN_DATABASE)
+		{
+			newinsn->SetIBTargets(NULL);
+		}
+		else
+		{
+			// keep track of instructions for which we have not yet
+			// resolved the ICFS
+			unresolvedICFS[newinsn] = icfs_id;
+		}
+
 		dbintr->MoveToNextRow();
 	}
 
@@ -457,7 +479,8 @@ void FileIR_t::WriteToDB()
 	db_id_t j=-1;
 
 	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->instruction_table_name + string(" cascade;"));
-	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->ibtargets_table_name + string(" cascade;"));
+	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->icfs_table_name + string(" cascade;"));
+	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->icfs_map_table_name + string(" cascade;"));
 	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->function_table_name    + string(" cascade;"));
 	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->address_table_name     + string(" cascade;"));
 	dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->relocs_table_name     + string(" cascade;"));
@@ -572,8 +595,10 @@ void FileIR_t::WriteToDB()
 	}
 	dbintr->IssueQuery(q);
 
-	q = string("");
-	q = ibtargets.WriteToDB(fileptr);
+/* xxx
+	 xxxq = string("");
+	 xxxq = ibtargets.WriteToDB(fileptr);
+*/
 	dbintr->IssueQuery(q);
 }
 
@@ -879,6 +904,74 @@ std::map<db_id_t, Type_t*> FileIR_t::ReadTypesFromDB (TypeSet_t& types)
 	return tMap;
 }
 
+void FileIR_t::ReadAllICFSFromDB(std::map<db_id_t,Instruction_t*> &addr2instMap,
+		std::map<Instruction_t*, db_id_t> &unresolvedICFS)
+{
+	std::map<db_id_t, ICFS_t*> icfsMap;
+
+	// retrieve all sets
+	std::string q= "select * from " + fileptr->icfs_table_name + " ; ";
+	dbintr->IssueQuery(q);
+
+	while(!dbintr->IsDone())
+	{
+		db_id_t icfs_id = atoi(dbintr->GetResultColumn("icfs_id").c_str());
+		bool isComplete=false;
+		string isCompleteString=dbintr->GetResultColumn("is_complete"); 
+		const char *isCompletestr=isCompleteString.c_str();
+		if (isCompleteString.size() > 0)
+		{
+			if (isCompletestr[0] == 't' || isCompletestr[0] == 'T' || isCompletestr[0] == '1' || isCompletestr[0] == 'y' || isCompletestr[0] == 'Y')
+				isComplete = true;
+		}
+
+		ICFS_t* icfs = new ICFS_t(icfs_id, isComplete);		
+		GetAllICFS().insert(icfs);
+
+		icfsMap[icfs_id] = icfs;
+	}
+
+	ICFSSet_t all_icfs = GetAllICFS();
+
+	// for each set, populate its members
+	for (ICFSSet_t::iterator it = all_icfs.begin(); it != all_icfs.end(); ++it)
+	{
+		char query2[2048];
+		ICFS_t *icfs = *it;
+		assert(icfs);
+		int icfsid = icfs->GetBaseID();
+		sprintf(query2,"select * from %s WHERE icfs_id = %d;", fileptr->icfs_map_table_name.c_str(), icfsid);
+		dbintr->IssueQuery(query2);
+		while(!dbintr->IsDone())
+		{
+			db_id_t address_id = atoi(dbintr->GetResultColumn("address_id").c_str());
+			Instruction_t* instruction = addr2instMap[address_id];
+			if (instruction)
+				icfs->insert(instruction);
+			// @todo: handle cross-file addresses
+			//        these are allowed by the DB schema but we don't yet handle them
+			// if we encounter an unresolved address, we should mark the ICFS
+			//      as unresolved
+		}					
+	}
+
+	// backpatch all unresolved instruction -> ICFS
+	std::map<Instruction_t*, db_id_t>::iterator uit;
+	for (std::map<Instruction_t*, db_id_t>::iterator uit = unresolvedICFS.begin(); uit != unresolvedICFS.end(); ++uit)
+	{
+		Instruction_t* unresolved = uit->first;
+		db_id_t icfs_id = uit->second;
+
+		assert(unresolved);
+
+		ICFS_t *icfs = icfsMap[icfs_id];
+		assert(icfs);
+
+		unresolved->SetIBTargets(icfs);
+	}
+}
+
+/*
 void FileIR_t::ReadIBTargetsFromDB(std::map<db_id_t,Instruction_t*> &insnMap)
 {
 	std::string q= "select * from " + fileptr->ibtargets_table_name + " ; ";
@@ -912,3 +1005,4 @@ void FileIR_t::ReadIBTargetsFromDB(std::map<db_id_t,Instruction_t*> &insnMap)
 		dbintr->MoveToNextRow();
 	}
 }
+*/
diff --git a/libIRDB/src/core/ibtargets.cpp b/libIRDB/src/core/ibtargets.cpp
index 5173a938f..19141a66f 100644
--- a/libIRDB/src/core/ibtargets.cpp
+++ b/libIRDB/src/core/ibtargets.cpp
@@ -18,6 +18,7 @@
  *
  */
 
+#ifdef DEPRECATED
 #include <all.hpp>
 #include <core/ibtargets.hpp>
 #include <utils.hpp>
@@ -188,3 +189,4 @@ const string IBTargets::toString()
 
 	return ss.str();
 }
+#endif
diff --git a/libIRDB/src/core/instruction.cpp b/libIRDB/src/core/instruction.cpp
index 9a8a02d4e..48a030e4d 100644
--- a/libIRDB/src/core/instruction.cpp
+++ b/libIRDB/src/core/instruction.cpp
@@ -42,6 +42,7 @@ Instruction_t::Instruction_t() :
 	fallthrough=NULL;
 	target=NULL;
 	indTarg=NULL;
+	icfs=NULL;
 }
 
 Instruction_t::Instruction_t(db_id_t id, 
@@ -66,6 +67,7 @@ Instruction_t::Instruction_t(db_id_t id,
 	orig_address_id=orig_id;
 	fallthrough=NULL;
 	target=NULL;
+	icfs=NULL;
 }
 
 int Instruction_t::Disassemble(DISASM &disasm) const
@@ -173,6 +175,10 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader)
 	if(target)
 		targ_id=target->GetBaseID();
 
+	db_id_t icfs_id=NOT_IN_DATABASE;
+	if (icfs)
+		icfs_id=icfs->GetBaseID();
+
 	db_id_t indirect_bt_id=NOT_IN_DATABASE;
 	if(indTarg)
 		indirect_bt_id=indTarg->GetBaseID();
@@ -181,7 +187,7 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader)
 	
 	if (p_withHeader) 
 		q = string("insert into ")+fid->instruction_table_name +
-                string(" (instruction_id, address_id, parent_function_id, orig_address_id, fallthrough_address_id, target_address_id, data, callback, comment, ind_target_address_id, doip_id) VALUES ");
+                string(" (instruction_id, address_id, parent_function_id, orig_address_id, fallthrough_address_id, target_address_id, icfs_id, data, callback, comment, ind_target_address_id, doip_id) VALUES ");
 	else
 		q = ",";
 
@@ -196,6 +202,7 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader)
                 string("'") + to_string(orig_address_id)         	+ string("', ") +
                 string("'") + to_string(ft_id)         			+ string("', ") +
                 string("'") + to_string(targ_id)         		+ string("', ") +
+                string("'") + to_string(icfs_id)         		+ string("', ") +
                 string("decode('") + hex_data.str()                     + string("', 'hex'), ") +
                 string("'") + callback                              	+ string("', ") +
                 string("'") + comment                              	+ string("', ") +
@@ -261,8 +268,3 @@ bool Instruction_t::SetsStackPointer(DISASM* disasm)
 	return false;
 
 }
-
-InstructionCFGNodeSet_t& Instruction_t::GetIBTargets()
-{
-	return ibtargets;
-}
diff --git a/libIRDB/src/core/variantid.cpp b/libIRDB/src/core/variantid.cpp
index 332744b39..b37c7e2f5 100644
--- a/libIRDB/src/core/variantid.cpp
+++ b/libIRDB/src/core/variantid.cpp
@@ -185,7 +185,8 @@ File_t* VariantID_t::CloneFile(File_t* fptr)
 	std::string atn="atnfid"+to_string(newfid);
 	std::string ftn="ftnfid"+to_string(newfid);
 	std::string itn="itnfid"+to_string(newfid);
-	std::string ibn="ibnfid"+to_string(newfid);
+	std::string icfs="icfsfid"+to_string(newfid);
+	std::string icfsmap="icfsmapfid"+to_string(newfid);
 	std::string rtn="rtnfid"+to_string(newfid);
 	std::string typ="typfid"+to_string(newfid);
 
@@ -195,8 +196,10 @@ File_t* VariantID_t::CloneFile(File_t* fptr)
 	q+=ftn;
 	q+="', instruction_table_name='";
 	q+=itn;
-	q+="', ibtargets_table_name='";
-	q+=ibn;
+	q+="', icfs_table_name='";
+	q+=icfs;
+	q+="', icfs_map_table_name='";
+	q+=icfsmap;
 	q+="', relocs_table_name='";
 	q+=rtn;
 	q+="', types_table_name='";
@@ -207,8 +210,7 @@ File_t* VariantID_t::CloneFile(File_t* fptr)
 	
         dbintr->IssueQuery(q);
 
-	File_t* newfile=new File_t(newfid, fptr->orig_fid, fptr->url, fptr->hash, fptr->arch, fptr->elfoid, 
-					atn, ftn, itn, ibn, rtn, typ, fptr->GetDoipID());
+	File_t* newfile=new File_t(newfid, fptr->orig_fid, fptr->url, fptr->hash, fptr->arch, fptr->elfoid, atn, ftn, itn, icfs, icfsmap, rtn, typ, fptr->GetDoipID());
 
 	newfile->CreateTables();
 
@@ -219,7 +221,12 @@ File_t* VariantID_t::CloneFile(File_t* fptr)
         dbintr->IssueQuery(q);
 
         q="drop table ";
-        q+=ibn;
+        q+=icfs;
+        q+=" ; ";
+        dbintr->IssueQuery(q);
+
+        q="drop table ";
+        q+=icfsmap;
         q+=" ; ";
         dbintr->IssueQuery(q);
 
@@ -259,9 +266,16 @@ File_t* VariantID_t::CloneFile(File_t* fptr)
         dbintr->IssueQuery(q);
 
         q="select * into ";
-        q+=ibn;
+        q+=icfs;
+        q+=" from ";
+        q+=fptr->icfs_table_name;
+        q+=" ;";
+        dbintr->IssueQuery(q);
+
+        q="select * into ";
+        q+=icfsmap;
         q+=" from ";
-        q+=fptr->ibtargets_table_name;
+        q+=fptr->icfs_map_table_name;
         q+=" ;";
         dbintr->IssueQuery(q);
 
@@ -367,7 +381,7 @@ File_t* VariantID_t::GetMainFile() const
 void VariantID_t::ReadFilesFromDB()
 {
 
-	std::string q= "select  file_info.orig_file_id, file_info.address_table_name, file_info.instruction_table_name, file_info.ibtargets_table_name,"
+	std::string q= "select  file_info.orig_file_id, file_info.address_table_name, file_info.instruction_table_name, file_info.icfs_table_name,file_info.icfs_map_table_name,"
 		" file_info.function_table_name, file_info.relocs_table_name, file_info.types_table_name, file_info.file_id, file_info.url, file_info.hash,"
 		" file_info.arch, file_info.type, file_info.elfoid, file_info.doip_id "
 		" from file_info,variant_dependency "
@@ -390,12 +404,13 @@ void VariantID_t::ReadFilesFromDB()
         	std::string atn=(BaseObj_t::dbintr->GetResultColumn("address_table_name"));
         	std::string ftn=(BaseObj_t::dbintr->GetResultColumn("function_table_name"));
         	std::string itn=(BaseObj_t::dbintr->GetResultColumn("instruction_table_name"));
-        	std::string ibn=(BaseObj_t::dbintr->GetResultColumn("ibtargets_table_name"));
+        	std::string icfs=(BaseObj_t::dbintr->GetResultColumn("icfs_table_name"));
+        	std::string icfs_map=(BaseObj_t::dbintr->GetResultColumn("icfs_map_table_name"));
         	std::string rtn=(BaseObj_t::dbintr->GetResultColumn("relocs_table_name"));
         	std::string typ=(BaseObj_t::dbintr->GetResultColumn("types_table_name"));
 
 
-		File_t *newfile=new File_t(file_id,orig_fid,url,hash,type,oid,atn,ftn,itn,ibn, rtn,typ,doipid);
+		File_t *newfile=new File_t(file_id,orig_fid,url,hash,type,oid,atn,ftn,itn,icfs,icfs_map,rtn,typ,doipid);
 
 std::cout<<"Found file "<<file_id<<"."<<std::endl;
 std::cout<<"  atn: " << atn << " ftn: " << ftn << " rtn: " << rtn << " typ: " << typ << std::endl;
diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp
index a961c8b75..75ca30c75 100644
--- a/libIRDB/test/fill_in_indtargs.cpp
+++ b/libIRDB/test/fill_in_indtargs.cpp
@@ -234,7 +234,8 @@ void mark_jmptables(FileIR_t *firp)
 
 			assert(instr && ibtarget);
 
-			firp->GetIBTargets().AddTarget(instr, ibtarget);
+			assert(0); // XXX wip
+//			firp->GetIBTargets().AddTarget(instr, ibtarget);
 		}
 	}
 }
@@ -1035,7 +1036,8 @@ void check_for_indirect_jmps(FileIR_t* firp, Instruction_t* insn)
 	if (getenv("IB_VERBOSE"))
 		cout << insn->getDisassembly() << " is an indirect call, assign to DEFAULT HELNNODE" << endl;
 
-	firp->GetIBTargets().AddHellnodeTarget(insn, DEFAULT_ICFG_HELLNODE);
+	assert(0);
+//	firp->GetIBTargets().AddHellnodeTarget(insn, DEFAULT_ICFG_HELLNODE);
 }
 
 void check_for_indirect_calls(FileIR_t* firp, Instruction_t* insn)
@@ -1054,7 +1056,8 @@ void check_for_indirect_calls(FileIR_t* firp, Instruction_t* insn)
 	if (getenv("IB_VERBOSE"))
 		cout << insn->getDisassembly() << " is an indirect call, assign to CALL HELNNODE" << endl;
 
-	firp->GetIBTargets().AddHellnodeTarget(insn, CALL_ICFG_HELLNODE);
+//	firp->GetIBTargets().AddHellnodeTarget(insn, CALL_ICFG_HELLNODE);
+	assert(0);
 }
 
 
@@ -1188,10 +1191,13 @@ void fill_in_indtargs(FileIR_t* firp, elfio* elfiop)
 
 	mark_jmptables(firp);
 
+/*
+xxx XXX wip
 	if(getenv("IB_VERBOSE")!=NULL)
 	{
 		cout << firp->GetIBTargets().toString() << endl;
 	}
+	*/
 }
 
 
diff --git a/libIRDB/test/fix_calls.cpp b/libIRDB/test/fix_calls.cpp
index ea1b07918..c44762bae 100644
--- a/libIRDB/test/fix_calls.cpp
+++ b/libIRDB/test/fix_calls.cpp
@@ -459,28 +459,9 @@ void fix_call(Instruction_t* insn, FileIR_t *firp)
 	callinsn->SetFunction(insn->GetFunction());
 	callinsn->SetComment(insn->GetComment()+" Jump part");
 
-	// handle IB targets
-	//     insn is the old call instruction
-	// callinsn is the jmp part of the push/jump
-	InstructionCFGNodeSet_t nodes = insn->GetIBTargets();
-	InstructionCFGNodeSet_t::iterator it;
-	for (it = nodes.begin(); it != nodes.end(); ++it)
-	{
-		InstructionCFGNode_t *node = *it;
-		if (node->IsHellnode())
-		{
-			firp->GetIBTargets().AddHellnodeTarget(callinsn, node->GetHellnodeType());
-			firp->GetIBTargets().RemoveHellnodeTarget(insn, node->GetHellnodeType());
-		}
-		else
-		{
-			firp->GetIBTargets().AddTarget(callinsn, node->GetInstruction());
-			firp->GetIBTargets().RemoveTarget(insn, node);
-		}
-	}
-
-	// complete remove from map
-	firp->GetIBTargets().Remove(insn);
+	/* handle ib targets */
+	callinsn->SetIBTargets(insn->GetIBTargets());
+	insn->SetIBTargets(NULL);
 
 	// We need the control transfer instruction to be from the orig program because 
 	// if for some reason it's fallthrough/target isn't in the DB, we need to correctly 
@@ -535,7 +516,6 @@ void fix_call(Instruction_t* insn, FileIR_t *firp)
 	insn->GetRelocations().insert(reloc);
 	firp->GetRelocations().insert(reloc);
 
-
 	/* If the fallthrough is not marked as indirectly branchable-to, then mark it so */
 	if(newindirtarg && !newindirtarg->GetIndirectBranchTargetAddress())
 	{
@@ -545,7 +525,7 @@ void fix_call(Instruction_t* insn, FileIR_t *firp)
 		newaddr->SetFileID(newindirtarg->GetAddress()->GetFileID());
 		newaddr->SetVirtualOffset(newindirtarg->GetAddress()->GetVirtualOffset());
 
-		/* set the insturction and include this address in the list of addrs */
+		/* set the instruction and include this address in the list of addrs */
 		newindirtarg->SetIndirectBranchTargetAddress(newaddr);
 		firp->GetAddresses().insert(newaddr);
 	}
@@ -871,8 +851,6 @@ main(int argc, char* argv[])
 			fix_other_pcrel(firp);
 			firp->WriteToDB();
 
-			cout << firp->GetIBTargets().toString() << endl;
-
 			cout<<"Done!"<<endl;
 			delete firp;
 
diff --git a/libIRDB/test/read_variantir.cpp b/libIRDB/test/read_variantir.cpp
index c62696554..d2ff4c826 100644
--- a/libIRDB/test/read_variantir.cpp
+++ b/libIRDB/test/read_variantir.cpp
@@ -71,22 +71,19 @@ main(int argc, char* argv[])
 			{
 				Instruction_t* insn=*it;
 				cout<<"Found insn at addr:" << std::hex << insn->GetAddress()->GetVirtualOffset() << " " << insn->getDisassembly() << endl;
-				InstructionCFGNodeSet_t ibtargets = insn->GetIBTargets();
-				InstructionCFGNodeSet_t::iterator ibtargets_it;
+				ICFS_t* ibtargets = insn->GetIBTargets();
+				if (!ibtargets) continue;
 
-				for (ibtargets_it = ibtargets.begin(); ibtargets_it != ibtargets.end(); ++ibtargets_it)
+				ICFS_t::iterator ibtargets_it;
+
+				for (ibtargets_it = ibtargets->begin(); ibtargets_it != ibtargets->end(); ++ibtargets_it)
 				{
-					InstructionCFGNode_t *node = *ibtargets_it;
-					assert(node);
-					if (node->IsHellnode())
-						cout<<"   indirect branch target: hellnode" << std::endl;
-					else
-						cout<<"   indirect branch target: " << std::hex << node->GetInstruction()->GetAddress()->GetVirtualOffset() << dec << endl;
+					Instruction_t* insn = *ibtargets_it;
+					assert(insn);
+					cout<<"   indirect branch target: " << std::hex << insn->GetAddress()->GetVirtualOffset() << dec << endl;
 				}
 			}
 
-			cout << firp->GetIBTargets().toString() << endl;
-
 			delete firp;
 		}
 		delete pidp;
-- 
GitLab