2004-04-02 Joel Brobecker <brobecker@gnat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 2 Apr 2004 23:01:14 +0000 (23:01 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 2 Apr 2004 23:01:14 +0000 (23:01 +0000)
Committed by Andrew Cagney <cagney@redhat.com>.
        * alpha-tdep.c (alpha_heuristic_frame_unwind_cache): Do not take
        into account an instruction saving a register if we have already
        seen an earlier instruction saving that same register.

gdb/ChangeLog
gdb/alpha-tdep.c

index 0972e99..3e3b759 100644 (file)
@@ -1,3 +1,10 @@
+2004-04-02  Joel Brobecker  <brobecker@gnat.com>
+       
+       Committed by Andrew Cagney <cagney@redhat.com>.
+        * alpha-tdep.c (alpha_heuristic_frame_unwind_cache): Do not take
+        into account an instruction saving a register if we have already
+        seen an earlier instruction saving that same register.
+
 2004-04-02  Andrew Cagney  <cagney@redhat.com>
 
        * gdbarch.sh (DEPRECATED_INIT_FRAME_PC_FIRST): Delete.
index 8777afc..0f4eaa7 100644 (file)
@@ -1029,6 +1029,16 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
            {
              reg = (word & 0x03e00000) >> 21;
 
+              /* Ignore this instruction if we have already encountered
+                 an instruction saving the same register earlier in the
+                 function code.  The current instruction does not tell
+                 us where the original value upon function entry is saved.
+                 All it says is that the function we are scanning reused
+                 that register for some computation of its own, and is now
+                 saving its result.  */
+              if (info->saved_regs[reg])
+                continue;
+
              if (reg == 31)
                continue;