]> git.siccegge.de Git - frida/frida.git/blobdiff - src/disassembler.old/InstructionReader.cxx
Factor out llvm disassembler
[frida/frida.git] / src / disassembler.old / InstructionReader.cxx
diff --git a/src/disassembler.old/InstructionReader.cxx b/src/disassembler.old/InstructionReader.cxx
new file mode 100644 (file)
index 0000000..8f8df91
--- /dev/null
@@ -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
+    }
+}