* dwarf2-frame.c (struct dwarf2_frame_cache): New field
authorDaniel Jacobowitz <drow@false.org>
Fri, 8 Apr 2005 12:10:21 +0000 (12:10 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 8 Apr 2005 12:10:21 +0000 (12:10 +0000)
undefined_retaddr.
(dwarf2_frame_cache): Initialize undefined_retaddr.
(dwarf2_frame_this_id): Return an invalid frame ID if
undefined_retaddr.

gdb/ChangeLog
gdb/dwarf2-frame.c

index 30abadc..af02d97 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-08  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * dwarf2-frame.c (struct dwarf2_frame_cache): New field
+       undefined_retaddr.
+       (dwarf2_frame_cache): Initialize undefined_retaddr.
+       (dwarf2_frame_this_id): Return an invalid frame ID if
+       undefined_retaddr.
+
 2005-04-05  Jim Blandy  <jimb@redhat.com>
 
        Move construction of IA-32 vector types to i386-tdep.c.
index 1ac1859..22b8ae6 100644 (file)
@@ -610,6 +610,9 @@ struct dwarf2_frame_cache
   /* DWARF Call Frame Address.  */
   CORE_ADDR cfa;
 
+  /* Set if the return address column was marked as undefined.  */
+  int undefined_retaddr;
+
   /* Saved registers, indexed by GDB register number, not by DWARF
      register number.  */
   struct dwarf2_frame_state_reg *reg;
@@ -791,6 +794,10 @@ incomplete CFI data; unspecified registers (e.g., %s) at 0x%s"),
       }
   }
 
+  if (fs->retaddr_column < fs->regs.num_regs
+      && fs->regs.reg[fs->retaddr_column].how == DWARF2_FRAME_REG_UNDEFINED)
+    cache->undefined_retaddr = 1;
+
   do_cleanups (old_chain);
 
   *this_cache = cache;
@@ -804,6 +811,9 @@ dwarf2_frame_this_id (struct frame_info *next_frame, void **this_cache,
   struct dwarf2_frame_cache *cache =
     dwarf2_frame_cache (next_frame, this_cache);
 
+  if (cache->undefined_retaddr)
+    return;
+
   (*this_id) = frame_id_build (cache->cfa, frame_func_unwind (next_frame));
 }