--- branches/gcc-4_1-branch/gcc/dwarf2out.c 2006/09/01 15:38:00 116627 +++ branches/gcc-4_1-branch/gcc/dwarf2out.c 2006/09/01 15:47:29 116628 @@ -656,13 +656,19 @@ { 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); @@ -2050,6 +2056,7 @@ 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: @@ -3934,6 +3941,10 @@ fde->dw_fde_unlikely_section_label = cfun->cold_section_label; fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label; have_switched_text_section = 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; } #endif