X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;fp=src%2Fdisassembler%2Fllvm%2FLLVMDisassembler.cxx;h=1f1cdff1d17670d6b87b900523ef33b7f85bbc6a;hp=875a474b239c1d69607b55f60c4b1d564fa5d048;hb=f9ae4391568cfcbf4e6de0475bddcdd68e9b31d2;hpb=b702753fa541d2ee4bb1cb83267a8b76b99330ac diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index 875a474..1f1cdff 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -206,6 +206,7 @@ Function* LLVMDisassembler::disassembleFunctionAt(uint64_t address, const template void LLVMDisassembler::disassembleFunction(Function* function) { + std::vector called_functions; std::stack remaining_blocks; /* TODO: * Do all blocks get added properly? We should take care to remove @@ -249,7 +250,7 @@ void LLVMDisassembler::disassembleFunction(Function* function) { 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()) { @@ -298,6 +299,8 @@ void LLVMDisassembler::disassembleFunction(Function* function) { splitBlocks(function); LOG4CXX_DEBUG(logger, "Finished function " << function->getName()); manager->finishFunction(function); + for (uint64_t address : called_functions) + disassembleFunctionAt(address); } template