This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Call GNU ld with -O*
- From: Marc Glisse <marc dot glisse at inria dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 12 Jul 2013 16:54:21 +0200 (CEST)
- Subject: Call GNU ld with -O*
Hello,
this patch makes the driver pass -O2 to GNU ld if gcc was called with -O3
(or more), -Ofast or -Os. Is there a cleaner way to test (optimize > 2 ||
optimize_size) in the driver?
I did a bootstrap on x86_64-unknown-linux-gnu and then manually tested by
looking at the -v output.
I tried a -O3 bootstrap, but even setting CFLAGS, BOOT_CFLAGS,
CFLAGS_FOT_TARGET, and the same 3 versions with CXXFLAGS and LDFLAGS, most
stuff still used the default -O2 -g. And most libraries that are part of
gcc explicitly use -Wl,-O1 for linking already.
2013-07-12 Marc Glisse <marc.glisse@inria.fr>
PR driver/44080
* gcc.c (LINK_OPT_SPEC): New macro.
(LINK_COMMAND_SPEC): Use it.
--
Marc Glisse
Index: gcc.c
===================================================================
--- gcc.c (revision 200921)
+++ gcc.c (working copy)
@@ -715,36 +715,45 @@ proper position among the other output f
/* Linker command line options for -fsanitize= late on the command line. */
#ifndef SANITIZER_SPEC
#define SANITIZER_SPEC "\
%{!nostdlib:%{!nodefaultlibs:%{fsanitize=address:" LIBASAN_SPEC "\
%{static:%ecannot specify -static with -fsanitize=address}\
%{fsanitize=thread:%e-fsanitize=address is incompatible with -fsanitize=thread}}\
%{fsanitize=thread:" LIBTSAN_SPEC "\
%{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}}}"
#endif
+/* GNU ld has -O1 and gold -O2, but we only pass it with -O3, -Os or -Ofast. */
+#ifndef LINK_OPT_SPEC
+#if HAVE_GNU_LD
+#define LINK_OPT_SPEC "%{O*:%{!O0:%{!O1:%{!O2:%{!Og:%{!O:-O2}}}}}} "
+#else
+#define LINK_OPT_SPEC ""
+#endif
+#endif
+
/* -u* was put back because both BSD and SysV seem to support it. */
/* %{static:} simply prevents an error message if the target machine
doesn't handle -static. */
/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
scripts which exist in user specified directories, or in standard
directories. */
/* We pass any -flto flags on to the linker, which is expected
to understand them. In practice, this means it had better be collect2. */
/* %{e*} includes -export-dynamic; see comment in common.opt. */
#ifndef LINK_COMMAND_SPEC
#define LINK_COMMAND_SPEC "\
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
%(linker) " \
LINK_PLUGIN_SPEC \
"%{flto|flto=*:%<fcompare-debug*} \
- %{flto} %{flto=*} %l " LINK_PIE_SPEC \
+ %{flto} %{flto=*} %l " LINK_PIE_SPEC LINK_OPT_SPEC \
"%{fuse-ld=*:-fuse-ld=%*}\
%X %{o*} %{e*} %{N} %{n} %{r}\
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\
%{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
%{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
%{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
%(mflib) " STACK_SPLIT_SPEC "\
%{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
%{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
%{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"