[Lldb-commits] [lldb] r219544 - Add a new disassembly-format specification so that the disassembler
Eric Christopher
echristo at gmail.com
Fri Oct 10 17:09:49 PDT 2014
On Fri, Oct 10, 2014 at 4:07 PM, Jason Molenda <jmolenda at apple.com> wrote:
> Author: jmolenda
> Date: Fri Oct 10 18:07:36 2014
> New Revision: 219544
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219544&view=rev
> Log:
> Add a new disassembly-format specification so that the disassembler
> output style can be customized. Change the built-in default to be
> more similar to gdb's disassembly formatting.
>
> The disassembly-format for a gdb-like output is
>
> ${addr-file-or-load} <${function.name-without-args}${function.concrete-only-addr-offset-no-padding}>:
>
> The disassembly-format for the lldb style output is
>
> {${function.initial-function}{${module.file.basename}`}{${function.name-without-args}}:\n}{${function.changed}\n{${module.file.basename}`}{${function.name-without-args}}:\n}{${current-pc-arrow} }{${addr-file-or-load}}:
>
> The two backticks in the lldb style formatter triggers the sub-expression evaluation in
> CommandInterpreter::PreprocessCommand() so you can't use that one as-is ... changing to
> use ' characters instead of ` would work around that.
>
> <rdar://problem/9885398>
>
>
> Modified:
> lldb/trunk/include/lldb/Core/Address.h
> lldb/trunk/include/lldb/Core/Debugger.h
> lldb/trunk/include/lldb/Core/Disassembler.h
> lldb/trunk/include/lldb/Core/Mangled.h
> lldb/trunk/include/lldb/Core/StreamString.h
> lldb/trunk/include/lldb/Symbol/SymbolContext.h
> lldb/trunk/source/API/SBInstruction.cpp
> lldb/trunk/source/API/SBInstructionList.cpp
> lldb/trunk/source/Breakpoint/BreakpointLocation.cpp
> lldb/trunk/source/Commands/CommandObjectSource.cpp
> lldb/trunk/source/Core/Address.cpp
> lldb/trunk/source/Core/Debugger.cpp
> lldb/trunk/source/Core/Disassembler.cpp
> lldb/trunk/source/Core/Mangled.cpp
> lldb/trunk/source/Core/StreamString.cpp
> lldb/trunk/source/Expression/IRExecutionUnit.cpp
> lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
> lldb/trunk/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
> lldb/trunk/source/Symbol/SymbolContext.cpp
> lldb/trunk/source/Symbol/Variable.cpp
> lldb/trunk/source/Target/StackFrame.cpp
> lldb/trunk/source/Target/ThreadPlanTracer.cpp
> lldb/trunk/test/functionalities/abbreviation/TestAbbreviations.py
> lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py
>
> Modified: lldb/trunk/include/lldb/Core/Address.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Address.h?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/Address.h (original)
> +++ lldb/trunk/include/lldb/Core/Address.h Fri Oct 10 18:07:36 2014
> @@ -87,6 +87,7 @@ public:
> ///< and file and line), to information about what the pointer points to
> ///< if the address is in a section (section of pointers, c strings, etc).
> DumpStyleResolvedDescriptionNoModule,
> + DumpStyleResolvedDescriptionNoFunctionArguments,
> DumpStyleDetailedSymbolContext, ///< Detailed symbol context information for an address for all symbol
> ///< context members.
> DumpStyleResolvedPointerDescription ///< Dereference a pointer at the current address and then lookup the
>
> Modified: lldb/trunk/include/lldb/Core/Debugger.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Debugger.h?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/Debugger.h (original)
> +++ lldb/trunk/include/lldb/Core/Debugger.h Fri Oct 10 18:07:36 2014
> @@ -250,6 +250,13 @@ public:
> Stream &s,
> ValueObject* valobj = NULL);
>
> + static bool
> + FormatDisassemblerAddress (const char *format,
> + const SymbolContext *sc,
> + const SymbolContext *prev_sc,
> + const ExecutionContext *exe_ctx,
> + const Address *addr,
> + Stream &s);
>
> void
> ClearIOHandlers ();
> @@ -288,10 +295,13 @@ public:
>
> bool
> GetAutoConfirm () const;
> -
> +
> + const char *
> + GetDisassemblyFormat() const;
> +
> const char *
> GetFrameFormat() const;
> -
> +
> const char *
> GetThreadFormat() const;
>
>
> Modified: lldb/trunk/include/lldb/Core/Disassembler.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Disassembler.h?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/Disassembler.h (original)
> +++ lldb/trunk/include/lldb/Core/Disassembler.h Fri Oct 10 18:07:36 2014
> @@ -77,12 +77,60 @@ public:
> m_address = addr;
> }
>
> + //------------------------------------------------------------------
> + /// Dump the text representation of this Instruction to a Stream
> + ///
> + /// Print the (optional) address, (optional) bytes, opcode,
> + /// operands, and instruction comments to a stream.
> + ///
> + /// @param[in] s
> + /// The Stream to add the text to.
> + ///
> + /// @param[in] show_address
> + /// Whether the address (using disassembly_addr_format_spec formatting)
> + /// should be printed.
> + ///
> + /// @param[in] show_bytes
> + /// Whether the bytes of the assembly instruction should be printed.
> + ///
> + /// @param[in] max_opcode_byte_size
> + /// The size (in bytes) of the largest instruction in the list that
> + /// we are printing (for text justification/alignment purposes)
> + /// Only needed if show_bytes is true.
> + ///
> + /// @param[in] exe_ctx
> + /// The current execution context, if available. May be used in
> + /// the assembling of the operands+comments for this instruction.
> + /// Pass NULL if not applicable.
> + ///
> + /// @param[in] sym_ctx
> + /// The SymbolContext for this instruction.
> + /// Pass NULL if not available/computed.
> + /// Only needed if show_address is true.
> + ///
> + /// @param[in] prev_sym_ctx
> + /// The SymbolContext for the previous instruction. Depending on
> + /// the disassembly address format specification, a change in
> + /// Symbol / Function may mean that a line is printed with the new
> + /// symbol/function name.
> + /// Pass NULL if unavailable, or if this is the first instruction of
> + /// the InstructionList.
> + /// Only needed if show_address is true.
> + ///
> + /// @param[in] disassembly_addr_format_spec
> + /// The format specification for how addresses are printed.
> + /// Only needed if show_address is true.
> + //------------------------------------------------------------------
> +
> virtual void
> Dump (Stream *s,
> uint32_t max_opcode_byte_size,
> bool show_address,
> bool show_bytes,
> - const ExecutionContext* exe_ctx);
> + const ExecutionContext* exe_ctx,
> + const SymbolContext *sym_ctx,
> + const SymbolContext *prev_sym_ctx,
> + const char *disassembly_addr_format_spec);
>
> virtual bool
> DoesBranch () = 0;
>
> Modified: lldb/trunk/include/lldb/Core/Mangled.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Mangled.h?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/Mangled.h (original)
> +++ lldb/trunk/include/lldb/Core/Mangled.h Fri Oct 10 18:07:36 2014
> @@ -37,7 +37,8 @@ public:
> enum NamePreference
> {
> ePreferMangled,
> - ePreferDemangled
> + ePreferDemangled,
> + ePreferDemangledWithoutArguments
> };
>
> //----------------------------------------------------------------------
>
> Modified: lldb/trunk/include/lldb/Core/StreamString.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/StreamString.h?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/StreamString.h (original)
> +++ lldb/trunk/include/lldb/Core/StreamString.h Fri Oct 10 18:07:36 2014
> @@ -46,6 +46,9 @@ public:
> size_t
> GetSize() const;
>
> + size_t
> + GetSizeOfLastLine () const;
> +
> std::string &
> GetString();
>
>
> Modified: lldb/trunk/include/lldb/Symbol/SymbolContext.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolContext.h?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/SymbolContext.h (original)
> +++ lldb/trunk/include/lldb/Symbol/SymbolContext.h Fri Oct 10 18:07:36 2014
> @@ -168,7 +168,8 @@ public:
> const Address &so_addr,
> bool show_fullpaths,
> bool show_module,
> - bool show_inlined_frames) const;
> + bool show_inlined_frames,
> + bool show_function_arguments) const;
>
> //------------------------------------------------------------------
> /// Get the address range contained within a symbol context.
>
> Modified: lldb/trunk/source/API/SBInstruction.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBInstruction.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBInstruction.cpp (original)
> +++ lldb/trunk/source/API/SBInstruction.cpp Fri Oct 10 18:07:36 2014
> @@ -20,6 +20,7 @@
> #include "lldb/Core/DataExtractor.h"
> #include "lldb/Core/Disassembler.h"
> #include "lldb/Core/EmulateInstruction.h"
> +#include "lldb/Core/Module.h"
> #include "lldb/Core/StreamFile.h"
> #include "lldb/Target/ExecutionContext.h"
> #include "lldb/Target/StackFrame.h"
> @@ -170,9 +171,15 @@ SBInstruction::GetDescription (lldb::SBS
> {
> if (m_opaque_sp)
> {
> + SymbolContext sc;
> + const Address &addr = m_opaque_sp->GetAddress();
> + ModuleSP module_sp (addr.GetModule());
> + if (module_sp)
> + module_sp->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
> // 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(), 0, true, false, NULL);
> + const char *disassemble_format = "${addr-file-or-load}: ";
> + m_opaque_sp->Dump (&s.ref(), 0, true, false, NULL, &sc, NULL, disassemble_format);
> return true;
> }
> return false;
> @@ -186,8 +193,14 @@ SBInstruction::Print (FILE *out)
>
> if (m_opaque_sp)
> {
> + SymbolContext sc;
> + const Address &addr = m_opaque_sp->GetAddress();
> + ModuleSP module_sp (addr.GetModule());
> + if (module_sp)
> + module_sp->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
> StreamFile out_stream (out, false);
> - m_opaque_sp->Dump (&out_stream, 0, true, false, NULL);
> + const char *disassemble_format = "${addr-file-or-load}: ";
> + m_opaque_sp->Dump (&out_stream, 0, true, false, NULL, &sc, NULL, disassemble_format);
> }
> }
>
>
> Modified: lldb/trunk/source/API/SBInstructionList.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBInstructionList.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBInstructionList.cpp (original)
> +++ lldb/trunk/source/API/SBInstructionList.cpp Fri Oct 10 18:07:36 2014
> @@ -11,7 +11,9 @@
> #include "lldb/API/SBInstruction.h"
> #include "lldb/API/SBStream.h"
> #include "lldb/Core/Disassembler.h"
> +#include "lldb/Core/Module.h"
> #include "lldb/Core/Stream.h"
> +#include "lldb/Symbol/SymbolContext.h"
>
> using namespace lldb;
> using namespace lldb_private;
> @@ -100,12 +102,24 @@ SBInstructionList::GetDescription (lldb:
> // exist already inside description...
> Stream &sref = description.ref();
> const uint32_t max_opcode_byte_size = m_opaque_sp->GetInstructionList().GetMaxOpcocdeByteSize();
> + const char *disassemble_format = "${addr-file-or-load}: ";
> + SymbolContext sc;
> + SymbolContext prev_sc;
> for (size_t i=0; i<num_instructions; ++i)
> {
> Instruction *inst = m_opaque_sp->GetInstructionList().GetInstructionAtIndex (i).get();
> if (inst == NULL)
> break;
> - inst->Dump (&sref, max_opcode_byte_size, true, false, NULL);
> +
> + const Address &addr = inst->GetAddress();
> + prev_sc = sc;
> + ModuleSP module_sp (addr.GetModule());
> + if (module_sp)
> + {
> + module_sp->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
> + }
> +
> + inst->Dump (&sref, max_opcode_byte_size, true, false, NULL, &sc, &prev_sc, disassemble_format);
> sref.EOL();
> }
> return true;
>
> Modified: lldb/trunk/source/Breakpoint/BreakpointLocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/BreakpointLocation.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Breakpoint/BreakpointLocation.cpp (original)
> +++ lldb/trunk/source/Breakpoint/BreakpointLocation.cpp Fri Oct 10 18:07:36 2014
> @@ -569,7 +569,7 @@ BreakpointLocation::GetDescription (Stre
> s->PutCString ("re-exported target = ");
> else
> s->PutCString("where = ");
> - sc.DumpStopContext (s, m_owner.GetTarget().GetProcessSP().get(), m_address, false, true, false);
> + sc.DumpStopContext (s, m_owner.GetTarget().GetProcessSP().get(), m_address, false, true, false, true);
> }
> else
> {
>
> Modified: lldb/trunk/source/Commands/CommandObjectSource.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectSource.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectSource.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectSource.cpp Fri Oct 10 18:07:36 2014
> @@ -689,12 +689,14 @@ protected:
> bool show_fullpaths = true;
> bool show_module = true;
> bool show_inlined_frames = true;
> + const bool show_function_arguments = true;
> sc.DumpStopContext(&result.GetOutputStream(),
> m_exe_ctx.GetBestExecutionContextScope(),
> sc.line_entry.range.GetBaseAddress(),
> show_fullpaths,
> show_module,
> - show_inlined_frames);
> + show_inlined_frames,
> + show_function_arguments);
> result.GetOutputStream().EOL();
>
> if (m_options.num_lines == 0)
>
> Modified: lldb/trunk/source/Core/Address.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Address.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Address.cpp (original)
> +++ lldb/trunk/source/Core/Address.cpp Fri Oct 10 18:07:36 2014
> @@ -465,6 +465,7 @@ Address::Dump (Stream *s, ExecutionConte
>
> case DumpStyleResolvedDescription:
> case DumpStyleResolvedDescriptionNoModule:
> + case DumpStyleResolvedDescriptionNoFunctionArguments:
> if (IsSectionOffset())
> {
> uint32_t pointer_size = 4;
> @@ -550,7 +551,7 @@ Address::Dump (Stream *s, ExecutionConte
> #endif
> Address cstr_addr(*this);
> cstr_addr.SetOffset(cstr_addr.GetOffset() + pointer_size);
> - func_sc.DumpStopContext(s, exe_scope, so_addr, true, true, false);
> + func_sc.DumpStopContext(s, exe_scope, so_addr, true, true, false, true);
> if (ReadAddress (exe_scope, cstr_addr, pointer_size, so_addr))
> {
> #if VERBOSE_OUTPUT
> @@ -633,7 +634,7 @@ Address::Dump (Stream *s, ExecutionConte
> if (pointer_sc.function || pointer_sc.symbol)
> {
> s->PutCString(": ");
> - pointer_sc.DumpStopContext(s, exe_scope, so_addr, true, false, false);
> + pointer_sc.DumpStopContext(s, exe_scope, so_addr, true, false, false, true);
> }
> }
> }
> @@ -658,6 +659,7 @@ Address::Dump (Stream *s, ExecutionConte
> const bool show_module = (style == DumpStyleResolvedDescription);
> const bool show_fullpaths = false;
> const bool show_inlined_frames = true;
> + const bool show_function_arguments = (style != DumpStyleResolvedDescriptionNoFunctionArguments);
> if (sc.function == NULL && sc.symbol != NULL)
> {
> // If we have just a symbol make sure it is in the right section
> @@ -679,7 +681,8 @@ Address::Dump (Stream *s, ExecutionConte
> *this,
> show_fullpaths,
> show_module,
> - show_inlined_frames);
> + show_inlined_frames,
> + show_function_arguments);
> }
> else
> {
>
> Modified: lldb/trunk/source/Core/Debugger.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Debugger.cpp (original)
> +++ lldb/trunk/source/Core/Debugger.cpp Fri Oct 10 18:07:36 2014
> @@ -45,6 +45,8 @@
> #include "lldb/Symbol/Function.h"
> #include "lldb/Symbol/Symbol.h"
> #include "lldb/Symbol/VariableList.h"
> +#include "lldb/Target/CPPLanguageRuntime.h"
> +#include "lldb/Target/ObjCLanguageRuntime.h"
> #include "lldb/Target/TargetList.h"
> #include "lldb/Target/Process.h"
> #include "lldb/Target/RegisterContext.h"
> @@ -122,12 +124,14 @@ g_language_enumerators[] =
> FILE_AND_LINE\
> "\\n"
>
> +#define DEFAULT_DISASSEMBLY_FORMAT "${addr-file-or-load} <${function.name-without-args}${function.concrete-only-addr-offset-no-padding}>: "
>
>
> static PropertyDefinition
> g_properties[] =
> {
> { "auto-confirm", OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true all confirmation prompts will receive their default reply." },
> +{ "disassembly-format", OptionValue::eTypeString , true, 0 , DEFAULT_DISASSEMBLY_FORMAT, NULL, "The default disassembly format string to use when disassembling instruction sequences." },
> { "frame-format", OptionValue::eTypeString , true, 0 , DEFAULT_FRAME_FORMAT, NULL, "The default frame format string to use when displaying stack frame information for threads." },
> { "notify-void", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Notify the user explicitly if an expression returns void (default: false)." },
> { "prompt", OptionValue::eTypeString , true, OptionValueString::eOptionEncodeCharacterEscapeSequences, "(lldb) ", NULL, "The debugger command line prompt displayed for the user." },
> @@ -148,6 +152,7 @@ g_properties[] =
> enum
> {
> ePropertyAutoConfirm = 0,
> + ePropertyDisassemblyFormat,
> ePropertyFrameFormat,
> ePropertyNotiftVoid,
> ePropertyPrompt,
> @@ -231,6 +236,13 @@ Debugger::GetAutoConfirm () const
> }
>
> const char *
> +Debugger::GetDisassemblyFormat() const
> +{
> + const uint32_t idx = ePropertyDisassemblyFormat;
> + return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value);
> +}
> +
> +const char *
> Debugger::GetFrameFormat() const
> {
> const uint32_t idx = ePropertyFrameFormat;
> @@ -1128,6 +1140,8 @@ TestPromptFormats (StackFrame *frame)
> StreamString s;
> const char *prompt_format =
> "{addr = '${addr}'\n}"
> + "{addr-file-or-load = '${addr-file-or-load}'\n}"
> + "{current-pc-arrow = '${current-pc-arrow}'\n}"
> "{process.id = '${process.id}'\n}"
> "{process.name = '${process.name}'\n}"
> "{process.file.basename = '${process.file.basename}'\n}"
> @@ -1155,9 +1169,13 @@ TestPromptFormats (StackFrame *frame)
> "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}"
> "{frame.reg.carp = '${frame.reg.carp}'\n}"
> "{function.id = '${function.id}'\n}"
> + "{function.changed = '${function.changed}'\n}"
> + "{function.initial-function = '${function.initial-function}'\n}"
> "{function.name = '${function.name}'\n}"
> + "{function.name-without-args = '${function.name-without-args}'\n}"
> "{function.name-with-args = '${function.name-with-args}'\n}"
> "{function.addr-offset = '${function.addr-offset}'\n}"
> + "{function.concrete-only-addr-offset-no-padding = '${function.concrete-only-addr-offset-no-padding}'\n}"
> "{function.line-offset = '${function.line-offset}'\n}"
> "{function.pc-offset = '${function.pc-offset}'\n}"
> "{line.file.basename = '${line.file.basename}'\n}"
> @@ -1555,7 +1573,9 @@ FormatPromptRecurse
> const Address *addr,
> Stream &s,
> const char **end,
> - ValueObject* valobj
> + ValueObject* valobj,
> + bool function_changed,
> + bool initial_function
> )
> {
> ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers
> @@ -1597,7 +1617,7 @@ FormatPromptRecurse
>
> ++p; // Skip the '{'
>
> - if (FormatPromptRecurse (p, sc, exe_ctx, addr, sub_strm, &p, valobj))
> + if (FormatPromptRecurse (p, sc, exe_ctx, addr, sub_strm, &p, valobj, function_changed, initial_function))
> {
> // The stream had all it needed
> s.Write(sub_strm.GetData(), sub_strm.GetSize());
> @@ -1631,6 +1651,12 @@ FormatPromptRecurse
> const char *cstr = NULL;
> std::string token_format;
> Address format_addr;
> +
> + // normally "addr" means print a raw address but
> + // "file-addr-or-load-addr" means print a module + file addr if there's no load addr
> + bool print_file_addr_or_load_addr = false;
> + bool addr_offset_concrete_func_only = false;
> + bool addr_offset_print_with_no_padding = false;
> bool calculate_format_addr_function_offset = false;
> // Set reg_kind and reg_num to invalid values
> RegisterKind reg_kind = kNumRegisterKinds;
> @@ -1941,7 +1967,7 @@ FormatPromptRecurse
> if (!special_directions)
> var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format);
> else
> - var_success &= FormatPromptRecurse(special_directions, sc, exe_ctx, addr, s, NULL, item);
> + var_success &= FormatPromptRecurse(special_directions, sc, exe_ctx, addr, s, NULL, item, function_changed, initial_function);
>
> if (--max_num_children == 0)
> {
> @@ -1957,7 +1983,12 @@ FormatPromptRecurse
> }
> break;
> case 'a':
> - if (IsToken (var_name_begin, "addr}"))
> + if (IsToken (var_name_begin, "addr-file-or-load}"))
> + {
> + print_file_addr_or_load_addr = true;
> + }
> + if (IsToken (var_name_begin, "addr}")
> + || IsToken (var_name_begin, "addr-file-or-load}"))
> {
> if (addr && addr->IsValid())
> {
> @@ -2159,8 +2190,7 @@ FormatPromptRecurse
> }
> }
> break;
> -
> -
> +
> case 'm':
> if (IsToken (var_name_begin, "module."))
> {
> @@ -2288,6 +2318,14 @@ FormatPromptRecurse
>
> var_success = true;
> }
> + if (IsToken (var_name_begin, "changed}") && function_changed)
> + {
> + var_success = true;
> + }
> + if (IsToken (var_name_begin, "initial-function}") && initial_function)
> + {
> + var_success = true;
> + }
> else if (IsToken (var_name_begin, "name}"))
> {
> if (sc->function)
> @@ -2314,6 +2352,19 @@ FormatPromptRecurse
> var_success = true;
> }
> }
> + else if (IsToken (var_name_begin, "name-without-args}"))
> + {
> + ConstString name;
> + if (sc->function)
> + name = sc->function->GetMangled().GetName (Mangled::ePreferDemangledWithoutArguments);
> + else if (sc->symbol)
> + name = sc->symbol->GetMangled().GetName (Mangled::ePreferDemangledWithoutArguments);
> + if (name)
> + {
> + s.PutCString(name.GetCString());
> + var_success = true;
> + }
> + }
> else if (IsToken (var_name_begin, "name-with-args}"))
> {
> // Print the function name with arguments in it
> @@ -2457,8 +2508,14 @@ FormatPromptRecurse
> }
> }
> }
> - else if (IsToken (var_name_begin, "addr-offset}"))
> + else if (IsToken (var_name_begin, "addr-offset}")
> + || IsToken (var_name_begin, "concrete-only-addr-offset-no-padding}"))
> {
> + if (IsToken (var_name_begin, "concrete-only-addr-offset-no-padding}"))
> + {
> + addr_offset_print_with_no_padding = true;
> + addr_offset_concrete_func_only = true;
> + }
> var_success = addr != NULL;
> if (var_success)
> {
> @@ -2529,6 +2586,34 @@ FormatPromptRecurse
> }
> }
> break;
> + case 'c':
> + if (IsToken (var_name_begin, "current-pc-arrow"))
> + {
> + if (addr && exe_ctx && exe_ctx->GetFramePtr())
> + {
> + RegisterContextSP reg_ctx = exe_ctx->GetFramePtr()->GetRegisterContextSP();
> + if (reg_ctx.get())
> + {
> + addr_t pc_loadaddr = reg_ctx->GetPC();
> + if (pc_loadaddr != LLDB_INVALID_ADDRESS)
> + {
> + Address pc;
> + pc.SetLoadAddress (pc_loadaddr, exe_ctx->GetTargetPtr());
> + if (pc == *addr)
> + {
> + s.Printf ("->");
> + var_success = true;
> + }
> + else
> + {
> + s.Printf(" ");
> + var_success = true;
> + }
> + }
> + }
> + }
> + }
> + break;
> }
>
> if (var_success)
> @@ -2586,7 +2671,7 @@ FormatPromptRecurse
> if (sc->function)
> {
> func_addr = sc->function->GetAddressRange().GetBaseAddress();
> - if (sc->block)
> + if (sc->block && addr_offset_concrete_func_only == false)
> {
> // Check to make sure we aren't in an inline
> // function. If we are, use the inline block
> @@ -2604,14 +2689,19 @@ FormatPromptRecurse
>
> if (func_addr.IsValid())
> {
> + const char *addr_offset_padding = " ";
> + if (addr_offset_print_with_no_padding)
> + {
> + addr_offset_padding = "";
> + }
> if (func_addr.GetSection() == format_addr.GetSection())
> {
> addr_t func_file_addr = func_addr.GetFileAddress();
> addr_t addr_file_addr = format_addr.GetFileAddress();
> if (addr_file_addr > func_file_addr)
> - s.Printf(" + %" PRIu64, addr_file_addr - func_file_addr);
> + s.Printf("%s+%s%" PRIu64, addr_offset_padding, addr_offset_padding, addr_file_addr - func_file_addr);
> else if (addr_file_addr < func_file_addr)
> - s.Printf(" - %" PRIu64, func_file_addr - addr_file_addr);
> + s.Printf("%s-%s%" PRIu64, addr_offset_padding, addr_offset_padding, func_file_addr - addr_file_addr);
> var_success = true;
> }
> else
> @@ -2622,9 +2712,9 @@ FormatPromptRecurse
> addr_t func_load_addr = func_addr.GetLoadAddress (target);
> addr_t addr_load_addr = format_addr.GetLoadAddress (target);
> if (addr_load_addr > func_load_addr)
> - s.Printf(" + %" PRIu64, addr_load_addr - func_load_addr);
> + s.Printf("%s+%s%" PRIu64, addr_offset_padding, addr_offset_padding, addr_load_addr - func_load_addr);
> else if (addr_load_addr < func_load_addr)
> - s.Printf(" - %" PRIu64, func_load_addr - addr_load_addr);
> + s.Printf("%s-%s%" PRIu64, addr_offset_padding, addr_offset_padding, func_load_addr - addr_load_addr);
> var_success = true;
> }
> }
> @@ -2641,10 +2731,21 @@ FormatPromptRecurse
>
> if (vaddr != LLDB_INVALID_ADDRESS)
> {
> - int addr_width = target->GetArchitecture().GetAddressByteSize() * 2;
> + int addr_width = 0;
> + if (exe_ctx && target)
> + {
> + target->GetArchitecture().GetAddressByteSize() * 2;
> + }
> if (addr_width == 0)
> addr_width = 16;
> - s.Printf("0x%*.*" PRIx64, addr_width, addr_width, vaddr);
> + if (print_file_addr_or_load_addr)
> + {
> + format_addr.Dump (&s, exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress, 0);
> + }
> + else
> + {
> + s.Printf("0x%*.*" PRIx64, addr_width, addr_width, vaddr);
> + }
> var_success = true;
> }
> }
> @@ -2758,9 +2859,55 @@ Debugger::FormatPrompt
> std::string format_str = lldb_utility::ansi::FormatAnsiTerminalCodes (format, use_color);
> if (format_str.length())
> format = format_str.c_str();
> - return FormatPromptRecurse (format, sc, exe_ctx, addr, s, NULL, valobj);
> + return FormatPromptRecurse (format, sc, exe_ctx, addr, s, NULL, valobj, false, false);
> +}
> +
> +bool
> +Debugger::FormatDisassemblerAddress (const char *format,
> + const SymbolContext *sc,
> + const SymbolContext *prev_sc,
> + const ExecutionContext *exe_ctx,
> + const Address *addr,
> + Stream &s)
> +{
> + if (format == NULL && exe_ctx != NULL && exe_ctx->HasTargetScope())
> + {
> + format = exe_ctx->GetTargetRef().GetDebugger().GetDisassemblyFormat();
> + }
> + bool function_changed = false;
> + bool initial_function = false;
> + if (prev_sc && (prev_sc->function || prev_sc->symbol))
> + {
> + if (sc && (sc->function || sc->symbol))
> + {
> + if (prev_sc->symbol && sc->symbol)
> + {
> + if (!sc->symbol->Compare (prev_sc->symbol->GetName(), prev_sc->symbol->GetType()))
> + {
> + function_changed = true;
> + }
> + }
> + else if (prev_sc->function && sc->function)
> + {
> + if (prev_sc->function->GetMangled() != sc->function->GetMangled())
> + {
> + function_changed = true;
> + }
> + }
> + }
> + }
> + // The first context on a list of instructions will have a prev_sc that
> + // has no Function or Symbol -- if SymbolContext had an IsValid() method, it
> + // would return false. But we do get a prev_sc pointer.
> + if ((sc && (sc->function || sc->symbol))
> + && prev_sc && (prev_sc->function == NULL && prev_sc->symbol == NULL))
> + {
> + initial_function = true;
> + }
> + return FormatPromptRecurse (format, sc, exe_ctx, addr, s, NULL, NULL, function_changed, initial_function);
> }
>
> +
> void
> Debugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
> {
>
> Modified: lldb/trunk/source/Core/Disassembler.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Disassembler.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Disassembler.cpp (original)
> +++ lldb/trunk/source/Core/Disassembler.cpp Fri Oct 10 18:07:36 2014
> @@ -410,17 +410,18 @@ Disassembler::PrintInstructions
> SymbolContext prev_sc;
> AddressRange sc_range;
> const Address *pc_addr_ptr = NULL;
> - ExecutionContextScope *exe_scope = exe_ctx.GetBestExecutionContextScope();
> StackFrame *frame = exe_ctx.GetFramePtr();
>
> TargetSP target_sp (exe_ctx.GetTargetSP());
> SourceManager &source_manager = target_sp ? target_sp->GetSourceManager() : debugger.GetSourceManager();
>
> if (frame)
> + {
> pc_addr_ptr = &frame->GetFrameCodeAddress();
> + }
> const uint32_t scope = eSymbolContextLineEntry | eSymbolContextFunction | eSymbolContextSymbol;
> const bool use_inline_block_range = false;
> - for (size_t i=0; i<num_instructions_found; ++i)
> + for (size_t i = 0; i < num_instructions_found; ++i)
> {
> Instruction *inst = disasm_ptr->GetInstructionList().GetInstructionAtIndex (i).get();
> if (inst)
> @@ -447,7 +448,7 @@ Disassembler::PrintInstructions
> if (offset != 0)
> strm.EOL();
>
> - sc.DumpStopContext(&strm, exe_ctx.GetProcessPtr(), addr, false, true, false);
> + sc.DumpStopContext(&strm, exe_ctx.GetProcessPtr(), addr, false, true, false, false);
> strm.EOL();
>
> if (sc.comp_unit && sc.line_entry.IsValid())
> @@ -462,23 +463,6 @@ Disassembler::PrintInstructions
> }
> }
> }
> - else if ((sc.function || sc.symbol) && (sc.function != prev_sc.function || sc.symbol != prev_sc.symbol))
> - {
> - if (prev_sc.function || prev_sc.symbol)
> - strm.EOL();
> -
> - bool show_fullpaths = false;
> - bool show_module = true;
> - bool show_inlined_frames = true;
> - sc.DumpStopContext (&strm,
> - exe_scope,
> - addr,
> - show_fullpaths,
> - show_module,
> - show_inlined_frames);
> -
> - strm << ":\n";
> - }
> }
> else
> {
> @@ -486,12 +470,13 @@ Disassembler::PrintInstructions
> }
> }
>
> - if ((options & eOptionMarkPCAddress) && pc_addr_ptr)
> + const bool show_bytes = (options & eOptionShowBytes) != 0;
> + const char *disassembly_format = "${addr-file-or-load}: ";
> + if (exe_ctx.HasTargetScope())
> {
> - strm.PutCString(inst_is_at_pc ? "-> " : " ");
> + disassembly_format = exe_ctx.GetTargetRef().GetDebugger().GetDisassemblyFormat ();
> }
> - const bool show_bytes = (options & eOptionShowBytes) != 0;
> - inst->Dump(&strm, max_opcode_byte_size, true, show_bytes, &exe_ctx);
> + inst->Dump (&strm, max_opcode_byte_size, true, show_bytes, &exe_ctx, &sc, &prev_sc, disassembly_format);
> strm.EOL();
> }
> else
> @@ -578,7 +563,10 @@ Instruction::Dump (lldb_private::Stream
> uint32_t max_opcode_byte_size,
> bool show_address,
> bool show_bytes,
> - const ExecutionContext* exe_ctx)
> + const ExecutionContext* exe_ctx,
> + const SymbolContext *sym_ctx,
> + const SymbolContext *prev_sym_ctx,
> + const char *disassembly_addr_format_spec)
> {
> size_t opcode_column_width = 7;
> const size_t operand_column_width = 25;
> @@ -589,13 +577,7 @@ Instruction::Dump (lldb_private::Stream
>
> if (show_address)
> {
> - m_address.Dump(&ss,
> - exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL,
> - Address::DumpStyleLoadAddress,
> - Address::DumpStyleModuleWithFileAddress,
> - 0);
> -
> - ss.PutCString(": ");
> + Debugger::FormatDisassemblerAddress (disassembly_addr_format_spec, sym_ctx, prev_sym_ctx, exe_ctx, &m_address, ss);
> }
>
> if (show_bytes)
> @@ -621,7 +603,7 @@ Instruction::Dump (lldb_private::Stream
> }
> }
>
> - const size_t opcode_pos = ss.GetSize();
> + const size_t opcode_pos = ss.GetSizeOfLastLine();
>
> // The default opcode size of 7 characters is plenty for most architectures
> // but some like arm can pull out the occasional vqrshrun.s16. We won't get
> @@ -1003,13 +985,18 @@ InstructionList::Dump (Stream *s,
> {
> const uint32_t max_opcode_byte_size = GetMaxOpcocdeByteSize();
> collection::const_iterator pos, begin, end;
> + const char *disassemble_format = "${addr-file-or-load}: ";
> + if (exe_ctx)
> + {
> + disassemble_format = exe_ctx->GetTargetRef().GetDebugger().GetDisassemblyFormat ();
> + }
> for (begin = m_instructions.begin(), end = m_instructions.end(), pos = begin;
> pos != end;
> ++pos)
> {
> if (pos != begin)
> s->EOL();
> - (*pos)->Dump(s, max_opcode_byte_size, show_address, show_bytes, exe_ctx);
> + (*pos)->Dump(s, max_opcode_byte_size, show_address, show_bytes, exe_ctx, NULL, NULL, disassemble_format);
> }
> }
>
>
> Modified: lldb/trunk/source/Core/Mangled.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Mangled.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Mangled.cpp (original)
> +++ lldb/trunk/source/Core/Mangled.cpp Fri Oct 10 18:07:36 2014
> @@ -4986,10 +4986,12 @@ __cxa_demangle(const char* mangled_name,
> #include "lldb/Core/RegularExpression.h"
> #include "lldb/Core/Stream.h"
> #include "lldb/Core/Timer.h"
> +#include "lldb/Target/CPPLanguageRuntime.h"
> #include <ctype.h>
> #include <string.h>
> #include <stdlib.h>
>
> +
> using namespace lldb_private;
>
> static inline bool
> @@ -5000,6 +5002,58 @@ cstring_is_mangled (const char *s)
> return false;
> }
>
> +static const ConstString &
> +get_demangled_name_without_arguments (const Mangled *obj)
> +{
> + // This pair is <mangled name, demangled name without function arguments>
> + static std::pair<ConstString, ConstString> g_most_recent_mangled_to_name_sans_args;
> +
> + // Need to have the mangled & demangled names we're currently examining as statics
> + // so we can return a const ref to them at the end of the func if we don't have
> + // anything better.
> + static ConstString g_last_mangled;
> + static ConstString g_last_demangled;
> +
> + ConstString mangled = obj->GetMangledName ();
> + ConstString demangled = obj->GetDemangledName ();
> +
> + if (mangled && g_most_recent_mangled_to_name_sans_args.first == mangled)
> + {
> + return g_most_recent_mangled_to_name_sans_args.second;
> + }
> +
> + g_last_demangled = demangled;
> + g_last_mangled = mangled;
> +
> + const char *mangled_name_cstr = mangled.GetCString();
> + const char *demangled_name_cstr = demangled.GetCString();
This variable was unused so I removed it in
dzur:~/sources/llvm/tools/lldb> svn ci source/Core/Mangled.cpp
Sending source/Core/Mangled.cpp
Transmitting file data .
Committed revision 219547.
-eric
> +
> + if (demangled && mangled_name_cstr && mangled_name_cstr[0])
> + {
> + if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
> + (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure, typeinfo structure, and typeinfo mangled_name
> + mangled_name_cstr[2] != 'G' && // avoid guard variables
> + mangled_name_cstr[2] != 'Z')) // named local entities (if we eventually handle eSymbolTypeData, we will want this back)
> + {
> + CPPLanguageRuntime::MethodName cxx_method (demangled);
> + if (!cxx_method.GetBasename().empty() && !cxx_method.GetContext().empty())
> + {
> + std::string shortname = cxx_method.GetContext().str();
> + shortname += "::";
> + shortname += cxx_method.GetBasename().str();
> + ConstString result(shortname.c_str());
> + g_most_recent_mangled_to_name_sans_args.first = mangled;
> + g_most_recent_mangled_to_name_sans_args.second = result;
> + return g_most_recent_mangled_to_name_sans_args.second;
> + }
> + }
> + }
> +
> + if (demangled)
> + return g_last_demangled;
> + return g_last_mangled;
> +}
> +
> #pragma mark Mangled
> //----------------------------------------------------------------------
> // Default constructor
> @@ -5215,6 +5269,14 @@ Mangled::NameMatches (const RegularExpre
> const ConstString&
> Mangled::GetName (Mangled::NamePreference preference) const
> {
> + if (preference == ePreferDemangledWithoutArguments)
> + {
> + // Call the accessor to make sure we get a demangled name in case
> + // it hasn't been demangled yet...
> + GetDemangledName();
> +
> + return get_demangled_name_without_arguments (this);
> + }
> if (preference == ePreferDemangled)
> {
> // Call the accessor to make sure we get a demangled name in case
>
> Modified: lldb/trunk/source/Core/StreamString.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/StreamString.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/StreamString.cpp (original)
> +++ lldb/trunk/source/Core/StreamString.cpp Fri Oct 10 18:07:36 2014
> @@ -65,6 +65,22 @@ StreamString::GetSize () const
> return m_packet.size();
> }
>
> +size_t
> +StreamString::GetSizeOfLastLine () const
> +{
> + const size_t length = m_packet.size();
> + size_t last_line_begin_pos = m_packet.find_last_of("\r\n");
> + if (last_line_begin_pos == std::string::npos)
> + {
> + return length;
> + }
> + else
> + {
> + ++last_line_begin_pos;
> + return length - last_line_begin_pos;
> + }
> +}
> +
> std::string &
> StreamString::GetString()
> {
>
> Modified: lldb/trunk/source/Expression/IRExecutionUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRExecutionUnit.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Expression/IRExecutionUnit.cpp (original)
> +++ lldb/trunk/source/Expression/IRExecutionUnit.cpp Fri Oct 10 18:07:36 2014
> @@ -13,6 +13,7 @@
> #include "llvm/Support/SourceMgr.h"
> #include "lldb/Core/DataBufferHeap.h"
> #include "lldb/Core/DataExtractor.h"
> +#include "lldb/Core/Debugger.h"
> #include "lldb/Core/Disassembler.h"
> #include "lldb/Core/Log.h"
> #include "lldb/Core/Module.h"
> @@ -199,6 +200,11 @@ IRExecutionUnit::DisassembleFunction (St
>
> InstructionList &instruction_list = disassembler_sp->GetInstructionList();
> const uint32_t max_opcode_byte_size = instruction_list.GetMaxOpcocdeByteSize();
> + const char *disassemble_format = "${addr-file-or-load}: ";
> + if (exe_ctx.HasTargetScope())
> + {
> + disassemble_format = exe_ctx.GetTargetRef().GetDebugger().GetDisassemblyFormat();
> + }
>
> for (size_t instruction_index = 0, num_instructions = instruction_list.GetSize();
> instruction_index < num_instructions;
> @@ -209,7 +215,10 @@ IRExecutionUnit::DisassembleFunction (St
> max_opcode_byte_size,
> true,
> true,
> - &exe_ctx);
> + &exe_ctx,
> + NULL,
> + NULL,
> + disassemble_format);
> stream.PutChar('\n');
> }
> // FIXME: The DisassemblerLLVMC has a reference cycle and won't go away if it has any active instructions.
>
> Modified: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original)
> +++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Fri Oct 10 18:07:36 2014
> @@ -832,11 +832,19 @@ const char *DisassemblerLLVMC::SymbolLoo
>
> value_so_addr.Dump (&ss,
> target,
> - Address::DumpStyleResolvedDescriptionNoModule,
> + Address::DumpStyleResolvedDescriptionNoFunctionArguments,
> Address::DumpStyleSectionNameOffset);
>
> if (!ss.GetString().empty())
> {
> + // If Address::Dump returned a multi-line description, most commonly seen when we
> + // have multiple levels of inlined functions at an address, only show the first line.
> + std::string &str(ss.GetString());
> + size_t first_eol_char = str.find_first_of ("\r\n");
> + if (first_eol_char != std::string::npos)
> + {
> + str.erase (first_eol_char);
> + }
> m_inst->AppendComment(ss.GetString());
> }
> }
>
> Modified: lldb/trunk/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp (original)
> +++ lldb/trunk/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp Fri Oct 10 18:07:36 2014
> @@ -146,7 +146,8 @@ UnwindAssemblyInstEmulation::GetNonCallS
> if (log && log->GetVerbose ())
> {
> StreamString strm;
> - inst->Dump(&strm, inst_list.GetMaxOpcocdeByteSize (), show_address, show_bytes, NULL);
> + const char *disassemble_format = "${frame.pc}: ";
> + inst->Dump(&strm, inst_list.GetMaxOpcocdeByteSize (), show_address, show_bytes, NULL, NULL, NULL, disassemble_format);
> log->PutCString (strm.GetData());
> }
>
>
> Modified: lldb/trunk/source/Symbol/SymbolContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolContext.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Symbol/SymbolContext.cpp (original)
> +++ lldb/trunk/source/Symbol/SymbolContext.cpp Fri Oct 10 18:07:36 2014
> @@ -128,7 +128,8 @@ SymbolContext::DumpStopContext
> const Address &addr,
> bool show_fullpaths,
> bool show_module,
> - bool show_inlined_frames
> + bool show_inlined_frames,
> + bool show_function_arguments
> ) const
> {
> bool dumped_something = false;
> @@ -146,7 +147,12 @@ SymbolContext::DumpStopContext
> {
> SymbolContext inline_parent_sc;
> Address inline_parent_addr;
> - if (function->GetMangled().GetName())
> + if (show_function_arguments == false && function->GetMangled().GetName(Mangled::ePreferDemangledWithoutArguments))
> + {
> + dumped_something = true;
> + function->GetMangled().GetName(Mangled::ePreferDemangledWithoutArguments).Dump(s);
> + }
> + else if (function->GetMangled().GetName())
> {
> dumped_something = true;
> function->GetMangled().GetName().Dump(s);
> @@ -188,7 +194,7 @@ SymbolContext::DumpStopContext
> {
> s->EOL();
> s->Indent();
> - return inline_parent_sc.DumpStopContext (s, exe_scope, inline_parent_addr, show_fullpaths, show_module, show_inlined_frames);
> + return inline_parent_sc.DumpStopContext (s, exe_scope, inline_parent_addr, show_fullpaths, show_module, show_inlined_frames, show_function_arguments);
> }
> }
> else
>
> Modified: lldb/trunk/source/Symbol/Variable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Symbol/Variable.cpp (original)
> +++ lldb/trunk/source/Symbol/Variable.cpp Fri Oct 10 18:07:36 2014
> @@ -174,13 +174,15 @@ Variable::DumpDeclaration (Stream *s, bo
> sc.block = nullptr;
> sc.line_entry.Clear();
> bool show_inlined_frames = false;
> + const bool show_function_arguments = true;
>
> dumped_declaration_info = sc.DumpStopContext (s,
> nullptr,
> Address(),
> show_fullpaths,
> show_module,
> - show_inlined_frames);
> + show_inlined_frames,
> + show_function_arguments);
>
> if (sc.function)
> s->PutChar(':');
>
> Modified: lldb/trunk/source/Target/StackFrame.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Target/StackFrame.cpp (original)
> +++ lldb/trunk/source/Target/StackFrame.cpp Fri Oct 10 18:07:36 2014
> @@ -1380,12 +1380,14 @@ StackFrame::Dump (Stream *strm, bool sho
> GetSymbolContext(eSymbolContextEverything);
> const bool show_module = true;
> const bool show_inline = true;
> + const bool show_function_arguments = true;
> m_sc.DumpStopContext (strm,
> exe_ctx.GetBestExecutionContextScope(),
> GetFrameCodeAddress(),
> show_fullpaths,
> show_module,
> - show_inline);
> + show_inline,
> + show_function_arguments);
> }
>
> void
>
> Modified: lldb/trunk/source/Target/ThreadPlanTracer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanTracer.cpp?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/source/Target/ThreadPlanTracer.cpp (original)
> +++ lldb/trunk/source/Target/ThreadPlanTracer.cpp Fri Oct 10 18:07:36 2014
> @@ -212,11 +212,15 @@ ThreadPlanAssemblyTracer::Log ()
> const bool show_bytes = true;
> const bool show_address = true;
> Instruction *instruction = instruction_list.GetInstructionAtIndex(0).get();
> + const char *disassemble_format = "${addr-file-or-load}: ";
> instruction->Dump (stream,
> max_opcode_byte_size,
> show_address,
> show_bytes,
> - NULL);
> + NULL,
> + NULL,
> + NULL,
> + disassemble_format);
> }
> }
> }
>
> Modified: lldb/trunk/test/functionalities/abbreviation/TestAbbreviations.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/abbreviation/TestAbbreviations.py?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/test/functionalities/abbreviation/TestAbbreviations.py (original)
> +++ lldb/trunk/test/functionalities/abbreviation/TestAbbreviations.py Fri Oct 10 18:07:36 2014
> @@ -150,8 +150,8 @@ class AbbreviationsTestCase(TestBase):
> # ARCH, if not specified, defaults to x86_64.
> if self.getArchitecture() in ["", 'x86_64', 'i386']:
> self.expect("dis -f",
> - startstr = "a.out`sum(int, int)",
> - substrs = [' mov',
> + substrs = ['<sum(int, int)>:',
> + ' mov',
> ' addl ',
> 'ret'])
>
>
> Modified: lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py?rev=219544&r1=219543&r2=219544&view=diff
> ==============================================================================
> --- lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py (original)
> +++ lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py Fri Oct 10 18:07:36 2014
> @@ -176,8 +176,11 @@ class AssertingInferiorTestCase(TestBase
> # of the function and in the next function. We also can't back the PC up
> # because we don't know how much to back it up by on targets with opcodes
> # that have differing sizes
> - self.expect("disassemble -a %s" % frame.GetPC(),
> - substrs = ['->'])
> + pc_backup_offset = 1
> + if frame.GetFrameID() == 0:
> + pc_backup_offset = 0
> + self.expect("disassemble -a %s" % (frame.GetPC() - pc_backup_offset),
> + substrs = ['<%s>:' % frame.GetFunctionName()])
>
> def check_expr_in_main(self, thread):
> depth = thread.GetNumFrames()
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list