Commit 0b7fb27b by Allan Sandfeld Jensen Committed by Joseph Myers

Fix and document -r option

The option has existed and been working for years,
make sure it implies the right extra options, and list
it in the documentation.

2018-09-20  Allan Sandfeld Jensen  <allan.jensen@qt.io>

gcc/
	* gcc.c (LINK_COMMAND_SPEC): Handle -r like -nostdlib.
	(VTABLE_VERIFICATION_SPEC): Likewise.
	(SANITIZER_EARLY_SPEC): Likewise.
	(SANITIZER_SPEC): Likewise.
	* config/darwin.h (LINK_COMMAND_SPEC): Likewise.
	* doc/invoke.texi (Link Options): Document -r.

gcc/cp/
	* g++spec.c (lang_specific_driver): Handle -r like -nostdlib.

gcc/fortran/
	* gfortranspec.c (lang_specific_driver): Handle -r like -nostdlib.

gcc/go/
	* gospec.c (lang_specific_driver): Handle -r like -nostdlib.

gcc/testsuite/
	* g++.dg/ipa/pr64059.C: Removed now redundant -nostdlib.
	* g++.dg/lto/20081109-1_0.C: Likewise.
	* g++.dg/lto/20090302_0.C: Likewise.
	* g++.dg/lto/pr45621_0.C: Likewise.
	* g++.dg/lto/pr60567_0.C: Likewise.
	* g++.dg/lto/pr62026.C: Likewise.
	* gcc.dg/lto/pr45736_0.c: Likewise.
	* gcc.dg/lto/pr52634_0.c: Likewise.
	* gfortran.dg/lto/20091016-1_0.f90: Likewise.
	* gfortran.dg/lto/pr79108_0.f90: Likewise.

From-SVN: r264451
parent 468e1ef4
2018-09-20 Allan Sandfeld Jensen <allan.jensen@qt.io>
* gcc.c (LINK_COMMAND_SPEC): Handle -r like -nostdlib.
(VTABLE_VERIFICATION_SPEC): Likewise.
(SANITIZER_EARLY_SPEC): Likewise.
(SANITIZER_SPEC): Likewise.
* config/darwin.h (LINK_COMMAND_SPEC): Likewise.
* doc/invoke.texi (Link Options): Document -r.
2018-09-20 Richard Biener <rguenther@suse.de> 2018-09-20 Richard Biener <rguenther@suse.de>
PR middle-end/87054 PR middle-end/87054
......
...@@ -180,20 +180,20 @@ extern GTY(()) int darwin_ms_struct; ...@@ -180,20 +180,20 @@ extern GTY(()) int darwin_ms_struct;
"%X %{s} %{t} %{Z} %{u*} \ "%X %{s} %{t} %{Z} %{u*} \
%{e*} %{r} \ %{e*} %{r} \
%{o*}%{!o:-o a.out} \ %{o*}%{!o:-o a.out} \
%{!nostdlib:%{!nostartfiles:%S}} \ %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
%{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} \ %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} \
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): \ %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): \
%{static|static-libgcc|static-libstdc++|static-libgfortran: libgomp.a%s; : -lgomp } } \ %{static|static-libgcc|static-libstdc++|static-libgfortran: libgomp.a%s; : -lgomp } } \
%{fgnu-tm: \ %{fgnu-tm: \
%{static|static-libgcc|static-libstdc++|static-libgfortran: libitm.a%s; : -litm } } \ %{static|static-libgcc|static-libstdc++|static-libgfortran: libitm.a%s; : -litm } } \
%{!nostdlib:%{!nodefaultlibs:\ %{!nostdlib:%{!r:%{!nodefaultlibs:\
%{%:sanitize(address): -lasan } \ %{%:sanitize(address): -lasan } \
%{%:sanitize(undefined): -lubsan } \ %{%:sanitize(undefined): -lubsan } \
%(link_ssp) \ %(link_ssp) \
" DARWIN_EXPORT_DYNAMIC " %<rdynamic \ " DARWIN_EXPORT_DYNAMIC " %<rdynamic \
%(link_gcc_c_sequence) \ %(link_gcc_c_sequence) \
}}\ }}}\
%{!nostdlib:%{!nostartfiles:%E}} %{T*} %{F*} }}}}}}}" %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} %{F*} }}}}}}}"
#define DSYMUTIL "\ndsymutil" #define DSYMUTIL "\ndsymutil"
......
2018-09-20 Allan Sandfeld Jensen <allan.jensen@qt.io>
* g++spec.c (lang_specific_driver): Handle -r like -nostdlib.
2018-09-20 Jason Merrill <jason@redhat.com> 2018-09-20 Jason Merrill <jason@redhat.com>
PR c++/87075 - ICE with constexpr array initialization. PR c++/87075 - ICE with constexpr array initialization.
......
...@@ -184,6 +184,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, ...@@ -184,6 +184,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
break; break;
case OPT_c: case OPT_c:
case OPT_r:
case OPT_S: case OPT_S:
case OPT_E: case OPT_E:
case OPT_M: case OPT_M:
......
...@@ -521,7 +521,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -521,7 +521,7 @@ Objective-C and Objective-C++ Dialects}.
@xref{Link Options,,Options for Linking}. @xref{Link Options,,Options for Linking}.
@gccoptlist{@var{object-file-name} -fuse-ld=@var{linker} -l@var{library} @gol @gccoptlist{@var{object-file-name} -fuse-ld=@var{linker} -l@var{library} @gol
-nostartfiles -nodefaultlibs -nolibc -nostdlib @gol -nostartfiles -nodefaultlibs -nolibc -nostdlib @gol
-pie -pthread -rdynamic @gol -pie -pthread -r -rdynamic @gol
-s -static -static-pie -static-libgcc -static-libstdc++ @gol -s -static -static-pie -static-libgcc -static-libstdc++ @gol
-static-libasan -static-libtsan -static-liblsan -static-libubsan @gol -static-libasan -static-libtsan -static-liblsan -static-libubsan @gol
-shared -shared-libgcc -symbolic @gol -shared -shared-libgcc -symbolic @gol
...@@ -12586,6 +12586,11 @@ x86 Cygwin and MinGW targets. On some targets this option also sets ...@@ -12586,6 +12586,11 @@ x86 Cygwin and MinGW targets. On some targets this option also sets
flags for the preprocessor, so it should be used consistently for both flags for the preprocessor, so it should be used consistently for both
compilation and linking. compilation and linking.
@item -r
@opindex r
Produce a relocatable object as output. This is also known as partial
linking.
@item -rdynamic @item -rdynamic
@opindex rdynamic @opindex rdynamic
Pass the flag @option{-export-dynamic} to the ELF linker, on targets Pass the flag @option{-export-dynamic} to the ELF linker, on targets
2018-09-20 Allan Sandfeld Jensen <allan.jensen@qt.io>
* gfortranspec.c (lang_specific_driver): Handle -r like -nostdlib.
2018-09-20 Janus Weil <janus@gcc.gnu.org> 2018-09-20 Janus Weil <janus@gcc.gnu.org>
* gfortran.h (gfc_str_startswith): New macro. * gfortran.h (gfc_str_startswith): New macro.
......
...@@ -243,6 +243,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, ...@@ -243,6 +243,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
case OPT_nostdlib: case OPT_nostdlib:
case OPT_nodefaultlibs: case OPT_nodefaultlibs:
case OPT_c: case OPT_c:
case OPT_r:
case OPT_S: case OPT_S:
case OPT_fsyntax_only: case OPT_fsyntax_only:
case OPT_E: case OPT_E:
......
...@@ -980,20 +980,20 @@ proper position among the other output files. */ ...@@ -980,20 +980,20 @@ proper position among the other output files. */
/* Linker command line options for -fsanitize= early on the command line. */ /* Linker command line options for -fsanitize= early on the command line. */
#ifndef SANITIZER_EARLY_SPEC #ifndef SANITIZER_EARLY_SPEC
#define SANITIZER_EARLY_SPEC "\ #define SANITIZER_EARLY_SPEC "\
%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \ %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
%{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \ %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
%{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}" %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
#endif #endif
/* Linker command line options for -fsanitize= late on the command line. */ /* Linker command line options for -fsanitize= late on the command line. */
#ifndef SANITIZER_SPEC #ifndef SANITIZER_SPEC
#define SANITIZER_SPEC "\ #define SANITIZER_SPEC "\
%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\ %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
%{static:%ecannot specify -static with -fsanitize=address}}\ %{static:%ecannot specify -static with -fsanitize=address}}\
%{%:sanitize(thread):" LIBTSAN_SPEC "\ %{%:sanitize(thread):" LIBTSAN_SPEC "\
%{static:%ecannot specify -static with -fsanitize=thread}}\ %{static:%ecannot specify -static with -fsanitize=thread}}\
%{%:sanitize(undefined):" LIBUBSAN_SPEC "}\ %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
%{%:sanitize(leak):" LIBLSAN_SPEC "}}}" %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
#endif #endif
#ifndef POST_LINK_SPEC #ifndef POST_LINK_SPEC
...@@ -1007,8 +1007,8 @@ proper position among the other output files. */ ...@@ -1007,8 +1007,8 @@ proper position among the other output files. */
#ifndef VTABLE_VERIFICATION_SPEC #ifndef VTABLE_VERIFICATION_SPEC
#if ENABLE_VTABLE_VERIFY #if ENABLE_VTABLE_VERIFY
#define VTABLE_VERIFICATION_SPEC "\ #define VTABLE_VERIFICATION_SPEC "\
%{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\ %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
%{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}" %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
#else #else
#define VTABLE_VERIFICATION_SPEC "\ #define VTABLE_VERIFICATION_SPEC "\
%{fvtable-verify=none:} \ %{fvtable-verify=none:} \
...@@ -1040,7 +1040,7 @@ proper position among the other output files. */ ...@@ -1040,7 +1040,7 @@ proper position among the other output files. */
%{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \ %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \ "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
"%X %{o*} %{e*} %{N} %{n} %{r}\ "%X %{o*} %{e*} %{N} %{n} %{r}\
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} \ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
%{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \ %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \ VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\ %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
...@@ -1048,8 +1048,8 @@ proper position among the other output files. */ ...@@ -1048,8 +1048,8 @@ proper position among the other output files. */
%{fgnu-tm:%:include(libitm.spec)%(link_itm)}\ %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
%(mflib) " STACK_SPLIT_SPEC "\ %(mflib) " STACK_SPLIT_SPEC "\
%{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \ %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
%{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\ %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
%{!nostdlib:%{!nostartfiles:%E}} %{T*} \n%(post_link) }}}}}}" %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
#endif #endif
#ifndef LINK_LIBGCC_SPEC #ifndef LINK_LIBGCC_SPEC
......
2018-09-20 Allan Sandfeld Jensen <allan.jensen@qt.io>
* gospec.c (lang_specific_driver): Handle -r like -nostdlib.
2018-08-27 Martin Liska <mliska@suse.cz> 2018-08-27 Martin Liska <mliska@suse.cz>
* go-gcc.cc (Gcc_backend::call_expression): Use new function * go-gcc.cc (Gcc_backend::call_expression): Use new function
......
...@@ -139,6 +139,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, ...@@ -139,6 +139,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
switch (decoded_options[i].opt_index) switch (decoded_options[i].opt_index)
{ {
case OPT_r:
case OPT_nostdlib: case OPT_nostdlib:
case OPT_nodefaultlibs: case OPT_nodefaultlibs:
library = -1; library = -1;
......
2018-09-20 Allan Sandfeld Jensen <allan.jensen@qt.io>
* g++.dg/ipa/pr64059.C: Removed now redundant -nostdlib.
* g++.dg/lto/20081109-1_0.C: Likewise.
* g++.dg/lto/20090302_0.C: Likewise.
* g++.dg/lto/pr45621_0.C: Likewise.
* g++.dg/lto/pr60567_0.C: Likewise.
* g++.dg/lto/pr62026.C: Likewise.
* gcc.dg/lto/pr45736_0.c: Likewise.
* gcc.dg/lto/pr52634_0.c: Likewise.
* gfortran.dg/lto/20091016-1_0.f90: Likewise.
* gfortran.dg/lto/pr79108_0.f90: Likewise.
2018-09-20 Alexandre Oliva <oliva@adacore.com> 2018-09-20 Alexandre Oliva <oliva@adacore.com>
PR middle-end/87054 PR middle-end/87054
......
// { dg-options "-r -nostdlib -O2 -flto -fno-devirtualize" } // { dg-options "-r -O2 -flto -fno-devirtualize" }
// { dg-require-effective-target lto } // { dg-require-effective-target lto }
class A; class A;
......
// { dg-lto-do link } // { dg-lto-do link }
// { dg-require-effective-target fpic } // { dg-require-effective-target fpic }
// { dg-lto-options {{-fPIC -flto -flto-partition=1to1}} } // { dg-lto-options {{-fPIC -flto -flto-partition=1to1}} }
// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions -flinker-output=nolto-rel" } // { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -fno-exceptions -flinker-output=nolto-rel" }
void func(); class Foo { }; void func(); class Foo { };
void bar() { try { func(); } catch (Foo) { } }; void bar() { try { func(); } catch (Foo) { } };
/* { dg-lto-do link } */ /* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */ /* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ /* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r}} } */
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
struct Foo { struct Foo {
bool Mumble(); bool Mumble();
......
// { dg-lto-do assemble } // { dg-lto-do assemble }
// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r -flinker-output=nolto-rel" } // { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -r -flinker-output=nolto-rel" }
#include "pr45621.h" #include "pr45621.h"
void void
......
// PR lto/60567 // PR lto/60567
// { dg-lto-do link } // { dg-lto-do link }
// { dg-lto-options { { -flto -fno-use-linker-plugin } } } // { dg-lto-options { { -flto -fno-use-linker-plugin } } }
// { dg-extra-ld-options "-r -nostdlib" } // { dg-extra-ld-options "-r" }
#pragma implementation #pragma implementation
struct S {}; struct S {};
......
// { dg-lto-do link } // { dg-lto-do link }
// { dg-lto-options {{-flto -O3 -r -nostdlib}} } // { dg-lto-options {{-flto -O3 -r}} }
class C; class C;
class F { class F {
virtual C m_fn1(); virtual C m_fn1();
......
/* { dg-lto-do link } */ /* { dg-lto-do link } */
/* { dg-lto-options {{-flto -r -nostdlib -O}} } */ /* { dg-lto-options {{-flto -r -O}} } */
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
extern void baz (void); extern void baz (void);
......
/* { dg-require-weak "" } */ /* { dg-require-weak "" } */
/* { dg-require-alias "" } */ /* { dg-require-alias "" } */
/* { dg-lto-do link } */ /* { dg-lto-do link } */
/* { dg-lto-options {{-flto -r -nostdlib -flto-partition=1to1}} */ /* { dg-lto-options {{-flto -r -flto-partition=1to1}} */
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
extern int cfliteValueCallBacks; extern int cfliteValueCallBacks;
void baz (int *); void baz (int *);
......
! { dg-lto-do link } ! { dg-lto-do link }
! { dg-lto-options {{-flto -g -fPIC -r -nostdlib} {-O -flto -g -fPIC -r -nostdlib}} } ! { dg-lto-options {{-flto -g -fPIC -r} {-O -flto -g -fPIC -r}} }
! { dg-extra-ld-options "-flinker-output=nolto-rel" } ! { dg-extra-ld-options "-flinker-output=nolto-rel" }
FUNCTION makenumberstring(x) FUNCTION makenumberstring(x)
......
! { dg-lto-do link } ! { dg-lto-do link }
! { dg-lto-options {{ -Ofast -flto --param ggc-min-expand=0 --param ggc-min-heapsize=0 }} } ! { dg-lto-options {{ -Ofast -flto --param ggc-min-expand=0 --param ggc-min-heapsize=0 }} }
! { dg-extra-ld-options "-r -nostdlib" } ! { dg-extra-ld-options "-r" }
MODULE Errorcheck_mod MODULE Errorcheck_mod
CONTAINS CONTAINS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment