[Bug ada/81361] [8 regression] broken exception handling at -O2

ebotcazou at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Sep 15 16:46:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81361

--- Comment #16 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> I did this and there's nothing interesting revealed - everything
> consistently gives the same output (and dwarfdump --verify claims it's
> valid).

Not for me though.  Here's the output on the C++ testcase:

(botcazou@goole) ~ $ dwarfdump t.o --eh --verify
----------------------------------------------------------------------
 File: t.o (x86_64)
----------------------------------------------------------------------
Verifying EH Frame... error: FDE row for address 0xffffffffffffffe2 is not in
the FDE address range.

0x00000050: FDE
        length: 0x0000002c
   CIE_pointer: 0x00000000
    start_addr: 0x0000000000000054 ___cold_sect_of__main + 0x00000008
    range_size: 0x0000000000000022 (end_addr = 0x0000000000000076)
  LSDA address: 0x00000000000000a0
  Instructions: 0x0000000000000054: CFA=rsp+8     rip=[rsp]
                DW_CFA_set_loc (0xffffffffffffff8e)
                DW_CFA_def_cfa_offset (16)
                DW_CFA_offset (rbx, -16)
                DW_CFA_nop
                DW_CFA_nop
                0xffffffffffffffe2: CFA=rsp+16    rbx=[rsp]  rip=[rsp+8]


error: FDE row for address 0xffffffffffffff82 is not in the FDE address range.
error: FDE row for address 0xffffffffffffffb2 is not in the FDE address range.

0x000000a8: FDE
        length: 0x00000034
   CIE_pointer: 0x00000000
    start_addr: 0x000000000000004c ___cold_sect_of__main
    range_size: 0x0000000000000031 (end_addr = 0x000000000000007d)
  LSDA address: 0x00000000000000f0
  Instructions: 0x000000000000004c: CFA=rsp+8     rip=[rsp]
                DW_CFA_set_loc (0xffffffffffffff36)
                DW_CFA_def_cfa_offset (16)
                0xffffffffffffff82: CFA=rsp+16    rip=[rsp+8]
                DW_CFA_advance_loc4 (48)
                DW_CFA_def_cfa_offset (8)
                DW_CFA_nop
                DW_CFA_nop
                DW_CFA_nop
                DW_CFA_nop
                DW_CFA_nop
                0xffffffffffffffb2: CFA=rsp+8     rip=[rsp]



3 errors found in EH frame for t.o (x86_64).


But I have an error with the fixed compiler too:

(botcazou@goole) ~ $ dwarfdump t.o --eh --verify
----------------------------------------------------------------------
 File: t.o (x86_64)
----------------------------------------------------------------------
Verifying EH Frame... 
error: 0x00000050: FDE - address range overlaps with previous FDE:

0x000000a8: FDE
        length: 0x0000002c
   CIE_pointer: 0x00000000
    start_addr: 0x000000000000004c ___cold_sect_of__main
    range_size: 0x0000000000000031 (end_addr = 0x000000000000007d)
  LSDA address: 0x00000000000000f0

0x00000050: FDE
        length: 0x0000002c
   CIE_pointer: 0x00000000
    start_addr: 0x0000000000000054 ___cold_sect_of__main + 0x00000008
    range_size: 0x0000000000000022 (end_addr = 0x0000000000000076)
  LSDA address: 0x00000000000000a0

1 errors found in EH frame for t.o (x86_64).

although this yields a working executable.

> There's one point that I'm pursuing, which is that some relocations are
> elided from mach-o objects, where the linker can figure out the right result
> without needing one.  So it could be an oversight, or a ld64 bug too.  Since
> Darwin is now using .cfi_xxxx there's probably not much testing of the DWARF
> stuff outside GCC use.

Switching to the CFI asm directives is indeed a workaround.

> I also have some patches to enable .cfi_xxxx in Darwin GCC, but need to
> rebase them to current trunk.  I guess the hard thing at the moment is to
> know what the true intention  was and therefore which component is buggy.

Not clear at this point, but the assembler seems to be a good candidate.


More information about the Gcc-bugs mailing list