[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