--- /dev/null
+#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
+ }
+}