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:
Greg Clayton 2011-05-15 04:12:07 +00:00
parent 745ae2853c
commit 9a8fa9161f
11 changed files with 108 additions and 32 deletions

View File

@ -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 ();

View File

@ -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

View File

@ -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

View File

@ -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 }
};

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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;

View File

@ -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());

View File

@ -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
{

View File

@ -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

View File

@ -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),