From 30920792aa8ae899d7b3d26db23af812f2f008a5 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Thu, 31 Aug 2006 17:35:32 +0000 Subject: PR other/22313 * dwarf2out.c (add_fde_cfi): Use a set_loc if the current label is NULL, otherwise use an advance_loc4 to adjust relative to the current label. (output_cfi) : Update the current label. (dwarf2out_switch_text_section): Reset the current label to avoid using advance_loc4 over section boundaries. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@116604 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/dwarf2out.c | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8f1fd347616..7a6c3e167b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-08-31 Roger Sayle + + PR other/22313 + * dwarf2out.c (add_fde_cfi): Use a set_loc if the current label is + NULL, otherwise use an advance_loc4 to adjust relative to the + current label. + (output_cfi) : Update the current label. + (dwarf2out_switch_text_section): Reset the current label to avoid + using advance_loc4 over section boundaries. + 2006-08-31 Andreas Krebbel PR target/24367 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 76fd7f07f9e..9342236966d 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -628,13 +628,19 @@ add_fde_cfi (const char *label, dw_cfi_ref cfi) { dw_cfi_ref xcfi; - fde->dw_fde_current_label = label = xstrdup (label); + label = xstrdup (label); /* Set the location counter to the new label. */ xcfi = new_cfi (); - xcfi->dw_cfi_opc = DW_CFA_advance_loc4; + /* If we have a current label, advance from there, otherwise + set the location directly using set_loc. */ + xcfi->dw_cfi_opc = fde->dw_fde_current_label + ? DW_CFA_advance_loc4 + : DW_CFA_set_loc; xcfi->dw_cfi_oprnd1.dw_cfi_addr = label; add_cfi (&fde->dw_fde_cfi, xcfi); + + fde->dw_fde_current_label = label; } add_cfi (&fde->dw_fde_cfi, cfi); @@ -2069,6 +2075,7 @@ output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh) else dw2_asm_output_addr (DWARF2_ADDR_SIZE, cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL); + fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr; break; case DW_CFA_advance_loc1: @@ -6919,6 +6926,10 @@ dwarf2out_switch_text_section (void) fde->dw_fde_unlikely_section_label = cfun->cold_section_label; fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label; have_multiple_function_sections = true; + + /* Reset the current label on switching text sections, so that we + don't attempt to advance_loc4 between labels in different sections. */ + fde->dw_fde_current_label = NULL; } /* Output the location list given to us. */ -- cgit v1.2.3