summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/Disassembler.h25
-rw-r--r--lldb/include/lldb/Core/Opcode.h3
-rw-r--r--lldb/lldb.xcodeproj/project.pbxproj15
-rw-r--r--lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme7
-rw-r--r--lldb/source/API/SBFunction.cpp1
-rw-r--r--lldb/source/API/SBInstruction.cpp6
-rw-r--r--lldb/source/API/SBInstructionList.cpp2
-rw-r--r--lldb/source/API/SBSymbol.cpp1
-rw-r--r--lldb/source/Commands/CommandObjectDisassemble.cpp33
-rw-r--r--lldb/source/Commands/CommandObjectDisassemble.h10
-rw-r--r--lldb/source/Core/Disassembler.cpp141
-rw-r--r--lldb/source/Core/Opcode.cpp48
-rw-r--r--lldb/source/Expression/ClangExpressionParser.cpp8
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp56
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h12
-rw-r--r--lldb/source/Target/StackFrame.cpp1
-rw-r--r--lldb/source/Target/ThreadPlanTracer.cpp5
17 files changed, 237 insertions, 137 deletions
diff --git a/lldb/include/lldb/Core/Disassembler.h b/lldb/include/lldb/Core/Disassembler.h
index 67d4337c1ab..836c6953739 100644
--- a/lldb/include/lldb/Core/Disassembler.h
+++ b/lldb/include/lldb/Core/Disassembler.h
@@ -27,8 +27,7 @@ namespace lldb_private {
class Instruction
{
public:
- Instruction (const Address &addr);
- Instruction (const Address &addr, const Opcode &opcode);
+ Instruction (const Address &address);
virtual
~Instruction();
@@ -36,24 +35,19 @@ public:
const Address &
GetAddress () const
{
- return m_addr;
+ return m_address;
}
void
SetAddress (const Address &addr)
{
- m_addr = addr;
+ m_address = addr;
}
- virtual size_t
- GetByteSize() const = 0;
-
-
virtual void
Dump (Stream *s,
bool show_address,
- const DataExtractor *bytes,
- uint32_t bytes_offset,
+ bool show_bytes,
const ExecutionContext *exe_ctx,
bool raw) = 0;
@@ -72,7 +66,7 @@ public:
}
protected:
- Address m_addr; // The section offset address of this instruction
+ Address m_address; // The section offset address of this instruction
Opcode m_opcode; // The opcode for this instruction
};
@@ -110,16 +104,18 @@ public:
static Disassembler*
- FindPlugin (const ArchSpec &arch);
+ FindPlugin (const ArchSpec &arch, const char *plugin_name);
static lldb::DisassemblerSP
DisassembleRange (const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &disasm_range);
static bool
Disassemble (Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &range,
uint32_t num_instructions,
@@ -131,6 +127,7 @@ public:
static bool
Disassemble (Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const Address &start,
uint32_t num_instructions,
@@ -142,6 +139,7 @@ public:
static size_t
Disassemble (Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
SymbolContextList &sc_list,
uint32_t num_instructions,
@@ -153,6 +151,7 @@ public:
static bool
Disassemble (Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const ConstString &name,
Module *module,
@@ -165,6 +164,7 @@ public:
static bool
Disassemble (Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
uint32_t num_instructions,
uint32_t num_mixed_context_lines,
@@ -182,7 +182,6 @@ public:
static bool
PrintInstructions (Disassembler *disasm_ptr,
- DataExtractor &data,
Debugger &debugger,
const ArchSpec &arch,
const ExecutionContext &exe_ctx,
diff --git a/lldb/include/lldb/Core/Opcode.h b/lldb/include/lldb/Core/Opcode.h
index 9b8fa254c49..26166e99516 100644
--- a/lldb/include/lldb/Core/Opcode.h
+++ b/lldb/include/lldb/Core/Opcode.h
@@ -171,6 +171,9 @@ namespace lldb_private {
}
}
+ int
+ Dump (Stream *s, uint32_t min_byte_width);
+
const void *
GetOpcodeBytes () const
{
diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj
index 79b189017c9..031a15f4f3e 100644
--- a/lldb/lldb.xcodeproj/project.pbxproj
+++ b/lldb/lldb.xcodeproj/project.pbxproj
@@ -3371,6 +3371,10 @@
CURRENT_PROJECT_VERSION = 46;
DYLIB_CURRENT_VERSION = 46;
EXECUTABLE_EXTENSION = a;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"",
+ );
GCC_ENABLE_OBJC_GC = supported;
GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -3395,7 +3399,6 @@
);
OTHER_LDFLAGS = "-lllvmclang";
PRODUCT_NAME = "lib$(TARGET_NAME)";
- SDKROOT = macosx;
STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/source $(SRCROOT)/source/Plugins/Process/Utility $(SRCROOT)/include $(SRCROOT)/source/Host/macosx/cfcpp $(SRCROOT)/llvm/include $(SRCROOT)/llvm/tools/clang/include $(LLVM_BUILD_DIR)/llvm/include $(LLVM_BUILD_DIR)/llvm/tools/clang/include";
VERSIONING_SYSTEM = "apple-generic";
@@ -3411,6 +3414,10 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DYLIB_CURRENT_VERSION = 46;
EXECUTABLE_EXTENSION = a;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"",
+ );
GCC_ENABLE_OBJC_GC = supported;
GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -3435,7 +3442,6 @@
);
OTHER_LDFLAGS = "-lllvmclang";
PRODUCT_NAME = "lib$(TARGET_NAME)";
- SDKROOT = macosx;
STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/source $(SRCROOT)/source/Plugins/Process/Utility $(SRCROOT)/include $(SRCROOT)/source/Host/macosx/cfcpp $(SRCROOT)/llvm/include $(SRCROOT)/llvm/tools/clang/include $(LLVM_BUILD_DIR)/llvm/include $(LLVM_BUILD_DIR)/llvm/tools/clang/include";
VERSIONING_SYSTEM = "apple-generic";
@@ -3451,6 +3457,10 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DYLIB_CURRENT_VERSION = 46;
EXECUTABLE_EXTENSION = a;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"",
+ );
GCC_ENABLE_OBJC_GC = supported;
GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -3475,7 +3485,6 @@
);
OTHER_LDFLAGS = "-lllvmclang";
PRODUCT_NAME = "lib$(TARGET_NAME)";
- SDKROOT = macosx;
STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/source $(SRCROOT)/source/Plugins/Process/Utility $(SRCROOT)/include $(SRCROOT)/source/Host/macosx/cfcpp $(SRCROOT)/llvm/include $(SRCROOT)/llvm/tools/clang/include $(LLVM_BUILD_DIR)/llvm/include $(LLVM_BUILD_DIR)/llvm/tools/clang/include";
VERSIONING_SYSTEM = "apple-generic";
diff --git a/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme b/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
index 30249c7be2c..ae447b9d5d2 100644
--- a/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
+++ b/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- version = "1.3">
+ version = "1.5">
<BuildAction
parallelizeBuildables = "NO"
buildImplicitDependencies = "YES">
@@ -76,7 +76,7 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
displayScaleIsEnabled = "NO"
displayScale = "1.00"
- launchStyle = "1"
+ launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug">
<BuildableProductRunnable>
@@ -189,4 +189,7 @@
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
+ <InstallAction
+ buildConfiguration = "Debug">
+ </InstallAction>
</Scheme>
diff --git a/lldb/source/API/SBFunction.cpp b/lldb/source/API/SBFunction.cpp
index c8ce1c3874f..de9f6ae8a86 100644
--- a/lldb/source/API/SBFunction.cpp
+++ b/lldb/source/API/SBFunction.cpp
@@ -137,6 +137,7 @@ SBFunction::GetInstructions (SBTarget target)
if (module)
{
sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(),
+ NULL,
exe_ctx,
m_opaque_ptr->GetAddressRange()));
}
diff --git a/lldb/source/API/SBInstruction.cpp b/lldb/source/API/SBInstruction.cpp
index df3a7535cbb..48b2e7399ff 100644
--- a/lldb/source/API/SBInstruction.cpp
+++ b/lldb/source/API/SBInstruction.cpp
@@ -64,7 +64,7 @@ size_t
SBInstruction::GetByteSize ()
{
if (m_opaque_sp)
- return m_opaque_sp->GetByteSize();
+ return m_opaque_sp->GetOpcode().GetByteSize();
return 0;
}
@@ -89,7 +89,7 @@ SBInstruction::GetDescription (lldb::SBStream &s)
{
// Use the "ref()" instead of the "get()" accessor in case the SBStream
// didn't have a stream already created, one will get created...
- m_opaque_sp->Dump (&s.ref(), true, NULL, 0, NULL, false);
+ m_opaque_sp->Dump (&s.ref(), true, false, NULL, false);
return true;
}
return false;
@@ -104,6 +104,6 @@ SBInstruction::Print (FILE *out)
if (m_opaque_sp)
{
StreamFile out_stream (out, false);
- m_opaque_sp->Dump (&out_stream, true, NULL, 0, NULL, false);
+ m_opaque_sp->Dump (&out_stream, true, false, NULL, false);
}
}
diff --git a/lldb/source/API/SBInstructionList.cpp b/lldb/source/API/SBInstructionList.cpp
index ce70d95b0ad..37c7f874e19 100644
--- a/lldb/source/API/SBInstructionList.cpp
+++ b/lldb/source/API/SBInstructionList.cpp
@@ -98,7 +98,7 @@ SBInstructionList::GetDescription (lldb::SBStream &description)
Instruction *inst = m_opaque_sp->GetInstructionList().GetInstructionAtIndex (i).get();
if (inst == NULL)
break;
- inst->Dump (&sref, true, NULL, 0, NULL, false);
+ inst->Dump (&sref, true, false, NULL, false);
sref.EOL();
}
return true;
diff --git a/lldb/source/API/SBSymbol.cpp b/lldb/source/API/SBSymbol.cpp
index 96a5a21ebde..ef8af558c5d 100644
--- a/lldb/source/API/SBSymbol.cpp
+++ b/lldb/source/API/SBSymbol.cpp
@@ -134,6 +134,7 @@ SBSymbol::GetInstructions (SBTarget target)
if (module)
{
sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture (),
+ NULL,
exe_ctx,
*symbol_range));
}
diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp
index 26752b86fbd..c3b52cfeab8 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.cpp
+++ b/lldb/source/Commands/CommandObjectDisassemble.cpp
@@ -39,7 +39,8 @@ CommandObjectDisassemble::CommandOptions::CommandOptions () :
m_func_name(),
m_start_addr(),
m_end_addr (),
- m_at_pc (false)
+ m_at_pc (false),
+ m_plugin_name ()
{
ResetOptionValues();
}
@@ -97,13 +98,17 @@ CommandObjectDisassemble::CommandOptions::SetOptionValue (int option_idx, const
break;
case 'n':
- m_func_name = option_arg;
+ m_func_name.assign (option_arg);
break;
case 'p':
m_at_pc = true;
break;
+ case 'P':
+ m_plugin_name.assign (option_arg);
+ break;
+
case 'r':
raw = true;
break;
@@ -134,6 +139,7 @@ CommandObjectDisassemble::CommandOptions::ResetOptionValues ()
m_start_addr = LLDB_INVALID_ADDRESS;
m_end_addr = LLDB_INVALID_ADDRESS;
raw = false;
+ m_plugin_name.clear();
}
const OptionDefinition*
@@ -145,10 +151,11 @@ CommandObjectDisassemble::CommandOptions::GetDefinitions ()
OptionDefinition
CommandObjectDisassemble::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_ALL, false, "bytes", 'b', no_argument, NULL, 0, eArgTypeNone, "Show opcode bytes when disassembling."},
-{ LLDB_OPT_SET_ALL, false, "context", 'x', required_argument, NULL, 0, eArgTypeNumLines, "Number of context lines of source to show."},
-{ LLDB_OPT_SET_ALL, false, "mixed", 'm', no_argument, NULL, 0, eArgTypeNone, "Enable mixed source and assembly display."},
-{ LLDB_OPT_SET_ALL, false, "raw", 'r', no_argument, NULL, 0, eArgTypeNone, "Print raw disassembly with no symbol information."},
+{ LLDB_OPT_SET_ALL, false, "bytes", 'b', no_argument, NULL, 0, eArgTypeNone, "Show opcode bytes when disassembling."},
+{ LLDB_OPT_SET_ALL, false, "context", 'x', required_argument, NULL, 0, eArgTypeNumLines,"Number of context lines of source to show."},
+{ LLDB_OPT_SET_ALL, false, "mixed", 'm', no_argument, NULL, 0, eArgTypeNone, "Enable mixed source and assembly display."},
+{ LLDB_OPT_SET_ALL, false, "raw", 'r', no_argument, NULL, 0, eArgTypeNone, "Print raw disassembly with no symbol information."},
+{ LLDB_OPT_SET_ALL, false, "plugin", 'P', required_argument, NULL, 0, eArgTypePlugin, "Name of the disassembler plugin you want to use."},
{ LLDB_OPT_SET_1, true, "start-address", 's', required_argument, NULL, 0, eArgTypeStartAddress, "Address at which to start disassembling."},
{ LLDB_OPT_SET_1, false, "end-address", 'e', required_argument, NULL, 0, eArgTypeEndAddress, "Address at which to end disassembling."},
@@ -209,11 +216,18 @@ CommandObjectDisassemble::Execute
return false;
}
- Disassembler *disassembler = Disassembler::FindPlugin(arch);
+ const char *plugin_name = m_options.GetPluginName ();
+ Disassembler *disassembler = Disassembler::FindPlugin(arch, plugin_name);
if (disassembler == NULL)
{
- result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture.\n", arch.GetArchitectureName());
+ if (plugin_name)
+ result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture named '%s'.\n",
+ arch.GetArchitectureName(),
+ plugin_name);
+ else
+ result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture.\n",
+ arch.GetArchitectureName());
result.SetStatus (eReturnStatusFailed);
return false;
}
@@ -242,6 +256,7 @@ CommandObjectDisassemble::Execute
if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
arch,
+ plugin_name,
exe_ctx,
name,
NULL, // Module *
@@ -323,6 +338,7 @@ CommandObjectDisassemble::Execute
if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
arch,
+ plugin_name,
exe_ctx,
start_addr,
m_options.num_instructions,
@@ -372,6 +388,7 @@ CommandObjectDisassemble::Execute
if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
arch,
+ plugin_name,
exe_ctx,
range,
m_options.num_instructions,
diff --git a/lldb/source/Commands/CommandObjectDisassemble.h b/lldb/source/Commands/CommandObjectDisassemble.h
index 4794ee5fd71..91812af3187 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.h
+++ b/lldb/source/Commands/CommandObjectDisassemble.h
@@ -44,6 +44,15 @@ public:
const OptionDefinition*
GetDefinitions ();
+ const char *
+ GetPluginName ()
+ {
+ if (m_plugin_name.empty())
+ return NULL;
+ return m_plugin_name.c_str();
+ }
+
+
bool show_mixed; // Show mixed source/assembly
bool show_bytes;
uint32_t num_lines_context;
@@ -53,6 +62,7 @@ public:
lldb::addr_t m_start_addr;
lldb::addr_t m_end_addr;
bool m_at_pc;
+ std::string m_plugin_name;
static OptionDefinition g_option_table[];
};
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index efd70815f10..9f3897752fe 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -34,20 +34,36 @@ using namespace lldb_private;
Disassembler*
-Disassembler::FindPlugin (const ArchSpec &arch)
+Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name)
{
Timer scoped_timer (__PRETTY_FUNCTION__,
- "Disassembler::FindPlugin (arch = %s)",
- arch.GetArchitectureName());
+ "Disassembler::FindPlugin (arch = %s, plugin_name = %s)",
+ arch.GetArchitectureName(),
+ plugin_name);
std::auto_ptr<Disassembler> disassembler_ap;
- DisassemblerCreateInstance create_callback;
- for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx)
+ DisassemblerCreateInstance create_callback = NULL;
+
+ if (plugin_name)
+ {
+ create_callback = PluginManager::GetDisassemblerCreateCallbackForPluginName (plugin_name);
+ if (create_callback)
+ {
+ disassembler_ap.reset (create_callback(arch));
+
+ if (disassembler_ap.get())
+ return disassembler_ap.release();
+ }
+ }
+ else
{
- disassembler_ap.reset (create_callback(arch));
+ for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx)
+ {
+ disassembler_ap.reset (create_callback(arch));
- if (disassembler_ap.get())
- return disassembler_ap.release();
+ if (disassembler_ap.get())
+ return disassembler_ap.release();
+ }
}
return NULL;
}
@@ -59,6 +75,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
SymbolContextList &sc_list,
uint32_t num_instructions,
@@ -79,8 +96,16 @@ Disassembler::Disassemble
break;
if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
{
- if (Disassemble (debugger, arch, exe_ctx, range, num_instructions,
- num_mixed_context_lines, show_bytes, raw, strm))
+ if (Disassemble (debugger,
+ arch,
+ plugin_name,
+ exe_ctx,
+ range,
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm))
{
++success_count;
strm.EOL();
@@ -95,6 +120,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const ConstString &name,
Module *module,
@@ -137,6 +163,7 @@ Disassembler::Disassemble
{
return Disassemble (debugger,
arch,
+ plugin_name,
exe_ctx,
sc_list,
num_instructions,
@@ -153,6 +180,7 @@ lldb::DisassemblerSP
Disassembler::DisassembleRange
(
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &range
)
@@ -160,7 +188,7 @@ Disassembler::DisassembleRange
lldb::DisassemblerSP disasm_sp;
if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid())
{
- disasm_sp.reset (Disassembler::FindPlugin(arch));
+ disasm_sp.reset (Disassembler::FindPlugin(arch, plugin_name));
if (disasm_sp)
{
@@ -179,6 +207,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &disasm_range,
uint32_t num_instructions,
@@ -190,7 +219,7 @@ Disassembler::Disassemble
{
if (disasm_range.GetByteSize())
{
- std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch));
+ std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch, plugin_name));
if (disasm_ap.get())
{
@@ -216,23 +245,18 @@ Disassembler::Disassemble
DataExtractor data;
size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, range, data);
if (bytes_disassembled == 0)
- {
return false;
- }
- else
- {
- return PrintInstructions (disasm_ap.get(),
- data,
- debugger,
- arch,
- exe_ctx,
- disasm_range.GetBaseAddress(),
- num_instructions,
- num_mixed_context_lines,
- show_bytes,
- raw,
- strm);
- }
+
+ return PrintInstructions (disasm_ap.get(),
+ debugger,
+ arch,
+ exe_ctx,
+ disasm_range.GetBaseAddress(),
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm);
}
}
return false;
@@ -243,6 +267,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const Address &start_address,
uint32_t num_instructions,
@@ -254,7 +279,7 @@ Disassembler::Disassemble
{
if (num_instructions > 0)
{
- std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch));
+ std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch, plugin_name));
Address addr = start_address;
if (disasm_ap.get())
@@ -279,23 +304,17 @@ Disassembler::Disassemble
DataExtractor data;
size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, addr, num_instructions, data);
if (bytes_disassembled == 0)
- {
return false;
- }
- else
- {
- return PrintInstructions (disasm_ap.get(),
- data,
- debugger,
- arch,
- exe_ctx,
- addr,
- num_instructions,
- num_mixed_context_lines,
- show_bytes,
- raw,
- strm);
- }
+ return PrintInstructions (disasm_ap.get(),
+ debugger,
+ arch,
+ exe_ctx,
+ addr,
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm);
}
}
return false;
@@ -305,7 +324,6 @@ bool
Disassembler::PrintInstructions
(
Disassembler *disasm_ptr,
- DataExtractor &data,
Debugger &debugger,
const ArchSpec &arch,
const ExecutionContext &exe_ctx,
@@ -407,12 +425,10 @@ Disassembler::PrintInstructions
if (num_mixed_context_lines)
strm.IndentMore ();
strm.Indent();
- size_t inst_byte_size = inst->GetByteSize();
- inst->Dump(&strm, true, show_bytes ? &data : NULL, offset, &exe_ctx, raw);
+ inst->Dump(&strm, true, show_bytes, &exe_ctx, raw);
strm.EOL();
- offset += inst_byte_size;
- addr.SetOffset (addr.GetOffset() + inst_byte_size);
+ addr.Slide(inst->GetOpcode().GetByteSize());
if (num_mixed_context_lines)
strm.IndentLess ();
@@ -434,6 +450,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
uint32_t num_instructions,
uint32_t num_mixed_context_lines,
@@ -463,19 +480,21 @@ Disassembler::Disassemble
range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
}
- return Disassemble(debugger, arch, exe_ctx, range, num_instructions, num_mixed_context_lines, show_bytes, raw, strm);
+ return Disassemble (debugger,
+ arch,
+ plugin_name,
+ exe_ctx,
+ range,
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm);
}
-Instruction::Instruction(const Address &addr) :
- m_addr (addr)
-{
- ::memset (&m_opcode, 0, sizeof (m_opcode));
-}
-
-
-Instruction::Instruction(const Address &addr, const Opcode &opcode) :
- m_addr (addr),
- m_opcode (opcode)
+Instruction::Instruction(const Address &address) :
+ m_address (address),
+ m_opcode()
{
}
diff --git a/lldb/source/Core/Opcode.cpp b/lldb/source/Core/Opcode.cpp
index cb0b4d038b6..d33c80c76de 100644
--- a/lldb/source/Core/Opcode.cpp
+++ b/lldb/source/Core/Opcode.cpp
@@ -13,6 +13,52 @@
// C++ Includes
// Other libraries and framework includes
// Project includes
+#include "lldb/Core/Stream.h"
using namespace lldb;
-using namespace lldb_private; \ No newline at end of file
+using namespace lldb_private;
+
+
+int
+Opcode::Dump (Stream *s, uint32_t min_byte_width)
+{
+ int bytes_written = 0;
+ switch (m_type)
+ {
+ case Opcode::eTypeInvalid:
+ bytes_written = s->PutCString ("<invalid>");
+ break;
+ case Opcode::eType8:
+ bytes_written = s->Printf ("0x%2.2x", m_data.inst8);
+ break;
+ case Opcode::eType16:
+ bytes_written = s->Printf ("0x%4.4x", m_data.inst16);
+ break;
+
+ case Opcode::eType32:
+ bytes_written = s->Printf ("0x%8.8x", m_data.inst32);
+ break;
+
+ case Opcode::eType64:
+ bytes_written = s->Printf ("0x%16.16llx", m_data.inst64);
+ break;
+
+ case Opcode::eTypeBytes:
+ {
+ for (uint32_t i=0; i<m_data.inst.length; ++i)
+ {
+ if (i > 0)
+ s->PutChar (' ');
+ bytes_written += s->Printf ("%2.2x", m_data.inst.bytes[i]);
+ }
+ }
+ break;
+ }
+
+ // Add spaces to make sure bytes dispay comes out even in case opcodes
+ // aren't all the same size
+ if (bytes_written < min_byte_width)
+ bytes_written = s->Printf ("%*s", min_byte_width - bytes_written, "");
+ return bytes_written;
+}
+
diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp
index e9e49e3aff3..12a4472957e 100644
--- a/lldb/source/Expression/ClangExpressionParser.cpp
+++ b/lldb/source/Expression/ClangExpressionParser.cpp
@@ -708,7 +708,7 @@ ClangExpressionParser::DisassembleFunction (Stream &stream, ExecutionContext &ex
ArchSpec arch(exe_ctx.target->GetArchitecture());
- Disassembler *disassembler = Disassembler::FindPlugin(arch);
+ Disassembler *disassembler = Disassembler::FindPlugin(arch, NULL);
if (disassembler == NULL)
{
@@ -743,8 +743,6 @@ ClangExpressionParser::DisassembleFunction (Stream &stream, ExecutionContext &ex
InstructionList &instruction_list = disassembler->GetInstructionList();
- uint32_t bytes_offset = 0;
-
for (uint32_t instruction_index = 0, num_instructions = instruction_list.GetSize();
instruction_index < num_instructions;
++instruction_index)
@@ -752,12 +750,10 @@ ClangExpressionParser::DisassembleFunction (Stream &stream, ExecutionContext &ex
Instruction *instruction = instruction_list.GetInstructionAtIndex(instruction_index).get();
instruction->Dump (&stream,
true,
- &extractor,
- bytes_offset,
+ true,
&exe_ctx,
true);
stream.PutChar('\n');
- bytes_offset += instruction->GetByteSize();
}
return ret;
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
index 9835dea6675..9c55042640f 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
@@ -100,8 +100,7 @@ DisassemblerLLVM::InstructionLLVM::Dump
(
Stream *s,
bool show_address,
- const DataExtractor *bytes,
- uint32_t bytes_offset,
+ bool show_bytes,
const lldb_private::ExecutionContext* exe_ctx,
bool raw
)
@@ -125,18 +124,20 @@ DisassemblerLLVM::InstructionLLVM::Dump
}
// If we are supposed to show bytes, "bytes" will be non-NULL.
- if (bytes)
+ if (show_bytes)
{
- uint32_t bytes_dumped = bytes->Dump(s, bytes_offset, eFormatBytes, 1, EDInstByteSize(m_inst), UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0) - bytes_offset;
- // Allow for 15 bytes of opcodes since this is the max for x86_64.
- // TOOD: We need to taylor this better for different architectures. For
- // ARM we would want to show 16 bit opcodes for Thumb as properly byte
- // swapped uint16_t values, or 32 bit values swapped values for ARM.
- const uint32_t default_num_opcode_bytes = 15;
- if (bytes_dumped * 3 < (default_num_opcode_bytes*3))
+ if (m_opcode.GetType() == Opcode::eTypeBytes)
{
- uint32_t indent_level = (default_num_opcode_bytes*3) - (bytes_dumped * 3) + 1;
- s->Printf("%*.*s", indent_level, indent_level, "");
+ // x86_64 and i386 are the only ones that use bytes right now so
+ // pad out the byte dump to be able to always show 15 bytes (3 chars each)
+ // plus a space
+ m_opcode.Dump (s, 15 * 3 + 1);
+ }
+ else
+ {
+ // Else, we have ARM which can show up to a uint32_t 0x00000000 (10 spaces)
+ // plus two for padding...
+ m_opcode.Dump (s, 12);
}
}
@@ -328,12 +329,6 @@ DisassemblerLLVM::InstructionLLVM::DoesBranch() const
}
size_t
-DisassemblerLLVM::InstructionLLVM::GetByteSize() const
-{
- return EDInstByteSize(m_inst);
-}
-
-size_t
DisassemblerLLVM::InstructionLLVM::Extract (const Disassembler &disassembler,
const lldb_private::DataExtractor &data,
uint32_t data_offset)
@@ -351,16 +346,21 @@ DisassemblerLLVM::InstructionLLVM::Extract (const Disassembler &disassembler,
break;
case llvm::Triple::arm:
- assert (byte_size == 4);
- m_opcode.SetOpcode32 (data.GetU32 (&offset));
- break;
-
case llvm::Triple::thumb:
- assert ((byte_size == 2) || (byte_size == 4));
- if (byte_size == 2)
- m_opcode.SetOpcode16 (data.GetU16 (&offset));
- else
+ switch (byte_size)
+ {
+ case 2:
+ m_opcode.SetOpcode16 (data.GetU16 (&offset));
+ break;
+
+ case 4:
m_opcode.SetOpcode32 (data.GetU32 (&offset));
+ break;
+
+ default:
+ assert (!"Invalid ARM opcode size");
+ break;
+ }
break;
default:
@@ -497,13 +497,13 @@ DisassemblerLLVM::Terminate()
const char *
DisassemblerLLVM::GetPluginNameStatic()
{
- return "disassembler.llvm";
+ return "llvm";
}
const char *
DisassemblerLLVM::GetPluginDescriptionStatic()
{
- return "Disassembler that uses LLVM opcode tables to disassemble i386 and x86_64.";
+ return "Disassembler that uses LLVM opcode tables to disassemble i386, x86_64 and ARM.";
}
//------------------------------------------------------------------
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
index 5ecda3e7014..9e01bf3f2c6 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
@@ -28,21 +28,17 @@ public:
virtual
~InstructionLLVM();
- void
+ virtual void
Dump (lldb_private::Stream *s,
bool show_address,
- const lldb_private::DataExtractor *bytes,
- uint32_t bytes_offset,
+ bool show_bytes,
const lldb_private::ExecutionContext* exe_ctx,
bool raw);
- bool
+ virtual bool
DoesBranch () const;
- size_t
- GetByteSize() const;
-
- size_t
+ virtual size_t
Extract (const Disassembler &disassembler,
const lldb_private::DataExtractor &data,
uint32_t data_offset);
diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp
index 78ab910c79a..603e9e6abca 100644
--- a/lldb/source/Target/StackFrame.cpp
+++ b/lldb/source/Target/StackFrame.cpp
@@ -258,6 +258,7 @@ StackFrame::Disassemble ()
Target &target = m_thread.GetProcess().GetTarget();
Disassembler::Disassemble (target.GetDebugger(),
target.GetArchitecture(),
+ NULL,
exe_ctx,
0,
0,
diff --git a/lldb/source/Target/ThreadPlanTracer.cpp b/lldb/source/Target/ThreadPlanTracer.cpp
index b8b7627201a..578a160251e 100644
--- a/lldb/source/Target/ThreadPlanTracer.cpp
+++ b/lldb/source/Target/ThreadPlanTracer.cpp
@@ -110,7 +110,7 @@ ThreadPlanAssemblyTracer::InitializeTracer()
ArchSpec arch(target.GetArchitecture());
- m_disassembler = Disassembler::FindPlugin(arch);
+ m_disassembler = Disassembler::FindPlugin(arch, NULL);
m_abi = process.GetABI();
@@ -215,8 +215,7 @@ ThreadPlanAssemblyTracer::Log ()
Instruction *instruction = instruction_list.GetInstructionAtIndex(0).get();
instruction->Dump (&desc,
false,
- NULL,
- 0,
+ false,
NULL,
true);
}
OpenPOWER on IntegriCloud