X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=src%2Fdisassembler%2FInstructionReader.cxx;fp=src%2Fdisassembler%2FInstructionReader.cxx;h=8f8df91a77e5a2c9f59189728eb7bec8033c3866;hb=2a014774e29e324bc5b5f26143d0384351738ca1;hp=0000000000000000000000000000000000000000;hpb=c01de98bf70184c368bfe79777ca7e5d95649411;p=frida%2Ffrida.git diff --git a/src/disassembler/InstructionReader.cxx b/src/disassembler/InstructionReader.cxx new file mode 100644 index 0000000..8f8df91 --- /dev/null +++ b/src/disassembler/InstructionReader.cxx @@ -0,0 +1,27 @@ +#include "InstructionReader.hxx" + +InstructionReader::InstructionReader(const Target& target) + : _logger(log4cxx::Logger::getLogger("disassembler.Target")) + , _target(target) +{ + DisAsm.reset(_target.getTarget().createMCDisassembler(_target.getSubTargetInfo())); + if (!DisAsm) { + LOG4CXX_ERROR(_logger, "error: no disassembler for target " << _target.getTripleName()) + return; + } +} + +void InstructionReader::readInstruction(std::string& data, size_t& offset, Instruction& inst) { + llvm::MCInst instr; + llvm::StringRefMemoryObject memoryObject(data); + uint64_t size; + + if (DisAsm->getInstruction(instr, size, memoryObject, offset, + llvm::nulls(), llvm::nulls())) { + + } else { + LOG4CXX_WARN(_logger, "warning: invalid instruction encoding"); + if (size == 0) + size = 1; // skip illegible bytes + } +}