Add a symbol's value to the computed frag offset, rather than overwriting it.
[deliverable/binutils-gdb.git] / gdb / blockframe.c
index b4f42d2cc5a83f51df9e4c02f3ea5762c00086e1..d00f5c23fc68c40107e500cf96e1f2f54a901bfe 100644 (file)
@@ -41,13 +41,12 @@ void _initialize_blockframe (void);
    frame is the outermost one and has no caller. */
 
 int
-default_frame_chain_valid (chain, thisframe)
+file_frame_chain_valid (chain, thisframe)
      CORE_ADDR chain;
      struct frame_info *thisframe;
 {
   return ((chain) != 0
-         && !inside_main_func ((thisframe)->pc)
-         && !inside_entry_func ((thisframe)->pc));
+         && !inside_entry_file (FRAME_SAVED_PC (thisframe)));
 }
 
 /* Use the alternate method of avoiding running up off the end of the
@@ -55,12 +54,13 @@ default_frame_chain_valid (chain, thisframe)
    the comments in objfiles.h. */
 
 int
-alternate_frame_chain_valid (chain, thisframe)
+func_frame_chain_valid (chain, thisframe)
      CORE_ADDR chain;
      struct frame_info *thisframe;
 {
   return ((chain) != 0
-         && !inside_entry_file (FRAME_SAVED_PC (thisframe)));
+         && !inside_main_func ((thisframe)->pc)
+         && !inside_entry_func ((thisframe)->pc));
 }
 
 /* A very simple method of determining a valid frame */
@@ -1104,7 +1104,7 @@ pc_in_call_dummy_at_entry_point (pc, sp, frame_address)
  * zero, and CALL_DUMMY_LOCATION to AT_ENTRY.  Then you must remember
  * to define PUSH_RETURN_ADDRESS, because no call instruction will be
  * being executed by the target.  Also FRAME_CHAIN_VALID as
- * generic_frame_chain_valid and FIX_CALL_DUMMY as
+ * generic_{file,func}_frame_chain_valid and FIX_CALL_DUMMY as
  * generic_fix_call_dummy.  */
 
 /* Dummy frame.  This saves the processor state just prior to setting
@@ -1229,19 +1229,18 @@ generic_save_dummy_frame_tos (sp)
   dummy_frame_stack->top = sp;
 }
 
-/* Function: pop_frame
-   Restore the machine state from either the saved dummy stack or a
+/* Restore the machine state from either the saved dummy stack or a
    real stack frame. */
 
 void
-generic_pop_current_frame (pop)
-     void (*pop) (struct frame_info * frame);
+generic_pop_current_frame (void (*popper) (struct frame_info * frame))
 {
   struct frame_info *frame = get_current_frame ();
+
   if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
     generic_pop_dummy_frame ();
   else
-    pop (frame);
+    (*popper) (frame);
 }
 
 /* Function: pop_dummy_frame
@@ -1270,7 +1269,7 @@ generic_pop_dummy_frame ()
    and false for the CRT0 start-up frame.  Purpose is to terminate backtrace */
 
 int
-generic_frame_chain_valid (fp, fi)
+generic_file_frame_chain_valid (fp, fi)
      CORE_ADDR fp;
      struct frame_info *fi;
 {
@@ -1282,6 +1281,20 @@ generic_frame_chain_valid (fp, fi)
            && !inside_entry_file (FRAME_SAVED_PC (fi)));
 }
 
+int
+generic_func_frame_chain_valid (fp, fi)
+     CORE_ADDR fp;
+     struct frame_info *fi;
+{
+  if (PC_IN_CALL_DUMMY ((fi)->pc, fp, fp))
+    return 1;                  /* don't prune CALL_DUMMY frames */
+  else                         /* fall back to default algorithm (see frame.h) */
+    return (fp != 0
+           && (INNER_THAN (fi->frame, fp) || fi->frame == fp)
+           && !inside_main_func ((fi)->pc)
+           && !inside_entry_func ((fi)->pc));
+}
+
 /* Function: fix_call_dummy
    Stub function.  Generic dumy frames typically do not need to fix
    the frame being created */
This page took 0.024443 seconds and 4 git commands to generate.