Added generic register numbers for simple ABI argument registers and defined
the appropriate registers for arm and x86_64. The register names for the arguments that are the size of a pointer or less are all named "arg1", "arg2", etc. This allows you to read these registers by name: (lldb) register read arg1 arg2 arg3 ... You can also now specify you want to see alternate register names when executing the read register command: (lldb) register read --alternate (lldb) register read -A llvm-svn: 131376
This commit is contained in:
parent
745ae2853c
commit
9a8fa9161f
|
@ -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 ();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue