[Lldb-commits] [lldb] r146611 - in /lldb/trunk: include/lldb/API/SBInstructionList.h include/lldb/API/SBTarget.h include/lldb/Core/Disassembler.h scripts/Python/interface/SBTarget.i scripts/Python/python-typemaps.swig source/API/SBTarget.cpp source/Core/Disassembler.cpp test/api/disassemble-raw-data/ test/api/disassemble-raw-data/TestDisassembleRawData.py
Sean Callanan
scallanan at apple.com
Wed Dec 14 15:49:37 PST 2011
Author: spyffe
Date: Wed Dec 14 17:49:37 2011
New Revision: 146611
URL: http://llvm.org/viewvc/llvm-project?rev=146611&view=rev
Log:
I have added a function to SBTarget that allows
clients to disassemble a series of raw bytes as
demonstrated by a new testcase.
In the future, this API will also allow clients
to provide a callback that adds comments for
addresses in the disassembly.
I also modified the SWIG harness to ensure that
Python ByteArrays work as well as strings as
sources of raw data.
Added:
lldb/trunk/test/api/disassemble-raw-data/
lldb/trunk/test/api/disassemble-raw-data/TestDisassembleRawData.py
Modified:
lldb/trunk/include/lldb/API/SBInstructionList.h
lldb/trunk/include/lldb/API/SBTarget.h
lldb/trunk/include/lldb/Core/Disassembler.h
lldb/trunk/scripts/Python/interface/SBTarget.i
lldb/trunk/scripts/Python/python-typemaps.swig
lldb/trunk/source/API/SBTarget.cpp
lldb/trunk/source/Core/Disassembler.cpp
Modified: lldb/trunk/include/lldb/API/SBInstructionList.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBInstructionList.h?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBInstructionList.h (original)
+++ lldb/trunk/include/lldb/API/SBInstructionList.h Wed Dec 14 17:49:37 2011
@@ -58,6 +58,7 @@
protected:
friend class SBFunction;
friend class SBSymbol;
+ friend class SBTarget;
void
SetDisassembler (const lldb::DisassemblerSP &opaque_sp);
Modified: lldb/trunk/include/lldb/API/SBTarget.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTarget.h?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTarget.h (original)
+++ lldb/trunk/include/lldb/API/SBTarget.h Wed Dec 14 17:49:37 2011
@@ -494,6 +494,12 @@
SBSourceManager
GetSourceManager();
+
+ lldb::SBInstructionList
+ GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size);
+
+ lldb::SBInstructionList
+ GetInstructions (lldb::addr_t base_addr, const void *buf, size_t size);
#ifndef SWIG
bool
Modified: lldb/trunk/include/lldb/Core/Disassembler.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Disassembler.h?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Disassembler.h (original)
+++ lldb/trunk/include/lldb/Core/Disassembler.h Wed Dec 14 17:49:37 2011
@@ -261,6 +261,13 @@
const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &disasm_range);
+
+ static lldb::DisassemblerSP
+ DisassembleBytes (const ArchSpec &arch,
+ const char *plugin_name,
+ const Address &start,
+ const void *bytes,
+ size_t length);
static bool
Disassemble (Debugger &debugger,
Modified: lldb/trunk/scripts/Python/interface/SBTarget.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBTarget.i?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBTarget.i (original)
+++ lldb/trunk/scripts/Python/interface/SBTarget.i Wed Dec 14 17:49:37 2011
@@ -470,7 +470,10 @@
lldb::SBBroadcaster
GetBroadcaster () const;
-
+
+ lldb::SBInstructionList
+ GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size);
+
bool
GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level);
};
Modified: lldb/trunk/scripts/Python/python-typemaps.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-typemaps.swig?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/python-typemaps.swig (original)
+++ lldb/trunk/scripts/Python/python-typemaps.swig Wed Dec 14 17:49:37 2011
@@ -69,30 +69,48 @@
// typemap for an outgoing buffer
// See also SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len).
%typemap(in) (const char *cstr, uint32_t cstr_len) {
- if (!PyString_Check($input)) {
- PyErr_SetString(PyExc_ValueError, "Expecting a string");
- return NULL;
+ if (PyString_Check($input)) {
+ $1 = (char *) PyString_AsString($input);
+ $2 = PyString_Size($input);
+ }
+ else if(PyByteArray_Check($input)) {
+ $1 = (char *) PyByteArray_AsString($input);
+ $2 = PyByteArray_Size($input);
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "Expecting a string");
+ return NULL;
}
- $1 = (char *) PyString_AsString($input);
- $2 = PyString_Size($input);
}
// Ditto for SBProcess::PutSTDIN(const char *src, size_t src_len).
%typemap(in) (const char *src, size_t src_len) {
- if (!PyString_Check($input)) {
- PyErr_SetString(PyExc_ValueError, "Expecting a string");
- return NULL;
+ if (PyString_Check($input)) {
+ $1 = (char *) PyString_AsString($input);
+ $2 = PyString_Size($input);
+ }
+ else if(PyByteArray_Check($input)) {
+ $1 = (char *) PyByteArray_AsString($input);
+ $2 = PyByteArray_Size($input);
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "Expecting a string");
+ return NULL;
}
- $1 = (char *) PyString_AsString($input);
- $2 = PyString_Size($input);
}
// And SBProcess::WriteMemory.
%typemap(in) (const void *buf, size_t size) {
- if (!PyString_Check($input)) {
- PyErr_SetString(PyExc_ValueError, "Expecting a string");
- return NULL;
+ if (PyString_Check($input)) {
+ $1 = (void *) PyString_AsString($input);
+ $2 = PyString_Size($input);
+ }
+ else if(PyByteArray_Check($input)) {
+ $1 = (void *) PyByteArray_AsString($input);
+ $2 = PyByteArray_Size($input);
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "Expecting a string");
+ return NULL;
}
- $1 = (void *) PyString_AsString($input);
- $2 = PyString_Size($input);
}
// typemap for an incoming buffer
Modified: lldb/trunk/source/API/SBTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTarget.cpp?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/source/API/SBTarget.cpp (original)
+++ lldb/trunk/source/API/SBTarget.cpp Wed Dec 14 17:49:37 2011
@@ -1285,6 +1285,33 @@
return source_manager;
}
+lldb::SBInstructionList
+SBTarget::GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size)
+{
+ SBInstructionList sb_instructions;
+
+ if (m_opaque_sp)
+ {
+ Address addr;
+
+ if (base_addr.get())
+ addr = *base_addr.get();
+
+ sb_instructions.SetDisassembler (Disassembler::DisassembleBytes (m_opaque_sp->GetArchitecture(),
+ NULL,
+ addr,
+ buf,
+ size));
+ }
+
+ return sb_instructions;
+}
+
+lldb::SBInstructionList
+SBTarget::GetInstructions (lldb::addr_t base_addr, const void *buf, size_t size)
+{
+ return GetInstructions (ResolveLoadAddress(base_addr), buf, size);
+}
SBError
SBTarget::SetSectionLoadAddress (lldb::SBSection section,
Modified: lldb/trunk/source/Core/Disassembler.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Disassembler.cpp?rev=146611&r1=146610&r2=146611&view=diff
==============================================================================
--- lldb/trunk/source/Core/Disassembler.cpp (original)
+++ lldb/trunk/source/Core/Disassembler.cpp Wed Dec 14 17:49:37 2011
@@ -230,6 +230,37 @@
return disasm_sp;
}
+lldb::DisassemblerSP
+Disassembler::DisassembleBytes
+(
+ const ArchSpec &arch,
+ const char *plugin_name,
+ const Address &start,
+ const void *bytes,
+ size_t length
+)
+{
+ lldb::DisassemblerSP disasm_sp;
+
+ if (bytes)
+ {
+ disasm_sp.reset(Disassembler::FindPlugin(arch, plugin_name));
+
+ if (disasm_sp)
+ {
+ DataExtractor data(bytes, length, arch.GetByteOrder(), arch.GetAddressByteSize());
+
+ (void)disasm_sp->DecodeInstructions (start,
+ data,
+ 0,
+ UINT32_MAX,
+ false);
+ }
+ }
+
+ return disasm_sp;
+}
+
bool
Disassembler::Disassemble
Added: lldb/trunk/test/api/disassemble-raw-data/TestDisassembleRawData.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/api/disassemble-raw-data/TestDisassembleRawData.py?rev=146611&view=auto
==============================================================================
--- lldb/trunk/test/api/disassemble-raw-data/TestDisassembleRawData.py (added)
+++ lldb/trunk/test/api/disassemble-raw-data/TestDisassembleRawData.py Wed Dec 14 17:49:37 2011
@@ -0,0 +1,40 @@
+"""
+Use lldb Python API to disassemble raw machine code bytes
+"""
+
+import os, time
+import re
+import unittest2
+import lldb, lldbutil
+from lldbtest import *
+
+class DisassembleRawDataTestCase(TestBase):
+
+ mydir = os.path.join("api", "disassemble-raw-data")
+
+ @python_api_test
+ def test_disassemble_raw_data(self):
+ """Test disassembling raw bytes with the API."""
+ self.disassemble_raw_data()
+
+ def disassemble_raw_data(self):
+ """Test disassembling raw bytes with the API."""
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTargetWithFileAndTargetTriple ("", "x86_64-apple-darwin")
+ self.assertTrue(target, VALID_TARGET)
+
+ raw_bytes = bytearray([0x48, 0x89, 0xe5])
+
+ insts = target.GetInstructions(lldb.SBAddress(), raw_bytes)
+
+ inst = insts.GetInstructionAtIndex(0)
+
+ self.assertTrue (inst.GetMnemonic(target) == "movq")
+ self.assertTrue (inst.GetOperands(target) == '%' + "rsp, " + '%' + "rbp")
+
+if __name__ == '__main__':
+ import atexit
+ lldb.SBDebugger.Initialize()
+ atexit.register(lambda: lldb.SBDebugger.Terminate())
+ unittest2.main()
More information about the lldb-commits
mailing list