template <typename ELFT>
void LLVMDisassembler<ELFT>::printEachInstruction(uint64_t start, uint64_t end,
- std::function<void (uint8_t*, size_t,
- const std::string&)> fun) {
+ std::function<void (uint8_t*, size_t,
+ const std::string&,
+ const std::string&)> fun) {
SectionRef text_section = sections[".text"];
uint64_t base_address;
text_section.getAddress(base_address);
ref.readBytes(current_address, inst_size, bytes);
uint64_t jmptarget;
+ std::string ref("");
+ IP->printInst(&inst, s, "");
if (MIA->evaluateBranch(inst, current_address, inst_size, jmptarget)) {
std::stringstream stream;
+ if (MIA->isCall(inst))
+ stream << "function:";
+ else
+ stream << "block:";
+
stream << std::hex << (base_address + jmptarget);
- IP->printInst(&inst, s, stream.str());
- } else
- IP->printInst(&inst, s, "");
+ ref = stream.str();
+ }
+
- fun(bytes, inst_size, s.str());
+ fun(bytes, inst_size, s.str(), ref);
} else {
LOG4CXX_WARN(logger, "Invalid byte at" << std::hex << current_address + base_address);
- fun(NULL, 0, "Invalid Byte");
+ fun(NULL, 0, "Invalid Byte", "");
inst_size = 1;
}