OSDN Git Service

Restore old AT_frame_base code for targets that don't use dwarf2 unwind info.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Oct 2005 23:39:29 +0000 (23:39 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Oct 2005 23:39:29 +0000 (23:39 +0000)
Partial fix.
PR debug/24444
* dwarf2out.c (convert_cfa_to_loc_list): Put inside DWARF2_UNWIND_INFO
ifdef.  Put ifdefs around call in gen_subprogram_die.
(compute_frame_pointer_to_cfa_displacement): Likewise.
(gen_subprogram_die): Restore old code for when DWARF2_UNWIND_INFO is
not defined.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106299 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index 1fb10c7..21e1a20 100644 (file)
@@ -1,5 +1,12 @@
-2005-10-25  James E. Wilson  <wilson@specifix.com>
-
+2005-10-31  James E. Wilson  <wilson@specifix.com>
+
+       PR debug/24444
+       * dwarf2out.c (convert_cfa_to_loc_list): Put inside DWARF2_UNWIND_INFO
+       ifdef.  Put ifdefs around call in gen_subprogram_die.
+       (compute_frame_pointer_to_cfa_displacement): Likewise.
+       (gen_subprogram_die): Restore old code for when DWARF2_UNWIND_INFO is
+       not defined.
+       
        PR rtl-optimization/17356
        *  cfgrtl.c (purge_dead_edges): Undo last change.  In EDGE_EH code,
        add check for CALL_INSN if EDGE_ABRNOMAL_CALL true.
index 8a5c4c2..d780914 100644 (file)
@@ -10290,6 +10290,7 @@ tree_add_const_value_attribute (dw_die_ref var_die, tree decl)
     add_const_value_attribute (var_die, rtl);
 }
 
+#ifdef DWARF2_UNWIND_INFO
 /* Convert the CFI instructions for the current function into a location
    list.  This is used for DW_AT_frame_base when we targeting a dwarf2
    consumer that does not support the dwarf3 DW_OP_call_frame_cfa.  */
@@ -10381,6 +10382,7 @@ compute_frame_pointer_to_cfa_displacement (void)
 
   frame_pointer_cfa_offset = -offset;
 }
+#endif
 
 /* Generate a DW_AT_name attribute given some string value to be included as
    the value of the attribute.  */
@@ -11606,6 +11608,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
       add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde);
 #endif
 
+#ifdef DWARF2_UNWIND_INFO
       /* We define the "frame base" as the function's CFA.  This is more
         convenient for several reasons: (1) It's stable across the prologue
         and epilogue, which makes it better than just a frame pointer,
@@ -11632,6 +11635,17 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
         debugger about.  We'll need to adjust all frame_base references
         by this displacement.  */
       compute_frame_pointer_to_cfa_displacement ();
+#else
+      /* For targets which support DWARF2, but not DWARF2 call-frame info,
+        we just use the stack pointer or frame pointer.  */
+      /* ??? Should investigate getting better info via callbacks, or else
+        by interpreting the IA-64 unwind info.  */
+      {
+       rtx fp_reg
+         = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
+       add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor (fp_reg));
+      }
+#endif
 
       if (cfun->static_chain_decl)
        add_AT_location_description (subr_die, DW_AT_static_link,