From 6b2a5730a52cbd68613421b0a265a66b02720518 Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Tue, 3 Jun 2014 19:03:19 +0200 Subject: [PATCH] properly preserve edges 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 | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index 1067fcc..240e5c5 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -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; -- 2.39.5