InformationManager* manager,
ObjectFile* file)
: Disassembler()
- , logger(log4cxx::Logger::getLogger("LLVMDisassembler"))
+ , logger(log4cxx::Logger::getLogger("disassembler.LLVMDisassembler"))
, triple("unknown-unknown-unknown")
, manager(manager)
{
function->setName(name);
}
disassembleFunction(function);
- manager->finishFunction(function);
}
return function;
template <typename ELFT>
void LLVMDisassembler<ELFT>::disassembleFunction(Function* function) {
+ std::vector<uint64_t> called_functions;
std::stack<BasicBlock*> remaining_blocks;
/* TODO:
* Do all blocks get added properly? We should take care to remove
new_blocks.insert(std::make_pair(block->getStartAddress(), block));
function->addBasicBlock(block);
+ uint64_t base_address, size;
+ text_section.getAddress(base_address);
+ text_section.getSize(size);
+ LOG4CXX_DEBUG(logger, "Text section at " << std::hex << base_address << " with size " << size);
+
while (remaining_blocks.size()) {
BasicBlock * current_block = remaining_blocks.top();
remaining_blocks.pop();
<< current_block->getStartAddress());
uint64_t inst_size;
- uint64_t base_address;
- text_section.getAddress(base_address);
uint64_t current_address = current_block->getStartAddress() - base_address;
while(true) {
MCInst inst;
if (!MIA->isIndirectBranch(inst)) {
if (MIA->isCall(inst)) {
if (NULL == manager->getFunction(jmptarget))
- disassembleFunctionAt(jmptarget);
+ called_functions.push_back(jmptarget);
} else {
current_block->setNextBlock(0, jmptarget);
if (new_blocks.find(jmptarget) == new_blocks.end()) {
}
splitBlocks(function);
LOG4CXX_DEBUG(logger, "Finished function " << function->getName());
- manager->signal_new_function(function);
+ manager->finishFunction(function);
+ for (uint64_t address : called_functions)
+ disassembleFunctionAt(address);
}
template <typename ELFT>
text_section.getContents(bytes);
StringRefMemoryObject ref(bytes);
+ LOG4CXX_DEBUG(logger, "Splitting Blocks in Function " << function->getName());
// Split blocks where jumps are going inside the block
for (auto it = function->blocks().begin();
it != function->blocks().end();
++it) {
BasicBlock * current_block = it->second;
+ if (current_block->getEndAddress() == 0) {
+ LOG4CXX_ERROR(logger, "UNFINISHED BLOCK " << std::hex << current_block->getStartAddress());
+ break;
+ }
uint64_t inst_size;
uint64_t base_address;
text_section.getAddress(base_address);