diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2006-02-04 22:08:04 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2006-02-04 22:08:04 +0000 |
commit | 658f32fda265f363b18b912ad3560eebeeb28b64 (patch) | |
tree | fb40a2b7673d57f55dfc5ac1a79cb20828a95882 | |
parent | 5460aa9c92db4858927d7a7c2118e71d7c90aa6d (diff) | |
download | gcc-658f32fda265f363b18b912ad3560eebeeb28b64.zip gcc-658f32fda265f363b18b912ad3560eebeeb28b64.tar.gz gcc-658f32fda265f363b18b912ad3560eebeeb28b64.tar.bz2 |
re PR debug/24444 (invalid register in debug info)
PR debug/24444
* config/ia64/ia64.c: Include debug.h.
(MAX_ARTIFICIAL_LABEL_BYTES): New.
(ia64_label_after_insn, ia64_dwarf2out_def_steady_cfa): New.
(IA64_CHANGE_CFA_IN_EPILOGUE): Define to 0.
(process_epilogue, process_set, process_for_unwind_directive):
Output unwind info only if requested. Add CFA info if requested.
Add new arguments as needed. Adjust callers.
* config/ia64/ia64.h (ARG_POINTER_CFA_OFFSET): Override
incorrect default.
(DWARF2_FRAME_INFO): Define to zero.
* config/ia64/unwind-ia64.c: Remove code that compensated for
the CFA offset error fixed above.
* config/ia64/t-ia64 (ia64.o): Depend on debug.h.
* dwarf2out.c (DWARF2_FRAME_INFO): Define default.
(dwarf2out_do_frame): Require nonzero DWARF2_UNWIND_INFO for
-funwind-tables and -fexceptions to enable frame info.
(dwarf2out_frame_init): Define initial CFA even if
DWARF2_UNWIND_INFO is disabled. Call initial_return_save if
DWARF2_UNWIND_INFO is nonzero, not just defined.
(dwarf2out_frame_finish): Output non-EH call frame info only
if DWARF2_FRAME_INFO is nonzero.
(convert_cfa_to_loc_list,
compute_frame_pointer_to_cfa_displacement): Define even if
unwind info is not supported.
(gen_subprogram_die): Use the above unconditionally. Remove
legacy alternate code.
* toplev.c (compile_file): Compile in call to
dwarf2out_frame_finish if DWARF2_DEBUGGING_INFO is defined.
(lang_dependent_init): Ditto for dwarf2out_frame_init.
From-SVN: r110594
-rw-r--r-- | gcc/ChangeLog | 33 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 180 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 12 | ||||
-rw-r--r-- | gcc/config/ia64/t-ia64 | 2 | ||||
-rw-r--r-- | gcc/config/ia64/unwind-ia64.c | 4 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 46 | ||||
-rw-r--r-- | gcc/toplev.c | 4 |
7 files changed, 206 insertions, 75 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23e9d84..e1fac08 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,36 @@ +2006-02-04 Alexandre Oliva <aoliva@redhat.com> + + PR debug/24444 + * config/ia64/ia64.c: Include debug.h. + (MAX_ARTIFICIAL_LABEL_BYTES): New. + (ia64_label_after_insn, ia64_dwarf2out_def_steady_cfa): New. + (IA64_CHANGE_CFA_IN_EPILOGUE): Define to 0. + (process_epilogue, process_set, process_for_unwind_directive): + Output unwind info only if requested. Add CFA info if requested. + Add new arguments as needed. Adjust callers. + * config/ia64/ia64.h (ARG_POINTER_CFA_OFFSET): Override + incorrect default. + (DWARF2_FRAME_INFO): Define to zero. + * config/ia64/unwind-ia64.c: Remove code that compensated for + the CFA offset error fixed above. + * config/ia64/t-ia64 (ia64.o): Depend on debug.h. + * dwarf2out.c (DWARF2_FRAME_INFO): Define default. + (dwarf2out_do_frame): Require nonzero DWARF2_UNWIND_INFO for + -funwind-tables and -fexceptions to enable frame info. + (dwarf2out_frame_init): Define initial CFA even if + DWARF2_UNWIND_INFO is disabled. Call initial_return_save if + DWARF2_UNWIND_INFO is nonzero, not just defined. + (dwarf2out_frame_finish): Output non-EH call frame info only + if DWARF2_FRAME_INFO is nonzero. + (convert_cfa_to_loc_list, + compute_frame_pointer_to_cfa_displacement): Define even if + unwind info is not supported. + (gen_subprogram_die): Use the above unconditionally. Remove + legacy alternate code. + * toplev.c (compile_file): Compile in call to + dwarf2out_frame_finish if DWARF2_DEBUGGING_INFO is defined. + (lang_dependent_init): Ditto for dwarf2out_frame_init. + 2006-02-04 David Edelsohn <edelsohn@gnu.org> Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index e676753..cee13b0 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -53,6 +53,7 @@ Boston, MA 02110-1301, USA. */ #include "cfglayout.h" #include "tree-gimple.h" #include "intl.h" +#include "debug.h" /* This is used for communication between ASM_OUTPUT_LABEL and ASM_OUTPUT_LABELREF. */ @@ -190,8 +191,8 @@ static void final_emit_insn_group_barriers (FILE *); static void emit_predicate_relation_info (void); static void ia64_reorg (void); static bool ia64_in_small_data_p (tree); -static void process_epilogue (void); -static int process_set (FILE *, rtx); +static void process_epilogue (FILE *, rtx, bool, bool); +static int process_set (FILE *, rtx, rtx, bool, bool); static bool ia64_assemble_integer (rtx, unsigned int, int); static void ia64_output_function_prologue (FILE *, HOST_WIDE_INT); @@ -7971,29 +7972,84 @@ static bool last_block; static bool need_copy_state; +#ifndef MAX_ARTIFICIAL_LABEL_BYTES +# define MAX_ARTIFICIAL_LABEL_BYTES 30 +#endif + +/* Emit a debugging label after a call-frame-related insn. We'd + rather output the label right away, but we'd have to output it + after, not before, the instruction, and the instruction has not + been output yet. So we emit the label after the insn, delete it to + avoid introducing basic blocks, and mark it as preserved, such that + it is still output, given that it is referenced in debug info. */ + +static const char * +ia64_emit_deleted_label_after_insn (rtx insn) +{ + char label[MAX_ARTIFICIAL_LABEL_BYTES]; + rtx lb = gen_label_rtx (); + rtx label_insn = emit_label_after (lb, insn); + + LABEL_PRESERVE_P (lb) = 1; + + delete_insn (label_insn); + + ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (label_insn)); + + return xstrdup (label); +} + +/* Define the CFA after INSN with the steady-state definition. */ + +static void +ia64_dwarf2out_def_steady_cfa (rtx insn) +{ + rtx fp = frame_pointer_needed + ? hard_frame_pointer_rtx + : stack_pointer_rtx; + + dwarf2out_def_cfa + (ia64_emit_deleted_label_after_insn (insn), + REGNO (fp), + ia64_initial_elimination_offset + (REGNO (arg_pointer_rtx), REGNO (fp)) + + ARG_POINTER_CFA_OFFSET (current_function_decl)); +} + +/* The generic dwarf2 frame debug info generator does not define a + separate region for the very end of the epilogue, so refrain from + doing so in the IA64-specific code as well. */ + +#define IA64_CHANGE_CFA_IN_EPILOGUE 0 + /* The function emits unwind directives for the start of an epilogue. */ static void -process_epilogue (void) +process_epilogue (FILE *asm_out_file, rtx insn, bool unwind, bool frame) { /* If this isn't the last block of the function, then we need to label the current state, and copy it back in at the start of the next block. */ if (!last_block) { - fprintf (asm_out_file, "\t.label_state %d\n", - ++cfun->machine->state_num); + if (unwind) + fprintf (asm_out_file, "\t.label_state %d\n", + ++cfun->machine->state_num); need_copy_state = true; } - fprintf (asm_out_file, "\t.restore sp\n"); + if (unwind) + fprintf (asm_out_file, "\t.restore sp\n"); + if (IA64_CHANGE_CFA_IN_EPILOGUE && frame) + dwarf2out_def_cfa (ia64_emit_deleted_label_after_insn (insn), + STACK_POINTER_REGNUM, INCOMING_FRAME_SP_OFFSET); } /* This function processes a SET pattern looking for specific patterns which result in emitting an assembly directive required for unwinding. */ static int -process_set (FILE *asm_out_file, rtx pat) +process_set (FILE *asm_out_file, rtx pat, rtx insn, bool unwind, bool frame) { rtx src = SET_SRC (pat); rtx dest = SET_DEST (pat); @@ -8009,8 +8065,11 @@ process_set (FILE *asm_out_file, rtx pat) /* If this is the final destination for ar.pfs, then this must be the alloc in the prologue. */ if (dest_regno == current_frame_info.reg_save_ar_pfs) - fprintf (asm_out_file, "\t.save ar.pfs, r%d\n", - ia64_dbx_register_number (dest_regno)); + { + if (unwind) + fprintf (asm_out_file, "\t.save ar.pfs, r%d\n", + ia64_dbx_register_number (dest_regno)); + } else { /* This must be an alloc before a sibcall. We must drop the @@ -8021,8 +8080,9 @@ process_set (FILE *asm_out_file, rtx pat) sp" now. */ if (current_frame_info.total_size == 0 && !frame_pointer_needed) /* if haven't done process_epilogue() yet, do it now */ - process_epilogue (); - fprintf (asm_out_file, "\t.prologue\n"); + process_epilogue (asm_out_file, insn, unwind, frame); + if (unwind) + fprintf (asm_out_file, "\t.prologue\n"); } return 1; } @@ -8038,16 +8098,22 @@ process_set (FILE *asm_out_file, rtx pat) gcc_assert (op0 == dest && GET_CODE (op1) == CONST_INT); if (INTVAL (op1) < 0) - fprintf (asm_out_file, "\t.fframe "HOST_WIDE_INT_PRINT_DEC"\n", - -INTVAL (op1)); + { + gcc_assert (!frame_pointer_needed); + if (unwind) + fprintf (asm_out_file, "\t.fframe "HOST_WIDE_INT_PRINT_DEC"\n", + -INTVAL (op1)); + if (frame) + ia64_dwarf2out_def_steady_cfa (insn); + } else - process_epilogue (); + process_epilogue (asm_out_file, insn, unwind, frame); } else { gcc_assert (GET_CODE (src) == REG && REGNO (src) == HARD_FRAME_POINTER_REGNUM); - process_epilogue (); + process_epilogue (asm_out_file, insn, unwind, frame); } return 1; @@ -8064,33 +8130,40 @@ process_set (FILE *asm_out_file, rtx pat) case BR_REG (0): /* Saving return address pointer. */ gcc_assert (dest_regno == current_frame_info.reg_save_b0); - fprintf (asm_out_file, "\t.save rp, r%d\n", - ia64_dbx_register_number (dest_regno)); + if (unwind) + fprintf (asm_out_file, "\t.save rp, r%d\n", + ia64_dbx_register_number (dest_regno)); return 1; case PR_REG (0): gcc_assert (dest_regno == current_frame_info.reg_save_pr); - fprintf (asm_out_file, "\t.save pr, r%d\n", - ia64_dbx_register_number (dest_regno)); + if (unwind) + fprintf (asm_out_file, "\t.save pr, r%d\n", + ia64_dbx_register_number (dest_regno)); return 1; case AR_UNAT_REGNUM: gcc_assert (dest_regno == current_frame_info.reg_save_ar_unat); - fprintf (asm_out_file, "\t.save ar.unat, r%d\n", - ia64_dbx_register_number (dest_regno)); + if (unwind) + fprintf (asm_out_file, "\t.save ar.unat, r%d\n", + ia64_dbx_register_number (dest_regno)); return 1; case AR_LC_REGNUM: gcc_assert (dest_regno == current_frame_info.reg_save_ar_lc); - fprintf (asm_out_file, "\t.save ar.lc, r%d\n", - ia64_dbx_register_number (dest_regno)); + if (unwind) + fprintf (asm_out_file, "\t.save ar.lc, r%d\n", + ia64_dbx_register_number (dest_regno)); return 1; case STACK_POINTER_REGNUM: gcc_assert (dest_regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed); - fprintf (asm_out_file, "\t.vframe r%d\n", - ia64_dbx_register_number (dest_regno)); + if (unwind) + fprintf (asm_out_file, "\t.vframe r%d\n", + ia64_dbx_register_number (dest_regno)); + if (frame) + ia64_dwarf2out_def_steady_cfa (insn); return 1; default: @@ -8135,35 +8208,41 @@ process_set (FILE *asm_out_file, rtx pat) { case BR_REG (0): gcc_assert (!current_frame_info.reg_save_b0); - fprintf (asm_out_file, "\t%s rp, %ld\n", saveop, off); + if (unwind) + fprintf (asm_out_file, "\t%s rp, %ld\n", saveop, off); return 1; case PR_REG (0): gcc_assert (!current_frame_info.reg_save_pr); - fprintf (asm_out_file, "\t%s pr, %ld\n", saveop, off); + if (unwind) + fprintf (asm_out_file, "\t%s pr, %ld\n", saveop, off); return 1; case AR_LC_REGNUM: gcc_assert (!current_frame_info.reg_save_ar_lc); - fprintf (asm_out_file, "\t%s ar.lc, %ld\n", saveop, off); + if (unwind) + fprintf (asm_out_file, "\t%s ar.lc, %ld\n", saveop, off); return 1; case AR_PFS_REGNUM: gcc_assert (!current_frame_info.reg_save_ar_pfs); - fprintf (asm_out_file, "\t%s ar.pfs, %ld\n", saveop, off); + if (unwind) + fprintf (asm_out_file, "\t%s ar.pfs, %ld\n", saveop, off); return 1; case AR_UNAT_REGNUM: gcc_assert (!current_frame_info.reg_save_ar_unat); - fprintf (asm_out_file, "\t%s ar.unat, %ld\n", saveop, off); + if (unwind) + fprintf (asm_out_file, "\t%s ar.unat, %ld\n", saveop, off); return 1; case GR_REG (4): case GR_REG (5): case GR_REG (6): case GR_REG (7): - fprintf (asm_out_file, "\t.save.g 0x%x\n", - 1 << (src_regno - GR_REG (4))); + if (unwind) + fprintf (asm_out_file, "\t.save.g 0x%x\n", + 1 << (src_regno - GR_REG (4))); return 1; case BR_REG (1): @@ -8171,24 +8250,27 @@ process_set (FILE *asm_out_file, rtx pat) case BR_REG (3): case BR_REG (4): case BR_REG (5): - fprintf (asm_out_file, "\t.save.b 0x%x\n", - 1 << (src_regno - BR_REG (1))); + if (unwind) + fprintf (asm_out_file, "\t.save.b 0x%x\n", + 1 << (src_regno - BR_REG (1))); return 1; case FR_REG (2): case FR_REG (3): case FR_REG (4): case FR_REG (5): - fprintf (asm_out_file, "\t.save.f 0x%x\n", - 1 << (src_regno - FR_REG (2))); + if (unwind) + fprintf (asm_out_file, "\t.save.f 0x%x\n", + 1 << (src_regno - FR_REG (2))); return 1; case FR_REG (16): case FR_REG (17): case FR_REG (18): case FR_REG (19): case FR_REG (20): case FR_REG (21): case FR_REG (22): case FR_REG (23): case FR_REG (24): case FR_REG (25): case FR_REG (26): case FR_REG (27): case FR_REG (28): case FR_REG (29): case FR_REG (30): case FR_REG (31): - fprintf (asm_out_file, "\t.save.gf 0x0, 0x%x\n", - 1 << (src_regno - FR_REG (12))); + if (unwind) + fprintf (asm_out_file, "\t.save.gf 0x0, 0x%x\n", + 1 << (src_regno - FR_REG (12))); return 1; default: @@ -8205,8 +8287,11 @@ process_set (FILE *asm_out_file, rtx pat) void process_for_unwind_directive (FILE *asm_out_file, rtx insn) { - if (flag_unwind_tables - || (flag_exceptions && !USING_SJLJ_EXCEPTIONS)) + bool unwind = (flag_unwind_tables + || (flag_exceptions && !USING_SJLJ_EXCEPTIONS)); + bool frame = dwarf2out_do_frame (); + + if (unwind || frame) { rtx pat; @@ -8218,9 +8303,14 @@ process_for_unwind_directive (FILE *asm_out_file, rtx insn) /* Restore unwind state from immediately before the epilogue. */ if (need_copy_state) { - fprintf (asm_out_file, "\t.body\n"); - fprintf (asm_out_file, "\t.copy_state %d\n", - cfun->machine->state_num); + if (unwind) + { + fprintf (asm_out_file, "\t.body\n"); + fprintf (asm_out_file, "\t.copy_state %d\n", + cfun->machine->state_num); + } + if (IA64_CHANGE_CFA_IN_EPILOGUE && frame) + ia64_dwarf2out_def_steady_cfa (insn); need_copy_state = false; } } @@ -8237,7 +8327,7 @@ process_for_unwind_directive (FILE *asm_out_file, rtx insn) switch (GET_CODE (pat)) { case SET: - process_set (asm_out_file, pat); + process_set (asm_out_file, pat, insn, unwind, frame); break; case PARALLEL: @@ -8248,7 +8338,7 @@ process_for_unwind_directive (FILE *asm_out_file, rtx insn) { rtx x = XVECEXP (pat, 0, par_index); if (GET_CODE (x) == SET) - process_set (asm_out_file, x); + process_set (asm_out_file, x, insn, unwind, frame); } break; } diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 72fff46..3023236 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -981,6 +981,12 @@ enum reg_class On some machines it may depend on the data type of the function. */ #define FIRST_PARM_OFFSET(FUNDECL) 0 +/* The CFA is defined as the SP at the call site, so we have to take + into account that the first argument pointer is + STACK_POINTER_OFFSET bytes off the stack pointer. */ +#define ARG_POINTER_CFA_OFFSET(FNDECL) \ + (FIRST_PARM_OFFSET (FNDECL) - STACK_POINTER_OFFSET) + /* A C expression whose value is RTL representing the value of the return address for the frame COUNT steps up from the current frame, after the prologue. */ @@ -1867,6 +1873,12 @@ do { \ #define DWARF2_DEBUGGING_INFO 1 +/* We do not want call-frame info to be output, since debuggers are + supposed to use the target unwind info. Leave this undefined it + TARGET_UNWIND_INFO might ever be false. */ + +#define DWARF2_FRAME_INFO 0 + #define DWARF2_ASM_LINE_DEBUG_INFO (TARGET_DWARF2_ASM) /* Use tags for debug info labels, so that they don't break instruction diff --git a/gcc/config/ia64/t-ia64 b/gcc/config/ia64/t-ia64 index 824cc41..e3713f9 100644 --- a/gcc/config/ia64/t-ia64 +++ b/gcc/config/ia64/t-ia64 @@ -50,3 +50,5 @@ ia64-c.o: $(srcdir)/config/ia64/ia64-c.c $(CONFIG_H) $(SYSTEM_H) \ # genattrtab generates very long string literals. insn-attrtab.o-warn = -Wno-error + +ia64.o: debug.h diff --git a/gcc/config/ia64/unwind-ia64.c b/gcc/config/ia64/unwind-ia64.c index c1be313..bed14f0 100644 --- a/gcc/config/ia64/unwind-ia64.c +++ b/gcc/config/ia64/unwind-ia64.c @@ -2067,7 +2067,7 @@ uw_advance_context (struct _Unwind_Context *context, _Unwind_FrameState *fs) } /* Fill in CONTEXT for top-of-stack. The only valid registers at this - level will be the return address and the CFA. Note that CFA = SP+16. */ + level will be the return address and the CFA. */ #define uw_init_context(CONTEXT) \ do { \ @@ -2083,7 +2083,7 @@ uw_init_context_1 (struct _Unwind_Context *context, void *bsp) { void *rp = __builtin_extract_return_addr (__builtin_return_address (0)); /* Set psp to the caller's stack pointer. */ - void *psp = __builtin_dwarf_cfa () - 16; + void *psp = __builtin_dwarf_cfa (); _Unwind_FrameState fs; unsigned long rnat, tmp1, tmp2; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 3cffc4e..78afb5a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -90,20 +90,31 @@ static void dwarf2out_source_line (unsigned int, const char *); DW_CFA_... = DWARF2 CFA call frame instruction DW_TAG_... = DWARF2 DIE tag */ +#ifndef DWARF2_FRAME_INFO +# ifdef DWARF2_DEBUGGING_INFO +# define DWARF2_FRAME_INFO \ + (write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG) +# else +# define DWARF2_FRAME_INFO 0 +# endif +#endif + /* Decide whether we want to emit frame unwind information for the current translation unit. */ int dwarf2out_do_frame (void) { + /* We want to emit correct CFA location expressions or lists, so we + have to return true if we're going to output debug info, even if + we're not going to output frame or unwind info. */ return (write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG -#ifdef DWARF2_FRAME_INFO || DWARF2_FRAME_INFO -#endif #ifdef DWARF2_UNWIND_INFO - || flag_unwind_tables - || (flag_exceptions && ! USING_SJLJ_EXCEPTIONS) + || (DWARF2_UNWIND_INFO + && (flag_unwind_tables + || (flag_exceptions && ! USING_SJLJ_EXCEPTIONS))) #endif ); } @@ -2586,10 +2597,12 @@ dwarf2out_frame_init (void) /* Generate the CFA instructions common to all FDE's. Do it now for the sake of lookup_cfa. */ -#ifdef DWARF2_UNWIND_INFO /* On entry, the Canonical Frame Address is at SP. */ dwarf2out_def_cfa (NULL, STACK_POINTER_REGNUM, INCOMING_FRAME_SP_OFFSET); - initial_return_save (INCOMING_RETURN_ADDR_RTX); + +#ifdef DWARF2_UNWIND_INFO + if (DWARF2_UNWIND_INFO) + initial_return_save (INCOMING_RETURN_ADDR_RTX); #endif } @@ -2597,12 +2610,7 @@ void dwarf2out_frame_finish (void) { /* Output call frame information. */ - if (write_symbols == DWARF2_DEBUG - || write_symbols == VMS_AND_DWARF2_DEBUG -#ifdef DWARF2_FRAME_INFO - || DWARF2_FRAME_INFO -#endif - ) + if (DWARF2_FRAME_INFO) output_call_frame_info (0); #ifndef TARGET_UNWIND_INFO @@ -10326,7 +10334,6 @@ 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. */ @@ -10433,7 +10440,6 @@ 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. */ @@ -11668,7 +11674,6 @@ 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, @@ -11695,17 +11700,6 @@ 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, diff --git a/gcc/toplev.c b/gcc/toplev.c index f6cfe7c..6b49f17 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1028,7 +1028,7 @@ compile_file (void) /* Do dbx symbols. */ timevar_push (TV_SYMOUT); -#ifdef DWARF2_UNWIND_INFO +#if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO if (dwarf2out_do_frame ()) dwarf2out_frame_finish (); #endif @@ -1868,7 +1868,7 @@ lang_dependent_init (const char *name) predefined types. */ timevar_push (TV_SYMOUT); -#ifdef DWARF2_UNWIND_INFO +#if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO if (dwarf2out_do_frame ()) dwarf2out_frame_init (); #endif |