Index: src/arm/simulator-arm.cc |
=================================================================== |
--- src/arm/simulator-arm.cc (revision 2814) |
+++ src/arm/simulator-arm.cc (working copy) |
@@ -70,7 +70,7 @@ |
Simulator* sim_; |
- bool GetValue(char* desc, int32_t* value); |
+ bool GetValue(const char* desc, int32_t* value); |
// Set or delete a breakpoint. Returns true if successful. |
bool SetBreakpoint(Instr* breakpc); |
@@ -132,6 +132,8 @@ |
#endif |
+// The order of these are important, see the handling of the 'print all' |
+// debugger command. |
static const char* reg_names[] = { "r0", "r1", "r2", "r3", |
"r4", "r5", "r6", "r7", |
"r8", "r9", "r10", "r11", |
@@ -147,7 +149,7 @@ |
11, 10}; |
-static int RegNameToRegNum(char* name) { |
+static int RegNameToRegNum(const char* name) { |
int reg = 0; |
while (*reg_names[reg] != 0) { |
if (strcmp(reg_names[reg], name) == 0) { |
@@ -159,7 +161,7 @@ |
} |
-bool Debugger::GetValue(char* desc, int32_t* value) { |
+bool Debugger::GetValue(const char* desc, int32_t* value) { |
int regnum = RegNameToRegNum(desc); |
if (regnum >= 0) { |
if (regnum == 15) { |
@@ -270,13 +272,25 @@ |
} else if ((strcmp(cmd, "p") == 0) || (strcmp(cmd, "print") == 0)) { |
if (args == 2) { |
int32_t value; |
- if (GetValue(arg1, &value)) { |
- PrintF("%s: %d 0x%x\n", arg1, value, value); |
+ if (strcmp(arg1, "all") == 0) { |
+ for (int i = 0; i <= 15; i++) { |
iposva
2009/09/04 05:30:24
Please use named constants here.
|
+ if (GetValue(reg_names[i], &value)) { |
+ if (i <= 10) { |
iposva
2009/09/04 05:30:24
and here.
|
+ PrintF("%s: 08x%x %d\n", reg_names[i], value, value); |
+ } else { |
+ PrintF("%s: 08x%x %d\n", reg_names[15 + 16 - i], value, value); |
iposva
2009/09/04 05:30:24
and here.
Better yet, abstract the register to na
|
+ } |
+ } |
+ } |
} else { |
- PrintF("%s unrecognized\n", arg1); |
+ if (GetValue(arg1, &value)) { |
+ PrintF("%s: 08x%x %d \n", arg1, value, value); |
+ } else { |
+ PrintF("%s unrecognized\n", arg1); |
+ } |
} |
} else { |
- PrintF("print value\n"); |
+ PrintF("print <register>\n"); |
} |
} else if ((strcmp(cmd, "po") == 0) |
|| (strcmp(cmd, "printobject") == 0)) { |
@@ -286,14 +300,17 @@ |
Object* obj = reinterpret_cast<Object*>(value); |
USE(obj); |
iposva
2009/09/04 05:30:24
This USE can be dropped now, that obj is used in D
|
PrintF("%s: \n", arg1); |
-#if defined(DEBUG) |
+#ifdef DEBUG |
obj->PrintLn(); |
-#endif // defined(DEBUG) |
+#else |
+ obj->ShortPrint(); |
+ PrintF("\n"); |
+#endif |
} else { |
PrintF("%s unrecognized\n", arg1); |
} |
} else { |
- PrintF("printobject value\n"); |
+ PrintF("printobject <value>\n"); |
} |
} else if (strcmp(cmd, "disasm") == 0) { |
disasm::NameConverter converter; |
@@ -343,7 +360,7 @@ |
PrintF("%s unrecognized\n", arg1); |
} |
} else { |
- PrintF("break addr\n"); |
+ PrintF("break <address>\n"); |
} |
} else if (strcmp(cmd, "del") == 0) { |
if (!DeleteBreakpoint(NULL)) { |
@@ -362,6 +379,15 @@ |
} else { |
PrintF("Not at debugger stop."); |
} |
+ } else if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) { |
+ PrintF("print <register>\n"); |
Erik Corry
2009/09/02 14:22:44
It would be nice to include si/stepi and c/cont as
Søren Thygesen Gjesse
2009/09/02 14:47:19
Added missing commands and description and alias a
|
+ PrintF("printobject <register>\n"); |
+ PrintF("flags\n"); |
+ PrintF("disasm <value>\n"); |
+ PrintF("gdb\n"); |
+ PrintF("break <address>\n"); |
+ PrintF("del\n"); |
+ PrintF("unstop\n"); |
} else { |
PrintF("Unknown command: %s\n", cmd); |
} |
@@ -1726,7 +1752,8 @@ |
uint16_t halfword = ReadH(addr, instr); |
set_register(rd, halfword); |
} else { |
- UNIMPLEMENTED(); |
+ Debugger dbg(this); |
+ dbg.Stop(instr); |
} |
} |