]> git.siccegge.de Git - frida/frida.git/commitdiff
properly preserve edges
authorChristoph Egger <siccegge@cs.fau.de>
Tue, 3 Jun 2014 17:03:19 +0000 (19:03 +0200)
committerChristoph Egger <siccegge@cs.fau.de>
Tue, 3 Jun 2014 17:03:19 +0000 (19:03 +0200)
The address behind the basic block is always another basic block. This
does not imply we should split this block.

src/disassembler/llvm/LLVMDisassembler.cxx

index 1067fcc1f02bebcefd01969fbd99142902a59c54..240e5c560952b35a1de3719aead77058775a7de8 100644 (file)
@@ -235,7 +235,7 @@ void LLVMDisassembler::disassemble() {
                uint64_t base_address;
                text_section.getAddress(base_address);
                uint64_t current_address = current_block->getStartAddress() - base_address;
-               while(current_block->getEndAddress() - base_address != current_address) {
+               while(current_block->getEndAddress() - base_address > current_address) {
                        MCInst inst;
                        std::string buf;
                        llvm::raw_string_ostream s(buf);
@@ -245,14 +245,17 @@ void LLVMDisassembler::disassemble() {
                                auto other = blocks.find(current_address + inst_size + base_address);
 
                                if (other != blocks.end()) {
-                                       LOG4CXX_DEBUG(logger, "Shortening block starting at "
-                                                                 << std::hex
-                                                                 << current_block->getStartAddress()
-                                                                 << " now ending at "
-                                                                 << other->first);
-                                       current_block->setEndAddress(current_address + inst_size + base_address);
-                                       current_block->setNextBlock(0, other->first);
-                                       current_block->setNextBlock(1, 0);
+                                       uint64_t endaddress = current_address + inst_size + base_address;
+                                       if (endaddress != current_block->getEndAddress()) {
+                                               LOG4CXX_DEBUG(logger, "Shortening block starting at "
+                                                                         << std::hex
+                                                                         << current_block->getStartAddress()
+                                                                         << " now ending at "
+                                                                         << other->first);
+                                               current_block->setEndAddress(endaddress);
+                                               current_block->setNextBlock(0, other->first);
+                                               current_block->setNextBlock(1, 0);
+                                       }
                                }
                        } else {
                                inst_size = 1;