re PR debug/48459 (avr: Assertion failure with -gdwarf-2)
authorRichard Henderson <rth@redhat.com>
Tue, 14 Jun 2011 13:31:43 +0000 (06:31 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 14 Jun 2011 13:31:43 +0000 (06:31 -0700)
PR debug/48459
        * dwarf2out.c (frame_pointer_fb_offset_valid): New.
        (based_loc_descr): Assert it's true.
        (compute_frame_pointer_to_fb_displacement): Set it, rather than
        aborting immediately.

From-SVN: r175018

gcc/ChangeLog
gcc/dwarf2out.c

index df5ede980977b8033bcea9d3a4a955721e2fc90b..0f06b436f7fd000f915fb0dc782a8c64acb0a219 100644 (file)
@@ -1,3 +1,11 @@
+2011-06-14  Richard Henderson  <rth@redhat.com>
+
+       PR debug/48459
+       * dwarf2out.c (frame_pointer_fb_offset_valid): New.
+       (based_loc_descr): Assert it's true.
+       (compute_frame_pointer_to_fb_displacement): Set it, rather than
+       aborting immediately.
+
 2011-06-14  Sanjin Liu <scliu@faraday-tech.com>
            Mingfeng Wu  <mingfeng@faraday-tech.com>
 
index 776066b275c905596a1b791e7841c73b0b69146e..c1c22b46323f7be7d2df06f18172249a5c4af2b2 100644 (file)
@@ -6471,6 +6471,7 @@ static GTY(()) VEC(tree,gc) *generic_type_instances;
 /* Offset from the "steady-state frame pointer" to the frame base,
    within the current function.  */
 static HOST_WIDE_INT frame_pointer_fb_offset;
+static bool frame_pointer_fb_offset_valid;
 
 static VEC (dw_die_ref, heap) *base_types;
 
@@ -13613,6 +13614,7 @@ based_loc_descr (rtx reg, HOST_WIDE_INT offset,
              return new_reg_loc_descr (base_reg, offset);
            }
 
+         gcc_assert (frame_pointer_fb_offset_valid);
          offset += frame_pointer_fb_offset;
          return new_loc_descr (DW_OP_fbreg, offset, 0);
        }
@@ -18336,14 +18338,20 @@ compute_frame_pointer_to_fb_displacement (HOST_WIDE_INT offset)
       elim = XEXP (elim, 0);
     }
 
-  gcc_assert ((SUPPORTS_STACK_ALIGNMENT
-              && (elim == hard_frame_pointer_rtx
-                  || elim == stack_pointer_rtx))
-             || elim == (frame_pointer_needed
-                         ? hard_frame_pointer_rtx
-                         : stack_pointer_rtx));
-
   frame_pointer_fb_offset = -offset;
+
+  /* ??? AVR doesn't set up valid eliminations when there is no stack frame
+     in which to eliminate.  This is because it's stack pointer isn't 
+     directly accessible as a register within the ISA.  To work around
+     this, assume that while we cannot provide a proper value for
+     frame_pointer_fb_offset, we won't need one either.  */
+  frame_pointer_fb_offset_valid
+    = ((SUPPORTS_STACK_ALIGNMENT
+       && (elim == hard_frame_pointer_rtx
+           || elim == stack_pointer_rtx))
+       || elim == (frame_pointer_needed
+                  ? hard_frame_pointer_rtx
+                  : stack_pointer_rtx));
 }
 
 /* Generate a DW_AT_name attribute given some string value to be included as