int selected_frame_level;
-/* Nonzero means print the full filename and linenumber
- when a frame is printed, and do so in a format programs can parse. */
+/* Zero means do things normally; we are interacting directly with the
+ user. One means print the full filename and linenumber when a
+ frame is printed, and do so in a format emacs18/emacs19.22 can
+ parse. Two means print similar annotations, but in many more
+ cases and in a slightly different syntax. */
-int frame_file_full_name = 0;
+int annotation_level = 0;
\f
struct print_stack_frame_args {
/* If fi is not the innermost frame, that normally means that fi->pc
points to *after* the call instruction, and we want to get the line
containing the call, never the next line. But if the next frame is
- a signal_handler_caller frame, then the next frame was not entered
- as the result of a call, and we want to get the line containing
- fi->pc. */
+ a signal_handler_caller or a dummy frame, then the next frame was
+ not entered as the result of a call, and we want to get the line
+ containing fi->pc. */
sal =
find_pc_line (fi->pc,
- fi->next != NULL && fi->next->signal_handler_caller == 0);
+ fi->next != NULL
+ && !fi->next->signal_handler_caller
+ && !frame_in_dummy (fi->next));
func = find_pc_function (fi->pc);
if (func)
&& (SYMBOL_VALUE_ADDRESS (msymbol)
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
{
+#if 0
+ /* There is no particular reason to think the line number
+ information is wrong. Someone might have just put in
+ a label with asm() but left the line numbers alone. */
/* In this case we have no way of knowing the source file
and line number, so don't print them. */
sal.symtab = 0;
+#endif
/* We also don't know anything about the function besides
its address and name. */
func = 0;
printf_filtered ("#%-2d ", level);
if (addressprint)
if (fi->pc != sal.pc || !sal.symtab)
- printf_filtered ("%s in ", local_hex_string((unsigned long) fi->pc));
+ {
+ print_address_numeric (fi->pc, 1, gdb_stdout);
+ printf_filtered (" in ");
+ }
fprintf_symbol_filtered (gdb_stdout, funname ? funname : "??", funlang,
DMGL_ANSI);
wrap_here (" ");
{
int done = 0;
int mid_statement = source < 0 && fi->pc != sal.pc;
- if (frame_file_full_name)
+ if (annotation_level)
done = identify_source_line (sal.symtab, sal.line, mid_statement,
fi->pc);
if (!done)
{
if (addressprint && mid_statement)
- printf_filtered ("%s\t", local_hex_string((unsigned long) fi->pc));
+ {
+ print_address_numeric (fi->pc, 1, gdb_stdout);
+ printf_filtered ("\t");
+ }
print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
}
current_source_line = max (sal.line - lines_to_list/2, 1);
/* find_relative_frame was successful */
return fid;
+ /* If SETUP_ARBITRARY_FRAME is defined, then frame specifications
+ take at least 2 addresses. It is important to detect this case
+ here so that "frame 100" does not give a confusing error message
+ like "frame specification requires two addresses". This of course
+ does not solve the "frame 100" problem for machines on which
+ a frame specification can be made with one address. To solve
+ that, we need a new syntax for a specifying a frame by address.
+ I think the cleanest syntax is $frame(0x45) ($frame(0x23,0x45) for
+ two args, etc.), but people might think that is too much typing,
+ so I guess *0x23,0x45 would be a possible alternative (commas
+ really should be used instead of spaces to delimit; using spaces
+ normally works in an expression). */
+#ifdef SETUP_ARBITRARY_FRAME
+ error ("No frame %d", args[0]);
+#endif
+
/* If (s)he specifies the frame with an address, he deserves what
(s)he gets. Still, give the highest one that matches. */
fid = tfid;
/* We couldn't identify the frame as an existing frame, but
- perhaps we can create one with a single argument.
- Fall through to default case; it's up to SETUP_ARBITRARY_FRAME
- to complain if it doesn't like a single arg. */
+ perhaps we can create one with a single argument. */
}
default:
fi = get_frame_info (frame);
sal = find_pc_line (fi->pc,
- fi->next != NULL && fi->next->signal_handler_caller == 0);
+ fi->next != NULL
+ && !fi->next->signal_handler_caller
+ && !frame_in_dummy (fi->next));
func = get_frame_function (frame);
s = find_pc_symtab(fi->pc);
if (func)
}
calling_frame = get_prev_frame (frame);
- if (!addr_exp && selected_frame_level >= 0) {
- printf_filtered ("Stack level %d, frame at %s:\n",
- selected_frame_level,
- local_hex_string((unsigned long) FRAME_FP(frame)));
- } else {
- printf_filtered ("Stack frame at %s:\n",
- local_hex_string((unsigned long) FRAME_FP(frame)));
- }
- printf_filtered (" %s = %s",
- reg_names[PC_REGNUM],
- local_hex_string((unsigned long) fi->pc));
+ if (!addr_exp && selected_frame_level >= 0)
+ {
+ printf_filtered ("Stack level %d, frame at ", selected_frame_level);
+ print_address_numeric (FRAME_FP(frame), 1, gdb_stdout);
+ printf_filtered (":\n");
+ }
+ else
+ {
+ printf_filtered ("Stack frame at ");
+ print_address_numeric (FRAME_FP(frame), 1, gdb_stdout);
+ printf_filtered (":\n");
+ }
+ printf_filtered (" %s = ",
+ reg_names[PC_REGNUM]);
+ print_address_numeric (fi->pc, 1, gdb_stdout);
wrap_here (" ");
if (funname)
printf_filtered (" (%s:%d)", sal.symtab->filename, sal.line);
puts_filtered ("; ");
wrap_here (" ");
- printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
- local_hex_string((unsigned long) FRAME_SAVED_PC (frame)));
+ printf_filtered ("saved %s ", reg_names[PC_REGNUM]);
+ print_address_numeric (FRAME_SAVED_PC (frame), 1, gdb_stdout);
+ printf_filtered ("\n");
{
int frameless = 0;
}
if (calling_frame)
- printf_filtered (" called by frame at %s",
- local_hex_string((unsigned long) FRAME_FP (calling_frame)));
+ {
+ printf_filtered (" called by frame at ");
+ print_address_numeric (FRAME_FP (calling_frame), 1, gdb_stdout);
+ }
if (fi->next && calling_frame)
puts_filtered (",");
wrap_here (" ");
if (fi->next)
- printf_filtered (" caller of frame at %s",
- local_hex_string ((unsigned long) fi->next->frame));
+ {
+ printf_filtered (" caller of frame at ");
+ print_address_numeric (fi->next->frame, 1, gdb_stdout);
+ }
if (fi->next || calling_frame)
puts_filtered ("\n");
if (s)
- printf_filtered(" source language %s.\n", language_str(s->language));
+ printf_filtered (" source language %s.\n", language_str (s->language));
#ifdef PRINT_EXTRA_FRAME_INFO
PRINT_EXTRA_FRAME_INFO (fi);
int numargs;
if (arg_list == 0)
- printf_filtered (" Arglist at unknown address.\n");
+ printf_filtered (" Arglist at unknown address.\n");
else
{
- printf_filtered (" Arglist at %s,",
- local_hex_string((unsigned long) arg_list));
+ printf_filtered (" Arglist at ");
+ print_address_numeric (arg_list, 1, gdb_stdout);
+ printf_filtered (",");
FRAME_NUM_ARGS (numargs, fi);
if (numargs < 0)
CORE_ADDR arg_list = FRAME_LOCALS_ADDRESS (fi);
if (arg_list == 0)
- printf_filtered (" Locals at unknown address,");
+ printf_filtered (" Locals at unknown address,");
else
- printf_filtered (" Locals at %s,",
- local_hex_string((unsigned long) arg_list));
+ {
+ printf_filtered (" Locals at ");
+ print_address_numeric (arg_list, 1, gdb_stdout);
+ printf_filtered (",");
+ }
}
#if defined (FRAME_FIND_SAVED_REGS)
get_frame_saved_regs (fi, &fsr);
/* The sp is special; what's returned isn't the save address, but
actually the value of the previous frame's sp. */
- printf_filtered (" Previous frame's sp is %s\n",
- local_hex_string((unsigned long) fsr.regs[SP_REGNUM]));
+ printf_filtered (" Previous frame's sp is ");
+ print_address_numeric (fsr.regs[SP_REGNUM], 1, gdb_stdout);
+ printf_filtered ("\n");
count = 0;
for (i = 0; i < NUM_REGS; i++)
if (fsr.regs[i] && i != SP_REGNUM)
else
puts_filtered (",");
wrap_here (" ");
- printf_filtered (" %s at %s", reg_names[i],
- local_hex_string((unsigned long) fsr.regs[i]));
+ printf_filtered (" %s at ", reg_names[i]);
+ print_address_numeric (fsr.regs[i], 1, gdb_stdout);
count++;
}
if (count)
puts_filtered ("\n");
+#else /* Have FRAME_FIND_SAVED_REGS. */
+ puts_filtered ("\n");
#endif /* Have FRAME_FIND_SAVED_REGS. */
}
for (i = 0; i < nsyms; i++)
{
sym = BLOCK_SYM (b, i);
- if (SYMBOL_CLASS (sym) == LOC_LOCAL
- || SYMBOL_CLASS (sym) == LOC_REGISTER
- || SYMBOL_CLASS (sym) == LOC_STATIC)
+ switch (SYMBOL_CLASS (sym))
{
+ case LOC_LOCAL:
+ case LOC_REGISTER:
+ case LOC_STATIC:
+ case LOC_BASEREG:
values_printed = 1;
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
fputs_filtered (" = ", stream);
print_variable_value (sym, frame, stream);
fprintf_filtered (stream, "\n");
+ break;
+
+ default:
+ /* Ignore symbols which are not locals. */
+ break;
}
}
return values_printed;
values_printed = 1;
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
if (addressprint)
- fprintf_filtered (stream, " %s",
- local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (sym)));
+ {
+ fprintf_filtered (stream, " ");
+ print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 1, stream);
+ }
fprintf_filtered (stream, " in file %s, line %d\n",
sal.symtab->filename, sal.line);
}
FRAME_ADDR selected_frame_addr;
CORE_ADDR selected_frame_pc;
FRAME frame;
- value return_value = NULL;
+ value_ptr return_value = NULL;
if (selected_frame == NULL)
error ("No selected frame.");