diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c33853b3d27e14eab4d0314e98cb66bb17227c51..677e379a9d487f913815b9f87558ab105c5f9055 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-10-05 Richard Henderson <rth@redhat.com> + + 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 <sje@cup.hp.com> * 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 6d90a009cde9149dab33a74350334a626f282aaf..fa2957080effb1493300ee56c315af141e47d5a0 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 07f2a27a502ef9644fa2965b6b6ec0784fb54b31..8d26dd24fb6d6b025d14bc1493bccd694ef475c3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-10-05 Richard Henderson <rth@redhat.com> + + 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 <dalej@apple.com> * 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 01821a12fe9f23590a3501844c34bc735db65573..3792e11fe4c90d0213f12ad821d6f09aaa677152 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 <iostream> diff --git a/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C b/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C index 9ddf2edfbc769ef54da0cfd8e127b616e9ffbc58..78026b518430c5bf2f1c055695cc96ad2dfd1f82 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 b96317099752b2d6bb6deb77c7c8a6fd786556f8..796c7bf87e542d3621fbc2e4f7748ed1c84b68a2 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 257c011d1addfe555227503171c5d168c45bbbb5..10ae06b58c8b4dc421ff2d4f6344855457c244a9 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2005-10-05 Richard Henderson <rth@redhat.com> + + 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 <pinskia@physics.uc.edu> * testsuite/lib/jni.exp (gcj_jni_test_one): For diff --git a/libjava/configure.host b/libjava/configure.host index d84757f7928c8bd17c263767c1f4db04cad8facb..41429d3cd1153fb3b27f484d61b2d66db0bf42e8 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