]> git.siccegge.de Git - frida/frida.git/blobdiff - src/disassembler/llvm/LLVMDisassembler.cxx
Properly create and export BasicBlock linking
[frida/frida.git] / src / disassembler / llvm / LLVMDisassembler.cxx
index 3494b79bd8a370814d35eba28fec53db0e1543d6..a8c2867f50784255a27246bb10be5db9312d2e87 100644 (file)
@@ -110,7 +110,20 @@ LLVMDisassembler::LLVMDisassembler(const std::string& filename)
     disassemble();
 }
 
+LLVMDisassembler::~LLVMDisassembler() {
+       std::for_each(functions.begin(), functions.end(),
+                                 [](std::pair<uint64_t,LLVMFunction*> it) {
+                                         delete it.second;
+                                 });
+       std::for_each(blocks.begin(), blocks.end(),
+                                 [](std::pair<uint64_t, LLVMBasicBlock*> it) {
+                                         delete it.second;
+                                 });
+}
 
+/*
+ * TODO: If we jump into some Basic Block we need to split it there into two
+ */
 void LLVMDisassembler::disassemble() {
     std::stack<LLVMFunction*> remaining_functions;
     std::stack<LLVMBasicBlock*> remaining_blocks;
@@ -121,9 +134,6 @@ void LLVMDisassembler::disassemble() {
                bool contains;
                SymbolRef::Type symbol_type;
 
-/*
- * TODO: If we jump into some Basic Block we need to split it there into two
- */
 
                if (text_section.containsSymbol(x->second, contains) || !contains)
                        continue;
@@ -204,6 +214,7 @@ void LLVMDisassembler::disassemble() {
                                                                if (blocks.find(jmptarget) == blocks.end()) {
                                                                        LLVMBasicBlock * block = new LLVMBasicBlock(jmptarget);
                                                                        blocks.insert(std::make_pair(block->getStartAddress(), block));
+                                                                       current_block->setNextBlock(0, block->getStartAddress());
                                                                        remaining_blocks.push(block);
                                                                }
                                 if (MIA->isConditionalBranch(inst)) {
@@ -211,7 +222,9 @@ void LLVMDisassembler::disassemble() {
                                                                        if (blocks.find(jmptarget) == blocks.end()) {
                                                                                LLVMBasicBlock * block = new LLVMBasicBlock(jmptarget);
                                                                                blocks.insert(std::make_pair(block->getStartAddress(), block));
+                                                                               current_block->setNextBlock(1, block->getStartAddress());
                                                                                remaining_blocks.push(new LLVMBasicBlock(jmptarget));
+                                                                       }
                                 }
                             }
                         }
@@ -225,7 +238,6 @@ void LLVMDisassembler::disassemble() {
                     current_block->setEndAddress(current_address + base_address);
                     LOG4CXX_DEBUG(logger, "Finished Block at " << std::hex << 
                                                                  current_block->getEndAddress());
-                                                                       }
                     break;
                 }
                 current_address += inst_size;
@@ -270,9 +282,3 @@ void LLVMDisassembler::forEachFunction(std::function<void (uint64_t, Function*)>
                                          callback(x.first, x.second);
                                  });
 }
-
-
-
-void LLVMDisassembler::generateControlFlowGraph(uint64_t address) {
-
-}