I've been testing a backport of Jakub's patch to gcc-4.4, but it breaks bootstrap on i686-linux with binutils-2.18.50.0.6 (Fedora 9) because stage1 gcc outputs .cfi_sections directives even though the assembler doesn't support them.
Current gcc-4.5 bootstraps Ok on the same machine.
The configure test correctly detects that cfi sections don't work with this as, and records that with "#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE 0".
In gcc-4.5 dwarf2out_do_cfi_asm() returns true. The code in dwarf2out_init() inside #ifdef HAVE_GAS_CFI_SECTIONS_DIRECTIVE finds that USING_SJLJ_EXCEPTIONS is false and !flag_exceptions is also false, so the call to emit a .cfi_sections directive is not made. (!flag_unwind_tables varies, but it does not matter since it's && with !flag_exceptions which always is false.)
In gcc-4.4 dwarf2out_do_cfi_asm() also returns true. The code in dwarf2out_init() finds that USING_SJLJ_EXCEPTIONS is false but both !flag_unwind_tables and !flag_exceptions are true, so a .cfi_sections directive is emitted, causing the assembler to signal an error.
One thing that I find strange is that dwarf2out_do_cfi_asm() unconditionally tests HAVE_GAS_CFI_SECTIONS_DIRECTIVE in an "if (!...)", which works since that symbol is #defined as 0 or 1, while dwarf2out_init() instead has an #ifdef HAVE_GAS_CFI_SECTIONS_DIRECTIVE around the conditional output of the directive.
Shouldn't that #ifdef be an #if?
I've been testing a backport of Jakub's patch to gcc-4.4, but it breaks bootstrap on i686-linux with binutils- 2.18.50. 0.6 (Fedora 9) because stage1 gcc outputs .cfi_sections directives even though the assembler doesn't support them.
Current gcc-4.5 bootstraps Ok on the same machine.
The configure test correctly detects that cfi sections don't work with this as, and records that with "#define HAVE_GAS_ CFI_SECTIONS_ DIRECTIVE 0".
In gcc-4.5 dwarf2out_ do_cfi_ asm() returns true. The code in dwarf2out_init() inside #ifdef HAVE_GAS_ CFI_SECTIONS_ DIRECTIVE finds that USING_SJLJ_ EXCEPTIONS is false and !flag_exceptions is also false, so the call to emit a .cfi_sections directive is not made. (!flag_ unwind_ tables varies, but it does not matter since it's && with !flag_exceptions which always is false.)
In gcc-4.4 dwarf2out_ do_cfi_ asm() also returns true. The code in dwarf2out_init() finds that USING_SJLJ_ EXCEPTIONS is false but both !flag_unwind_tables and !flag_exceptions are true, so a .cfi_sections directive is emitted, causing the assembler to signal an error.
One thing that I find strange is that dwarf2out_ do_cfi_ asm() unconditionally tests HAVE_GAS_ CFI_SECTIONS_ DIRECTIVE in an "if (!...)", which works since that symbol is #defined as 0 or 1, while dwarf2out_init() instead has an #ifdef HAVE_GAS_ CFI_SECTIONS_ DIRECTIVE around the conditional output of the directive.
Shouldn't that #ifdef be an #if?