From 9c76611055e82a37e83bdbc45bd242c1662204e3 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Tue, 6 Mar 2012 22:24:44 +0000 Subject: [PATCH] Added the ability to disassembly "count" instructions given a SBAddress. This was done in SBTarget: lldb::SBInstructionList lldb::SBTarget::ReadInstructions (lldb::SBAddress base_addr, uint32_t count); Also cleaned up a few files in the LLDB.framework settings. llvm-svn: 152152 --- lldb/include/lldb/API/SBTarget.h | 3 +++ lldb/include/lldb/Core/Disassembler.h | 3 ++- lldb/lldb.xcodeproj/project.pbxproj | 4 ---- lldb/scripts/Python/interface/SBTarget.i | 3 +++ lldb/source/API/SBTarget.cpp | 29 ++++++++++++++++++++++++ lldb/source/Core/Disassembler.cpp | 5 ++-- lldb/source/Symbol/UnwindTable.cpp | 2 +- 7 files changed, 41 insertions(+), 8 deletions(-) diff --git a/lldb/include/lldb/API/SBTarget.h b/lldb/include/lldb/API/SBTarget.h index 2e5ed6d2a172..0c9af2ab5cf8 100644 --- a/lldb/include/lldb/API/SBTarget.h +++ b/lldb/include/lldb/API/SBTarget.h @@ -712,6 +712,9 @@ public: SBSourceManager GetSourceManager(); + lldb::SBInstructionList + ReadInstructions (lldb::SBAddress base_addr, uint32_t count); + lldb::SBInstructionList GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size); diff --git a/lldb/include/lldb/Core/Disassembler.h b/lldb/include/lldb/Core/Disassembler.h index e2e22b6f014f..6d09b9f8c1d8 100644 --- a/lldb/include/lldb/Core/Disassembler.h +++ b/lldb/include/lldb/Core/Disassembler.h @@ -258,7 +258,8 @@ public: const char *plugin_name, const Address &start, const void *bytes, - size_t length); + size_t length, + uint32_t num_instructions = UINT32_MAX); static bool Disassemble (Debugger &debugger, diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 90639536e53b..bf2f68838026 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -445,7 +445,6 @@ 49DA65031485C92A005FF180 /* AppleObjCSymbolVendor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA65021485C92A005FF180 /* AppleObjCSymbolVendor.cpp */; }; 4C6649A014EEE7F100B0316F /* StreamCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C66499F14EEE7F100B0316F /* StreamCallback.h */; }; 4C6649A314EEE81000B0316F /* StreamCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C6649A214EEE81000B0316F /* StreamCallback.cpp */; }; - 4CAA56131422D96A001FFA01 /* BreakpointResolverFileRegex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CAA56121422D96A001FFA01 /* BreakpointResolverFileRegex.h */; }; 4CAA56151422D986001FFA01 /* BreakpointResolverFileRegex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CAA56141422D986001FFA01 /* BreakpointResolverFileRegex.cpp */; }; 4CABA9E0134A8BCD00539BDD /* ValueObjectMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CABA9DF134A8BCD00539BDD /* ValueObjectMemory.cpp */; }; 4CCA644D13B40B82003BDF98 /* ItaniumABILanguageRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CCA643D13B40B82003BDF98 /* ItaniumABILanguageRuntime.cpp */; }; @@ -508,7 +507,6 @@ B2A58722143119810092BFBA /* SBWatchpoint.h in Headers */ = {isa = PBXBuildFile; fileRef = B2A58721143119810092BFBA /* SBWatchpoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; B2A58724143119D50092BFBA /* SBWatchpoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2A58723143119D50092BFBA /* SBWatchpoint.cpp */; }; ED236E0814F84F6800153F6F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDB919B414F6F10D008FF64B /* Security.framework */; }; - EDB919B314F6EC85008FF64B /* LauncherXPCService.h in Headers */ = {isa = PBXBuildFile; fileRef = EDB919B214F6EC85008FF64B /* LauncherXPCService.h */; }; EDB919B714F6F22D008FF64B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDB919B414F6F10D008FF64B /* Security.framework */; }; EDC6D4AA14E5C49E001B75F8 /* LauncherXPCService.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDC6D49414E5C15C001B75F8 /* LauncherXPCService.mm */; }; EDE274E414EDCE1F005B0F75 /* LauncherXPCService.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDC6D49414E5C15C001B75F8 /* LauncherXPCService.mm */; }; @@ -3103,10 +3101,8 @@ 26D265A2136B40EE002EEE45 /* SharingPtr.h in Headers */, 26D265BC136B4269002EEE45 /* lldb-public.h in Headers */, 4CF52AF51428291E0051E832 /* SBFileSpecList.h in Headers */, - 4CAA56131422D96A001FFA01 /* BreakpointResolverFileRegex.h in Headers */, 26B8283D142D01E9002DBC64 /* SBSection.h in Headers */, B2A58722143119810092BFBA /* SBWatchpoint.h in Headers */, - EDB919B314F6EC85008FF64B /* LauncherXPCService.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/lldb/scripts/Python/interface/SBTarget.i b/lldb/scripts/Python/interface/SBTarget.i index b6333d44d9f2..fccecd3b490e 100644 --- a/lldb/scripts/Python/interface/SBTarget.i +++ b/lldb/scripts/Python/interface/SBTarget.i @@ -668,6 +668,9 @@ public: lldb::SBBroadcaster GetBroadcaster () const; + lldb::SBInstructionList + ReadInstructions (lldb::SBAddress base_addr, uint32_t count); + lldb::SBInstructionList GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size); diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 8f8d75ec6db0..33b659b75487 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -1992,6 +1992,35 @@ SBTarget::GetSourceManager() return source_manager; } +lldb::SBInstructionList +SBTarget::ReadInstructions (lldb::SBAddress base_addr, uint32_t count) +{ + SBInstructionList sb_instructions; + + TargetSP target_sp(GetSP()); + if (target_sp) + { + Address *addr_ptr = base_addr.get(); + + if (addr_ptr) + { + DataBufferHeap data (target_sp->GetArchitecture().GetMaximumOpcodeByteSize() * count, 0); + bool prefer_file_cache = false; + lldb_private::Error error; + const size_t bytes_read = target_sp->ReadMemory(*addr_ptr, prefer_file_cache, data.GetBytes(), data.GetByteSize(), error); + sb_instructions.SetDisassembler (Disassembler::DisassembleBytes (target_sp->GetArchitecture(), + NULL, + *addr_ptr, + data.GetBytes(), + bytes_read, + count)); + } + } + + return sb_instructions; + +} + lldb::SBInstructionList SBTarget::GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size) { diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index 2be02f96ac08..1ab77bb8f149 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -240,7 +240,8 @@ Disassembler::DisassembleBytes const char *plugin_name, const Address &start, const void *bytes, - size_t length + size_t length, + uint32_t num_instructions ) { lldb::DisassemblerSP disasm_sp; @@ -256,7 +257,7 @@ Disassembler::DisassembleBytes (void)disasm_sp->DecodeInstructions (start, data, 0, - UINT32_MAX, + num_instructions, false); } } diff --git a/lldb/source/Symbol/UnwindTable.cpp b/lldb/source/Symbol/UnwindTable.cpp index 647fbb1f85aa..3a7350432e09 100644 --- a/lldb/source/Symbol/UnwindTable.cpp +++ b/lldb/source/Symbol/UnwindTable.cpp @@ -115,7 +115,7 @@ UnwindTable::Dump (Stream &s) const_iterator end = m_unwinds.end(); for (const_iterator pos = begin; pos != end; ++pos) { - s.Printf ("[%zu] 0x%16.16llx\n", std::distance (begin, pos), pos->first); + s.Printf ("[%u] 0x%16.16llx\n", (unsigned)std::distance (begin, pos), pos->first); } s.EOL(); }