Add Emulate and DumpEmulation to Instruction class.
Move InstructionLLVM out of DisassemblerLLVM class.
Add instruction emulation function calls to SBInstruction and SBInstructionList APIs.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@128956 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBInstruction.cpp b/source/API/SBInstruction.cpp
index 75683f6..ce90bbb 100644
--- a/source/API/SBInstruction.cpp
+++ b/source/API/SBInstruction.cpp
@@ -10,11 +10,18 @@
#include "lldb/API/SBInstruction.h"
#include "lldb/API/SBAddress.h"
+#include "lldb/API/SBFrame.h"
#include "lldb/API/SBInstruction.h"
#include "lldb/API/SBStream.h"
+#include "lldb/API/SBTarget.h"
+#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/Disassembler.h"
+#include "lldb/Core/EmulateInstruction.h"
#include "lldb/Core/StreamFile.h"
+#include "lldb/Target/ExecutionContext.h"
+#include "lldb/Target/StackFrame.h"
+#include "lldb/Target/Target.h"
using namespace lldb;
using namespace lldb_private;
@@ -107,3 +114,41 @@
m_opaque_sp->Dump (&out_stream, 0, true, false, NULL, false);
}
}
+
+bool
+SBInstruction::EmulateWithFrame (lldb::SBFrame &frame)
+{
+ if (m_opaque_sp && frame.get())
+ {
+ lldb_private::ExecutionContext exe_ctx;
+ frame->CalculateExecutionContext (exe_ctx);
+ lldb_private::Target *target = exe_ctx.target;
+ lldb_private::ArchSpec arch = target->GetArchitecture();
+
+ return m_opaque_sp->Emulate (arch,
+ (void *) frame.get(),
+ &lldb_private::EmulateInstruction::ReadMemoryFrame,
+ &lldb_private::EmulateInstruction::WriteMemoryFrame,
+ &lldb_private::EmulateInstruction::ReadRegisterFrame,
+ &lldb_private::EmulateInstruction::WriteRegisterFrame);
+ }
+ return false;
+}
+
+bool
+SBInstruction::DumpEmulation (const char *triple)
+{
+ if (m_opaque_sp && triple)
+ {
+ lldb_private::ArchSpec arch (triple);
+
+ return m_opaque_sp->Emulate (arch,
+ NULL,
+ &lldb_private::EmulateInstruction::ReadMemoryDefault,
+ &lldb_private::EmulateInstruction::WriteMemoryDefault,
+ &lldb_private::EmulateInstruction::ReadRegisterDefault,
+ &lldb_private::EmulateInstruction::WriteRegisterDefault);
+ }
+ return false;
+}
+
diff --git a/source/API/SBInstructionList.cpp b/source/API/SBInstructionList.cpp
index 312922f..c6fe572 100644
--- a/source/API/SBInstructionList.cpp
+++ b/source/API/SBInstructionList.cpp
@@ -109,3 +109,18 @@
}
+bool
+SBInstructionList::DumpEmulationForAllInstructions (const char *triple)
+{
+ if (m_opaque_sp)
+ {
+ size_t len = GetSize();
+ for (size_t i = 0; i < len; ++i)
+ {
+ if (!GetInstructionAtIndex((uint32_t) i).DumpEmulation (triple))
+ return false;
+ }
+ }
+ return true;
+}
+