From d3073c70c5db2f657da6185f16662d14e3e32270 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 5 Oct 2005 11:19:26 -0700 Subject: [PATCH] re PR target/23602 (1081 test failures in libjava, when configured for i486-linux) PR target/23602 * toplev.c (process_options): Warn about unsupported combinations of unwind tables and omit-frame-pointer. * config/i386/i386.c (override_options): Similarly. Enable accumulate-outgoing-args if not explicitly disabled. testsuite/ * g++.dg/eh/omit-frame-pointer.C: Remove i?86 specific options. * g++.dg/eh/omit-frame-pointer2.C: Likewise. libjava/ * configure.host (i?86-*): Set -fomit-frame-pointer in libgcj_flags, but not BACKTRACESPEC. (x86_64-*): Similarly. Don't set -ffloat-store in 64-bit mode. From-SVN: r105009 --- gcc/ChangeLog | 8 ++++++++ gcc/config/i386/i386.c | 15 +++++++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/eh/omit-frame-pointer.C | 1 - gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C | 1 - gcc/toplev.c | 12 ++++++++++++ libjava/ChangeLog | 7 +++++++ libjava/configure.host | 15 ++++++++++++--- 8 files changed, 60 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c33853b3d27..677e379a9d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-10-05 Richard Henderson + + PR target/23602 + * toplev.c (process_options): Warn about unsupported combinations + of unwind tables and omit-frame-pointer. + * config/i386/i386.c (override_options): Similarly. Enable + accumulate-outgoing-args if not explicitly disabled. + 2005-10-05 Steve Ellcey * vect.md (vec_initv2si): Fix typo of V2SF to V2SI. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6d90a009cde..fa2957080ef 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1653,6 +1653,21 @@ override_options (void) && !optimize_size) target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS; + /* ??? Unwind info is not correct around the CFG unless either a frame + pointer is present or M_A_O_A is set. Fixing this requires rewriting + unwind info generation to be aware of the CFG and propagating states + around edges. */ + if ((flag_unwind_tables || flag_asynchronous_unwind_tables + || flag_exceptions || flag_non_call_exceptions) + && flag_omit_frame_pointer + && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS)) + { + if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS) + warning (0, "unwind tables currently require either a frame pointer " + "or -maccumulate-outgoing-args for correctness"); + target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS; + } + /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix. */ { char *p; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07f2a27a502..8d26dd24fb6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-10-05 Richard Henderson + + PR target/23602 + * g++.dg/eh/omit-frame-pointer.C: Remove i?86 specific options. + * g++.dg/eh/omit-frame-pointer2.C: Likewise. + 2005-10-05 Dale Johannesen * gcc.c-torture/execute/float-floor.c: New. diff --git a/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C b/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C index 01821a12fe9..3792e11fe4c 100644 --- a/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C +++ b/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C @@ -1,6 +1,5 @@ // { dg-do run } // { dg-options -fomit-frame-pointer } -// { dg-options "-fomit-frame-pointer -mno-accumulate-outgoing-args" { target i?86-*-* } } #include diff --git a/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C b/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C index 9ddf2edfbc7..78026b51843 100644 --- a/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C +++ b/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C @@ -1,6 +1,5 @@ // Reduced from PR c++/5246, PR c++/2447 // { dg-options "-O -fomit-frame-pointer" } -// { dg-options "-O -fomit-frame-pointer -mno-accumulate-outgoing-args" { target i?86-*-* } } // { dg-do run } void step (int) diff --git a/gcc/toplev.c b/gcc/toplev.c index b9631709975..796c7bf87e5 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1778,6 +1778,18 @@ process_options (void) } if (!flag_stack_protect) warn_stack_protect = 0; + + /* ??? Unwind info is not correct around the CFG unless either a frame + pointer is present or A_O_A is set. Fixing this requires rewriting + unwind info generation to be aware of the CFG and propagating states + around edges. */ + if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS + && flag_omit_frame_pointer) + { + warning (0, "unwind tables currently requires a frame pointer " + "for correctness"); + flag_omit_frame_pointer = 0; + } } /* Initialize the compiler back end. */ diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 257c011d1ad..10ae06b58c8 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2005-10-05 Richard Henderson + + PR target/23602 + * configure.host (i?86-*): Set -fomit-frame-pointer in libgcj_flags, + but not BACKTRACESPEC. + (x86_64-*): Similarly. Don't set -ffloat-store in 64-bit mode. + 2005-10-02 Andrew Pinski * testsuite/lib/jni.exp (gcj_jni_test_one): For diff --git a/libjava/configure.host b/libjava/configure.host index d84757f7928..41429d3cd11 100644 --- a/libjava/configure.host +++ b/libjava/configure.host @@ -95,18 +95,27 @@ case "${host}" in ;; i686-*|i586-*|i486-*|i386-*) sysdeps_dir=i386 - libgcj_flags="${libgcj_flags} -ffloat-store" + # With -fomit-frame-pointer -maccumulate-outgoing-args (implied), + # the .text section of libgcj.so is 30k larger, and the .eh_frame + # section is 1.4M smaller. + libgcj_flags="${libgcj_flags} -ffloat-store -fomit-frame-pointer" libgcj_interpreter=yes libgcj_cxxflags= libgcj_cflags= DIVIDESPEC=-fno-use-divide-subroutine - BACKTRACESPEC=-fomit-frame-pointer enable_hash_synchronization_default=yes slow_pthread_self=yes ;; x86_64-*) sysdeps_dir=x86-64 - libgcj_flags="${libgcj_flags} -ffloat-store" + # For 64-bit we always use SSE registers for arithmetic, + # which doesn't have the extra precision problems of the fpu. + # But be careful about 32-bit multilibs. + case " $CC " in + *" -m32 "*) + libgcj_flags="${libgcj_flags} -ffloat-store" ;; + esac + libgcj_flags="${libgcj_flags} -fomit-frame-pointer" libgcj_cxxflags= libgcj_cflags= DIVIDESPEC=-f%{m32:no-}use-divide-subroutine