diff --git a/lldb/include/lldb/Core/RegisterValue.h b/lldb/include/lldb/Core/RegisterValue.h index 27b69fd9b6e0..f103e2627688 100644 --- a/lldb/include/lldb/Core/RegisterValue.h +++ b/lldb/include/lldb/Core/RegisterValue.h @@ -334,7 +334,8 @@ namespace lldb_private { Dump (Stream *s, const RegisterInfo *reg_info, bool prefix_with_name, - lldb::Format format = lldb::eFormatDefault) const; + bool prefix_with_alt_name, + lldb::Format format) const; void * GetBytes (); diff --git a/lldb/include/lldb/Interpreter/NamedOptionValue.h b/lldb/include/lldb/Interpreter/NamedOptionValue.h index 2c9bdd97e816..119c9c5731a2 100644 --- a/lldb/include/lldb/Interpreter/NamedOptionValue.h +++ b/lldb/include/lldb/Interpreter/NamedOptionValue.h @@ -134,6 +134,12 @@ namespace lldb_private { { return m_value_was_set; } + + void + SetOptionWasSet () + { + m_value_was_set = true; + } protected: bool m_value_was_set; // This can be used to see if a value has been set diff --git a/lldb/include/lldb/lldb-defines.h b/lldb/include/lldb/lldb-defines.h index b1dae28df4cc..70396f73b6e9 100644 --- a/lldb/include/lldb/lldb-defines.h +++ b/lldb/include/lldb/lldb-defines.h @@ -56,8 +56,15 @@ #define LLDB_REGNUM_GENERIC_FP 2 // Frame Pointer #define LLDB_REGNUM_GENERIC_RA 3 // Return Address #define LLDB_REGNUM_GENERIC_FLAGS 4 // Processor flags register - -//---------------------------------------------------------------------- +#define LLDB_REGNUM_GENERIC_ARG1 5 // The register that would contain pointer size or less argument 1 (if any) +#define LLDB_REGNUM_GENERIC_ARG2 6 // The register that would contain pointer size or less argument 2 (if any) +#define LLDB_REGNUM_GENERIC_ARG3 7 // The register that would contain pointer size or less argument 3 (if any) +#define LLDB_REGNUM_GENERIC_ARG4 8 // The register that would contain pointer size or less argument 4 (if any) +#define LLDB_REGNUM_GENERIC_ARG5 9 // The register that would contain pointer size or less argument 5 (if any) +#define LLDB_REGNUM_GENERIC_ARG6 10 // The register that would contain pointer size or less argument 6 (if any) +#define LLDB_REGNUM_GENERIC_ARG7 11 // The register that would contain pointer size or less argument 7 (if any) +#define LLDB_REGNUM_GENERIC_ARG8 12 // The register that would contain pointer size or less argument 8 (if any) +//--------------------------------------------------------------------- /// Invalid value definitions //---------------------------------------------------------------------- #define LLDB_INVALID_ADDRESS UINT64_MAX diff --git a/lldb/source/Commands/CommandObjectRegister.cpp b/lldb/source/Commands/CommandObjectRegister.cpp index e1377bbe55e4..860b41825977 100644 --- a/lldb/source/Commands/CommandObjectRegister.cpp +++ b/lldb/source/Commands/CommandObjectRegister.cpp @@ -89,8 +89,9 @@ public: else format = m_options.format; - bool prefix_with_name = true; - reg_value.Dump(&strm, reg_info, prefix_with_name, m_options.format); + bool prefix_with_altname = m_options.alternate_name; + bool prefix_with_name = !prefix_with_altname; + reg_value.Dump(&strm, reg_info, prefix_with_name, prefix_with_altname, m_options.format); if (((reg_info->encoding == eEncodingUint) || (reg_info->encoding == eEncodingSint)) && (reg_info->byte_size == reg_ctx->GetThread().GetProcess().GetAddressByteSize())) { @@ -245,7 +246,8 @@ protected: CommandOptions (CommandInterpreter &interpreter) : Options(interpreter), set_indexes (OptionValue::ConvertTypeToMask (OptionValue::eTypeUInt64)), - dump_all_sets (false, false) // Initial and default values are false + dump_all_sets (false, false), // Initial and default values are false + alternate_name (false, false) { OptionParsingStarting(); } @@ -275,9 +277,21 @@ protected: break; case 'a': - dump_all_sets.SetCurrentValue(true); + // When we don't use OptionValue::SetValueFromCString(const char *) to + // set an option value, it won't be marked as being set in the options + // so we make a call to let users know the value was set via option + dump_all_sets.SetCurrentValue (true); + dump_all_sets.SetOptionWasSet (); break; + case 'A': + // When we don't use OptionValue::SetValueFromCString(const char *) to + // set an option value, it won't be marked as being set in the options + // so we make a call to let users know the value was set via option + alternate_name.SetCurrentValue (true); + dump_all_sets.SetOptionWasSet (); + break; + default: error.SetErrorStringWithFormat("Unrecognized short option '%c'\n", short_option); break; @@ -291,6 +305,7 @@ protected: format = eFormatDefault; set_indexes.Clear(); dump_all_sets.Clear(); + alternate_name.Clear(); } const OptionDefinition* @@ -307,6 +322,7 @@ protected: lldb::Format format; OptionValueArray set_indexes; OptionValueBoolean dump_all_sets; + OptionValueBoolean alternate_name; }; CommandOptions m_options; @@ -315,9 +331,10 @@ protected: OptionDefinition CommandObjectRegisterRead::CommandOptions::g_option_table[] = { - { LLDB_OPT_SET_ALL, false, "format", 'f', required_argument, NULL, 0, eArgTypeExprFormat, "Specify the format to use when dumping register values."}, - { LLDB_OPT_SET_1 , false, "set" , 's', required_argument, NULL, 0, eArgTypeIndex , "Specify which register sets to dump by index."}, - { LLDB_OPT_SET_2 , false, "all" , 'a', no_argument , NULL, 0, eArgTypeNone , "Show all register sets."}, + { LLDB_OPT_SET_ALL, false, "format" , 'f', required_argument, NULL, 0, eArgTypeExprFormat, "Specify the format to use when dumping register values."}, + { LLDB_OPT_SET_ALL, false, "alternate", 'A', no_argument , NULL, 0, eArgTypeNone , "Display register names using the alternate register name if there is one."}, + { LLDB_OPT_SET_1 , false, "set" , 's', required_argument, NULL, 0, eArgTypeIndex , "Specify which register sets to dump by index."}, + { LLDB_OPT_SET_2 , false, "all" , 'a', no_argument , NULL, 0, eArgTypeNone , "Show all register sets."}, { 0, false, NULL, 0, 0, NULL, NULL, eArgTypeNone, NULL } }; diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index ba1e4b3d070d..8c5ebe27a5da 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -1112,7 +1112,7 @@ Debugger::FormatPrompt var_success = reg_ctx->ReadRegister (reg_info, reg_value); if (var_success) { - reg_value.Dump(&s, reg_info, false); + reg_value.Dump(&s, reg_info, false, false, eFormatDefault); } } diff --git a/lldb/source/Core/EmulateInstruction.cpp b/lldb/source/Core/EmulateInstruction.cpp index a30dcd806081..c2f1f41c8285 100644 --- a/lldb/source/Core/EmulateInstruction.cpp +++ b/lldb/source/Core/EmulateInstruction.cpp @@ -421,7 +421,7 @@ EmulateInstruction::WriteRegisterDefault (EmulateInstruction *instruction, { StreamFile strm (stdout, false); strm.Printf (" Write to Register (name = %s, value = " , reg_info->name); - reg_value.Dump(&strm, reg_info, false); + reg_value.Dump(&strm, reg_info, false, false, eFormatDefault); strm.PutCString (", context = "); context.Dump (strm, instruction); strm.EOL(); diff --git a/lldb/source/Core/RegisterValue.cpp b/lldb/source/Core/RegisterValue.cpp index bc66a8c2185d..7e7b38113389 100644 --- a/lldb/source/Core/RegisterValue.cpp +++ b/lldb/source/Core/RegisterValue.cpp @@ -24,13 +24,49 @@ using namespace lldb_private; bool -RegisterValue::Dump (Stream *s, const RegisterInfo *reg_info, bool prefix_with_name, Format format) const +RegisterValue::Dump (Stream *s, + const RegisterInfo *reg_info, + bool prefix_with_name, + bool prefix_with_alt_name, + Format format) const { DataExtractor data; if (GetData (data)) { - if (prefix_with_name && reg_info->name != NULL) - s->Printf ("%s = ", reg_info->name); + bool name_printed = false; + if (prefix_with_name) + { + if (reg_info->name) + { + s->Printf ("%s", reg_info->name); + name_printed = true; + } + else if (reg_info->alt_name) + { + s->Printf ("%s", reg_info->alt_name); + prefix_with_alt_name = false; + name_printed = true; + } + } + if (prefix_with_alt_name) + { + if (name_printed) + s->PutChar ('/'); + if (reg_info->alt_name) + { + s->Printf ("%s", reg_info->alt_name); + name_printed = true; + } + else if (!name_printed) + { + // No alternate name but we were asked to display a name, so show the main name + s->Printf ("%s", reg_info->name); + name_printed = true; + } + } + if (name_printed) + s->PutCString (" = "); + if (format == eFormatDefault) format = reg_info->format; diff --git a/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp b/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp index e72693265886..cbc61c2ce881 100644 --- a/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp +++ b/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp @@ -412,7 +412,7 @@ UnwindAssemblyInstEmulation::ReadRegister (EmulateInstruction *instruction, StreamString strm; strm.Printf ("UnwindAssemblyInstEmulation::ReadRegister (name = \"%s\") => synthetic_value = %i, value = ", reg_info->name, synthetic); - reg_value.Dump(&strm, reg_info, false, eFormatDefault); + reg_value.Dump(&strm, reg_info, false, false, eFormatDefault); log->PutCString(strm.GetData()); } return true; @@ -442,7 +442,7 @@ UnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction, StreamString strm; strm.Printf ("UnwindAssemblyInstEmulation::WriteRegister (name = \"%s\", value = ", reg_info->name); - reg_value.Dump(&strm, reg_info, false, eFormatDefault); + reg_value.Dump(&strm, reg_info, false, false, eFormatDefault); strm.PutCString (", context = "); context.Dump(strm, instruction); log->PutCString(strm.GetData()); diff --git a/lldb/tools/debugserver/source/DNBDefs.h b/lldb/tools/debugserver/source/DNBDefs.h index 10f3727714a2..fb259f29c7c2 100644 --- a/lldb/tools/debugserver/source/DNBDefs.h +++ b/lldb/tools/debugserver/source/DNBDefs.h @@ -163,6 +163,14 @@ enum #define GENERIC_REGNUM_FP 2 // Frame Pointer #define GENERIC_REGNUM_RA 3 // Return Address #define GENERIC_REGNUM_FLAGS 4 // Processor flags register +#define GENERIC_REGNUM_ARG1 5 // The register that would contain pointer size or less argument 1 (if any) +#define GENERIC_REGNUM_ARG2 6 // The register that would contain pointer size or less argument 2 (if any) +#define GENERIC_REGNUM_ARG3 7 // The register that would contain pointer size or less argument 3 (if any) +#define GENERIC_REGNUM_ARG4 8 // The register that would contain pointer size or less argument 4 (if any) +#define GENERIC_REGNUM_ARG5 9 // The register that would contain pointer size or less argument 5 (if any) +#define GENERIC_REGNUM_ARG6 10 // The register that would contain pointer size or less argument 6 (if any) +#define GENERIC_REGNUM_ARG7 11 // The register that would contain pointer size or less argument 7 (if any) +#define GENERIC_REGNUM_ARG8 12 // The register that would contain pointer size or less argument 8 (if any) enum DNBRegisterType { diff --git a/lldb/tools/debugserver/source/MacOSX/arm/DNBArchImpl.cpp b/lldb/tools/debugserver/source/MacOSX/arm/DNBArchImpl.cpp index f2c2451beae2..d637b5e501e9 100644 --- a/lldb/tools/debugserver/source/MacOSX/arm/DNBArchImpl.cpp +++ b/lldb/tools/debugserver/source/MacOSX/arm/DNBArchImpl.cpp @@ -2544,10 +2544,10 @@ enum const DNBRegisterInfo DNBArchMachARM::g_gpr_registers[] = { - DEFINE_GPR_IDX ( 0, r0, NULL, INVALID_NUB_REGNUM ), - DEFINE_GPR_IDX ( 1, r1, NULL, INVALID_NUB_REGNUM ), - DEFINE_GPR_IDX ( 2, r2, NULL, INVALID_NUB_REGNUM ), - DEFINE_GPR_IDX ( 3, r3, NULL, INVALID_NUB_REGNUM ), + DEFINE_GPR_IDX ( 0, r0,"arg1", GENERIC_REGNUM_ARG1 ), + DEFINE_GPR_IDX ( 1, r1,"arg2", GENERIC_REGNUM_ARG2 ), + DEFINE_GPR_IDX ( 2, r2,"arg3", GENERIC_REGNUM_ARG3 ), + DEFINE_GPR_IDX ( 3, r3,"arg4", GENERIC_REGNUM_ARG4 ), DEFINE_GPR_IDX ( 4, r4, NULL, INVALID_NUB_REGNUM ), DEFINE_GPR_IDX ( 5, r5, NULL, INVALID_NUB_REGNUM ), DEFINE_GPR_IDX ( 6, r6, NULL, INVALID_NUB_REGNUM ), @@ -2560,7 +2560,7 @@ DNBArchMachARM::g_gpr_registers[] = DEFINE_GPR_NAME (sp, "r13", GENERIC_REGNUM_SP ), DEFINE_GPR_NAME (lr, "r14", GENERIC_REGNUM_RA ), DEFINE_GPR_NAME (pc, "r15", GENERIC_REGNUM_PC ), - DEFINE_GPR_NAME (cpsr, NULL, GENERIC_REGNUM_FLAGS ) + DEFINE_GPR_NAME (cpsr, "flags", GENERIC_REGNUM_FLAGS ) }; // Floating point registers diff --git a/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp b/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp index f51e26b0025f..621cda7246ed 100644 --- a/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp +++ b/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp @@ -819,6 +819,7 @@ enum gdb_regnums #define DEFINE_GPR(reg) { e_regSetGPR, gpr_##reg, #reg, NULL, Uint, Hex, GPR_SIZE(reg), GPR_OFFSET(reg), gcc_dwarf_##reg, gcc_dwarf_##reg, INVALID_NUB_REGNUM, gdb_##reg } #define DEFINE_GPR_ALT(reg, alt, gen) { e_regSetGPR, gpr_##reg, #reg, alt, Uint, Hex, GPR_SIZE(reg), GPR_OFFSET(reg), gcc_dwarf_##reg, gcc_dwarf_##reg, gen, gdb_##reg } #define DEFINE_GPR_ALT2(reg, alt) { e_regSetGPR, gpr_##reg, #reg, alt, Uint, Hex, GPR_SIZE(reg), GPR_OFFSET(reg), INVALID_NUB_REGNUM, INVALID_NUB_REGNUM, INVALID_NUB_REGNUM, gdb_##reg } +#define DEFINE_GPR_ALT3(reg, alt, gen) { e_regSetGPR, gpr_##reg, #reg, alt, Uint, Hex, GPR_SIZE(reg), GPR_OFFSET(reg), INVALID_NUB_REGNUM, INVALID_NUB_REGNUM, gen, gdb_##reg } // General purpose registers for 64 bit const DNBRegisterInfo @@ -826,22 +827,22 @@ DNBArchImplX86_64::g_gpr_registers[] = { DEFINE_GPR (rax), DEFINE_GPR (rbx), - DEFINE_GPR (rcx), - DEFINE_GPR (rdx), - DEFINE_GPR (rdi), - DEFINE_GPR (rsi), - DEFINE_GPR_ALT (rbp, "fp", GENERIC_REGNUM_FP), - DEFINE_GPR_ALT (rsp, "sp", GENERIC_REGNUM_SP), - DEFINE_GPR (r8), - DEFINE_GPR (r9), + DEFINE_GPR_ALT (rcx , "arg4", GENERIC_REGNUM_ARG4), + DEFINE_GPR_ALT (rdx , "arg3", GENERIC_REGNUM_ARG3), + DEFINE_GPR_ALT (rdi , "arg1", GENERIC_REGNUM_ARG1), + DEFINE_GPR_ALT (rsi , "arg2", GENERIC_REGNUM_ARG2), + DEFINE_GPR_ALT (rbp , "fp" , GENERIC_REGNUM_FP), + DEFINE_GPR_ALT (rsp , "sp" , GENERIC_REGNUM_SP), + DEFINE_GPR_ALT (r8 , "arg5", GENERIC_REGNUM_ARG5), + DEFINE_GPR_ALT (r9 , "arg6", GENERIC_REGNUM_ARG6), DEFINE_GPR (r10), DEFINE_GPR (r11), DEFINE_GPR (r12), DEFINE_GPR (r13), DEFINE_GPR (r14), DEFINE_GPR (r15), - DEFINE_GPR_ALT (rip, "pc", GENERIC_REGNUM_PC), - DEFINE_GPR_ALT2 (rflags, "flags"), + DEFINE_GPR_ALT (rip , "pc", GENERIC_REGNUM_PC), + DEFINE_GPR_ALT3 (rflags, "flags", GENERIC_REGNUM_FLAGS), DEFINE_GPR_ALT2 (cs, NULL), DEFINE_GPR_ALT2 (fs, NULL), DEFINE_GPR_ALT2 (gs, NULL),