* Move comments on bypassing call dummy breakpoint from stack.c
authorJim Kingdon <jkingdon@engr.sgi.com>
Fri, 15 Oct 1993 19:37:29 +0000 (19:37 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Fri, 15 Oct 1993 19:37:29 +0000 (19:37 +0000)
to breakpoint.h.

gdb/ChangeLog
gdb/breakpoint.h
gdb/stack.c

index 4be05312a294db3769a7dac81218ee02d7aff0ec..933d81d3b73e6e16cf345c5c28f10a04d4e1327b 100644 (file)
@@ -1,3 +1,8 @@
+Fri Oct 15 14:30:30 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * Move comments on bypassing call dummy breakpoint from stack.c
+       to breakpoint.h.
+
 Fri Oct 15 11:52:56 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * symtab.c (lookup_partial_symtab):  If filename is not found and
index 589915d32b932f5b850ee505ed530f7fb68f436b..2bebe3e4f5b59a75b0a63d04fdf634e98f0d2ddf 100644 (file)
@@ -50,6 +50,12 @@ enum bptype {
   bp_step_resume,
 
   /* The breakpoint at the end of a call dummy.  */
+  /* FIXME: What if the function we are calling longjmp()s out of the
+     call, or the user gets out with the "return" command?  We currently
+     have no way of cleaning up the breakpoint in these (obscure) situations.
+     (Probably can solve this by noticing longjmp, "return", etc., it's
+     similar to noticing when a watchpoint on a local variable goes out
+     of scope (with hardware support for watchpoints)).  */
   bp_call_dummy
 };
 
index d16bbd6207ae3a4222f34b9d52073ea3a98496b1..dc14c38c349e6836e34915a577b6da46ba1f48e6 100644 (file)
@@ -170,18 +170,8 @@ print_frame_info (fi, level, source, args)
 
   /* This is not a perfect test, because if a function alloca's some
      memory, puts some code there, and then jumps into it, then the test
-     will succeed even though there is no call dummy.  A better
-     solution would be to keep track of where the call dummies are.
-     Probably the best way to do that is by setting a breakpoint.c
-     breakpoint at the end of the call dummy (wanted anyway, to clean
-     up wait_for_inferior).  Then we know that the sizeof (CALL_DUMMY)
-     (or some such) bytes before that breakpoint are a call dummy.
-     Only problem I see with this approach is figuring out to get rid
-     of the breakpoint whenever the call dummy vanishes (e.g.
-     return_command, or longjmp out of the called function), which we
-     probably can solve (it's very similar to figuring out when a
-     watchpoint on a local variable goes out of scope if it is being
-     watched via something like a 386 debug register).  */
+     will succeed even though there is no call dummy.  Probably best is
+     to check for a bp_call_dummy breakpoint.  */
   if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
     {
       /* Do this regardless of SOURCE because we don't have any source
@@ -266,7 +256,7 @@ print_frame_info (fi, level, source, args)
        printf_filtered ("#%-2d ", level);
       if (addressprint)
        if (fi->pc != sal.pc || !sal.symtab)
-         printf_filtered ("%s in ", local_hex_string(fi->pc));
+         printf_filtered ("%s in ", local_hex_string((unsigned long) fi->pc));
       fprintf_symbol_filtered (stdout, funname ? funname : "??", funlang,
                               DMGL_NO_OPTS);
       wrap_here ("   ");
@@ -307,7 +297,7 @@ print_frame_info (fi, level, source, args)
       if (!done)
        {
          if (addressprint && mid_statement)
-           printf_filtered ("%s\t", local_hex_string(fi->pc));
+           printf_filtered ("%s\t", local_hex_string((unsigned long) fi->pc));
          print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
        }
       current_source_line = max (sal.line - lines_to_list/2, 1);
@@ -329,7 +319,7 @@ parse_frame_specification (frame_exp)
 {
   int numargs = 0;
 #define        MAXARGS 4
-  int args[MAXARGS];
+  CORE_ADDR args[MAXARGS];
   
   if (frame_exp)
     {
@@ -470,14 +460,14 @@ frame_info (addr_exp, from_tty)
   if (!addr_exp && selected_frame_level >= 0) {
     printf_filtered ("Stack level %d, frame at %s:\n",
                     selected_frame_level, 
-                    local_hex_string(FRAME_FP(frame)));
+                    local_hex_string((unsigned long) FRAME_FP(frame)));
   } else {
     printf_filtered ("Stack frame at %s:\n",
-                    local_hex_string(FRAME_FP(frame)));
+                    local_hex_string((unsigned long) FRAME_FP(frame)));
   }
   printf_filtered (" %s = %s",
                   reg_names[PC_REGNUM], 
-                  local_hex_string(fi->pc));
+                  local_hex_string((unsigned long) fi->pc));
 
   wrap_here ("   ");
   if (funname)
@@ -492,7 +482,7 @@ frame_info (addr_exp, from_tty)
   puts_filtered ("; ");
   wrap_here ("    ");
   printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
-                  local_hex_string(FRAME_SAVED_PC (frame)));
+                  local_hex_string((unsigned long) FRAME_SAVED_PC (frame)));
 
   {
     int frameless = 0;
@@ -505,13 +495,13 @@ frame_info (addr_exp, from_tty)
 
   if (calling_frame)
     printf_filtered (" called by frame at %s", 
-                    local_hex_string(FRAME_FP (calling_frame)));
+                    local_hex_string((unsigned long) FRAME_FP (calling_frame)));
   if (fi->next && calling_frame)
     puts_filtered (",");
   wrap_here ("   ");
   if (fi->next)
     printf_filtered (" caller of frame at %s",
-                    local_hex_string (fi->next->frame));
+                    local_hex_string ((unsigned long) fi->next->frame));
   if (fi->next || calling_frame)
     puts_filtered ("\n");
   if (s)
@@ -531,7 +521,8 @@ frame_info (addr_exp, from_tty)
        printf_filtered (" Arglist at unknown address.\n");
     else
       {
-       printf_filtered (" Arglist at %s,", local_hex_string(arg_list));
+       printf_filtered (" Arglist at %s,",
+                        local_hex_string((unsigned long) arg_list));
 
        FRAME_NUM_ARGS (numargs, fi);
        if (numargs < 0)
@@ -553,7 +544,8 @@ frame_info (addr_exp, from_tty)
     if (arg_list == 0)
        printf_filtered (" Locals at unknown address,");
     else
-       printf_filtered (" Locals at %s,", local_hex_string(arg_list));
+       printf_filtered (" Locals at %s,",
+                        local_hex_string((unsigned long) arg_list));
   }
 
 #if defined (FRAME_FIND_SAVED_REGS)  
@@ -561,7 +553,7 @@ frame_info (addr_exp, from_tty)
   /* 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(fsr.regs[SP_REGNUM]));
+                  local_hex_string((unsigned long) fsr.regs[SP_REGNUM]));
   count = 0;
   for (i = 0; i < NUM_REGS; i++)
     if (fsr.regs[i] && i != SP_REGNUM)
@@ -572,7 +564,7 @@ frame_info (addr_exp, from_tty)
          puts_filtered (",");
        wrap_here (" ");
        printf_filtered (" %s at %s", reg_names[i], 
-                        local_hex_string(fsr.regs[i]));
+                        local_hex_string((unsigned long) fsr.regs[i]));
        count++;
       }
   if (count)
@@ -767,7 +759,7 @@ print_block_frame_labels (b, have_default, stream)
          fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          if (addressprint)
            fprintf_filtered (stream, " %s", 
-                             local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
+                             local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (sym)));
          fprintf_filtered (stream, " in file %s, line %d\n",
                            sal.symtab->filename, sal.line);
        }
@@ -1211,14 +1203,16 @@ return_command (retval_exp, from_tty)
   selected_frame_addr = FRAME_FP (selected_frame);
   selected_frame_pc = (get_frame_info (selected_frame))->pc;
 
-  /* Compute the return value (if any -- possibly getting errors here).
-     Call VALUE_CONTENTS to make sure we have fully evaluated it, since
-     it might live in the stack frame we're about to pop.  */
+  /* Compute the return value (if any -- possibly getting errors here).  */
 
   if (retval_exp)
     {
       return_value = parse_and_eval (retval_exp);
-      VALUE_CONTENTS (return_value);
+
+      /* Make sure we have fully evaluated it, since
+        it might live in the stack frame we're about to pop.  */
+      if (VALUE_LAZY (return_value))
+       value_fetch_lazy (return_value);
     }
 
   /* If interactive, require confirmation.  */