diff --git a/libIRDB/include/core/fileir.hpp b/libIRDB/include/core/fileir.hpp index ef1f42f126624fc9e194a872d09e09aa02916fb7..0b13a180e4ea90d291a95cd339efe8875eb1485c 100644 --- a/libIRDB/include/core/fileir.hpp +++ b/libIRDB/include/core/fileir.hpp @@ -5,19 +5,20 @@ // (i.e., and unmodified Variant) or a modified variant. class FileIR_t : public BaseObj_t { - public: + public: - // Create a Variant from the database - FileIR_t(const VariantID_t &newprogid, File_t* fid=NULL); + // Create a Variant from the database + FileIR_t(const VariantID_t &newprogid, File_t* fid=NULL); + ~FileIR_t(); - // DB operations - void WriteToDB(); + // DB operations + void WriteToDB(); - // accessors and mutators in one - std::set<Function_t*>& GetFunctions() { return funcs; } - std::set<Instruction_t*>& GetInstructions() { return insns; } - std::set<AddressID_t*>& GetAddresses() { return addrs; } - std::set<Relocation_t*>& GetRelocations() { return relocs; } + // accessors and mutators in one + std::set<Function_t*>& GetFunctions() { return funcs; } + std::set<Instruction_t*>& GetInstructions() { return insns; } + std::set<AddressID_t*>& GetAddresses() { return addrs; } + std::set<Relocation_t*>& GetRelocations() { return relocs; } // generate the spri rules into the output file, fout. void GenerateSPRI(std::ostream &fout); @@ -42,7 +43,7 @@ class FileIR_t : public BaseObj_t //removes the mapping for orig->assembly from the map. void ChangeRegistryKey(Instruction_t* orig, Instruction_t* updated); - private: + private: #define ASM_REG_MAX_SIZE 500000 typedef std::map<Instruction_t*,std::string> registry_type; @@ -52,29 +53,29 @@ class FileIR_t : public BaseObj_t registry_type assembly_registry; - void ReadFromDB(); //accesses DB + void ReadFromDB(); //accesses DB - std::set<Function_t*> funcs; - std::set<Instruction_t*> insns; - std::set<AddressID_t*> addrs; - std::set<Relocation_t*> relocs; - VariantID_t progid; + std::set<Function_t*> funcs; + std::set<Instruction_t*> insns; + std::set<AddressID_t*> addrs; + std::set<Relocation_t*> relocs; + VariantID_t progid; File_t* fileptr; std::map<db_id_t,AddressID_t*> ReadAddrsFromDB(); std::map<db_id_t,Function_t*> ReadFuncsFromDB - ( - std::map<db_id_t,AddressID_t*> &addrMap - ); + ( + std::map<db_id_t,AddressID_t*> &addrMap + ); 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,Function_t*> &funcMap, + std::map<db_id_t,AddressID_t*> &addrMap + ) ; void ReadRelocsFromDB - ( - std::map<db_id_t,Instruction_t*> &insnMap - ); + ( + std::map<db_id_t,Instruction_t*> &insnMap + ); diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp index 1146912989163003e94699ef288da2f765b17d85..19731f509c8f9bc33ecd5b0a9f73c28d37151b33 100644 --- a/libIRDB/src/core/fileir.cpp +++ b/libIRDB/src/core/fileir.cpp @@ -43,6 +43,29 @@ FileIR_t::FileIR_t(const VariantID_t &newprogid, File_t* fid) : BaseObj_t(NULL) ReadFromDB(); } + +FileIR_t::~FileIR_t() +{ + for(std::set<Function_t*>::const_iterator i=funcs.begin(); i!=funcs.end(); ++i) + { + delete *i; + } + + for(std::set<Instruction_t*>::const_iterator i=insns.begin(); i!=insns.end(); ++i) + { + delete *i; + } + + for(std::set<AddressID_t*>::const_iterator i=addrs.begin(); i!=addrs.end(); ++i) + { + delete *i; + } + + for(std::set<Relocation_t*>::const_iterator i=relocs.begin(); i!=relocs.end(); ++i) + { + delete *i; + } +} // DB operations void FileIR_t::ReadFromDB()