From 033a235627b9e8ca6a18d459863691881175503f Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 2 Oct 2009 18:52:15 +0000 Subject: [PATCH] PR debug/40521 * configure.ac (HAVE_GAS_CFI_SECTIONS_DIRECTIVE): New test. * configure: Regenerated. * config.in: Regenerated. * dwarf2out.c (dwarf2out_do_cfi_asm): Return false if !HAVE_GAS_CFI_SECTIONS_DIRECTIVE and not emitting .eh_frame. (dwarf2out_init): If HAVE_GAS_CFI_SECTIONS_DIRECTIVE and not emitting .eh_frame, emit .cfi_sections .debug_frame directive. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@152414 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/config.in | 6 ++++++ gcc/configure | 36 ++++++++++++++++++++++++++++++++++++ gcc/configure.ac | 11 +++++++++++ gcc/dwarf2out.c | 20 ++++++++++++++++++++ 5 files changed, 83 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00a6055e1ad..f16eff0161a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,15 @@ 2009-10-02 Jakub Jelinek + PR debug/40521 + * configure.ac (HAVE_GAS_CFI_SECTIONS_DIRECTIVE): New test. + * configure: Regenerated. + * config.in: Regenerated. + * dwarf2out.c (dwarf2out_do_cfi_asm): Return false if + !HAVE_GAS_CFI_SECTIONS_DIRECTIVE and not emitting .eh_frame. + (dwarf2out_init): If HAVE_GAS_CFI_SECTIONS_DIRECTIVE and + not emitting .eh_frame, emit .cfi_sections .debug_frame + directive. + PR debug/41404 PR debug/41353 * cfgexpand.c (expand_debug_expr) : Don't create diff --git a/gcc/config.in b/gcc/config.in index 9ee0bde2b5a..12573fd1579 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -887,6 +887,12 @@ #endif +/* Define 0/1 if your assembler supports .cfi_sections. */ +#ifndef USED_FOR_TARGET +#undef HAVE_GAS_CFI_SECTIONS_DIRECTIVE +#endif + + /* Define if your assembler supports the .loc discriminator sub-directive. */ #ifndef USED_FOR_TARGET #undef HAVE_GAS_DISCRIMINATOR diff --git a/gcc/configure b/gcc/configure index dbd10a5ef2b..a1e28a79e4b 100755 --- a/gcc/configure +++ b/gcc/configure @@ -21542,6 +21542,42 @@ cat >>confdefs.h <<_ACEOF _ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for cfi sections directive" >&5 +$as_echo_n "checking assembler for cfi sections directive... " >&6; } +if test "${gcc_cv_as_cfi_sections_directive+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_as_cfi_sections_directive=no + if test x$gcc_cv_as != x; then + echo ' .text + .cfi_sections .debug_frame, .eh_frame + .cfi_startproc + .cfi_endproc' > conftest.s + if { ac_try='$gcc_cv_as -o conftest.o conftest.s >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + gcc_cv_as_cfi_sections_directive=yes + else + echo "configure: failed program was" >&5 + cat conftest.s >&5 + fi + rm -f conftest.o conftest.s + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_sections_directive" >&5 +$as_echo "$gcc_cv_as_cfi_sections_directive" >&6; } + + +cat >>confdefs.h <<_ACEOF +#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE `if test $gcc_cv_as_cfi_sections_directive = yes; + then echo 1; else echo 0; fi` +_ACEOF + + # GAS versions up to and including 2.11.0 may mis-optimize # .eh_frame data. { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for eh_frame optimization" >&5 diff --git a/gcc/configure.ac b/gcc/configure.ac index 96b3b5db56e..d7597d28341 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -2301,6 +2301,17 @@ AC_DEFINE_UNQUOTED(HAVE_GAS_CFI_PERSONALITY_DIRECTIVE, then echo 1; else echo 0; fi`], [Define 0/1 if your assembler supports .cfi_personality.]) +gcc_GAS_CHECK_FEATURE([cfi sections directive], + gcc_cv_as_cfi_sections_directive, ,, +[ .text + .cfi_sections .debug_frame, .eh_frame + .cfi_startproc + .cfi_endproc]) +AC_DEFINE_UNQUOTED(HAVE_GAS_CFI_SECTIONS_DIRECTIVE, + [`if test $gcc_cv_as_cfi_sections_directive = yes; + then echo 1; else echo 0; fi`], + [Define 0/1 if your assembler supports .cfi_sections.]) + # GAS versions up to and including 2.11.0 may mis-optimize # .eh_frame data. gcc_GAS_CHECK_FEATURE(eh_frame optimization, gcc_cv_as_eh_frame, diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 3a0e4f39af1..2728cfdbbfb 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -179,6 +179,16 @@ dwarf2out_do_cfi_asm (void) if ((enc & 0x70) != 0 && (enc & 0x70) != DW_EH_PE_pcrel) return false; + if (!HAVE_GAS_CFI_SECTIONS_DIRECTIVE) + { +#ifdef TARGET_UNWIND_INFO + return false; +#else + if (USING_SJLJ_EXCEPTIONS || (!flag_unwind_tables && !flag_exceptions)) + return false; +#endif + } + saved_do_cfi_asm = true; return true; } @@ -18628,6 +18638,16 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) switch_to_section (cold_text_section); ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label); } + +#ifdef HAVE_GAS_CFI_SECTIONS_DIRECTIVE + if (dwarf2out_do_cfi_asm ()) + { +#ifndef TARGET_UNWIND_INFO + if (USING_SJLJ_EXCEPTIONS || (!flag_unwind_tables && !flag_exceptions)) +#endif + fprintf (asm_out_file, "\t.cfi_sections\t.debug_frame\n"); + } +#endif } /* A helper function for dwarf2out_finish called through -- 2.11.0