diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-02-05 16:55:31 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-02-05 16:55:31 +0100 |
commit | a74db9bd86ae6801699307541fa2d4d65b3cc3b5 (patch) | |
tree | 100757cceba7527450ccfa949a2cd497d340f97a | |
parent | 11f1e3ab239b3a45b085ca5eb1327f1254fb6205 (diff) | |
download | gcc-a74db9bd86ae6801699307541fa2d4d65b3cc3b5.zip gcc-a74db9bd86ae6801699307541fa2d4d65b3cc3b5.tar.gz gcc-a74db9bd86ae6801699307541fa2d4d65b3cc3b5.tar.bz2 |
re PR sanitizer/55374 ([asan] -static-libasan -static-libstdc++ doesn't work)
PR sanitizer/55374
* config/gnu-user.h (LIBTSAN_EARLY_SPEC): Define.
(STATIC_LIBTSAN_LIBS): Likewise.
* gcc.c (ADD_STATIC_LIBTSAN_LIBS, LIBTSAN_EARLY_SPEC): Define.
(LIBTSAN_SPEC): Add ADD_STATIC_LIBTSAN_LIBS, if LIBTSAN_EARLY_SPEC
is defined, don't add anything else beyond that.
(SANITIZER_EARLY_SPEC, SANITIZER_SPEC): Define.
(LINK_COMMAND_SPEC): Use them.
From-SVN: r195761
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/gnu-user.h | 10 | ||||
-rw-r--r-- | gcc/gcc.c | 43 |
3 files changed, 52 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6ab680..6440481 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2013-02-05 Jakub Jelinek <jakub@redhat.com> + PR sanitizer/55374 + * config/gnu-user.h (LIBTSAN_EARLY_SPEC): Define. + (STATIC_LIBTSAN_LIBS): Likewise. + * gcc.c (ADD_STATIC_LIBTSAN_LIBS, LIBTSAN_EARLY_SPEC): Define. + (LIBTSAN_SPEC): Add ADD_STATIC_LIBTSAN_LIBS, if LIBTSAN_EARLY_SPEC + is defined, don't add anything else beyond that. + (SANITIZER_EARLY_SPEC, SANITIZER_SPEC): Define. + (LINK_COMMAND_SPEC): Use them. + PR tree-optimization/56205 * tree-stdarg.c (check_all_va_list_escapes): Return true if there are any PHI nodes that set non-va_list_escape_vars SSA_NAME diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h index 0024626..ba627e0 100644 --- a/gcc/config/gnu-user.h +++ b/gcc/config/gnu-user.h @@ -101,14 +101,22 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* Link -lasan early on the command line. For -static-libasan, don't link it for -shared link, the executable should be compiled with -static-libasan in that case, and for executable link link with --{,no-}whole-archive around - it to force everything into the executable. */ + it to force everything into the executable. And similarly for -ltsan. */ #if defined(HAVE_LD_STATIC_DYNAMIC) #undef LIBASAN_EARLY_SPEC #define LIBASAN_EARLY_SPEC "%{static-libasan:%{!shared:" \ LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \ LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}" +#undef LIBTSAN_EARLY_SPEC +#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \ + LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \ + LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}" #endif /* Additional libraries needed by -static-libasan. */ #undef STATIC_LIBASAN_LIBS #define STATIC_LIBASAN_LIBS "-ldl -lpthread" + +/* Additional libraries needed by -static-libtsan. */ +#undef STATIC_LIBTSAN_LIBS +#define STATIC_LIBTSAN_LIBS "-ldl -lpthread" @@ -564,12 +564,25 @@ proper position among the other output files. */ #endif #ifndef LIBTSAN_SPEC -#ifdef HAVE_LD_STATIC_DYNAMIC +#ifdef STATIC_LIBTSAN_LIBS +#define ADD_STATIC_LIBTSAN_LIBS \ + " %{static-libtsan:" STATIC_LIBTSAN_LIBS "}" +#else +#define ADD_STATIC_LIBTSAN_LIBS +#endif +#ifdef LIBTSAN_EARLY_SPEC +#define LIBTSAN_SPEC ADD_STATIC_LIBTSAN_LIBS +#elif defined(HAVE_LD_STATIC_DYNAMIC) #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \ - "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" + "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \ + ADD_STATIC_LIBTSAN_LIBS #else -#define LIBTSAN_SPEC "-ltsan" +#define LIBTSAN_SPEC "-ltsan" ADD_STATIC_LIBTSAN_LIBS +#endif #endif + +#ifndef LIBTSAN_EARLY_SPEC +#define LIBTSAN_EARLY_SPEC "" #endif /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is @@ -691,6 +704,21 @@ proper position among the other output files. */ %e-fuse-linker-plugin is not supported in this configuration}" #endif +/* Linker command line options for -fsanitize= early on the command line. */ +#ifndef SANITIZER_EARLY_SPEC +#define SANITIZER_EARLY_SPEC "\ +%{!nostdlib:%{!nodefaultlibs:%{fsanitize=address:" LIBASAN_EARLY_SPEC "} \ + %{fsanitize=thread:" LIBTSAN_EARLY_SPEC "}}}" +#endif + +/* 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:" LIBTSAN_SPEC "\ + %{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}}}" +#endif /* -u* was put back because both BSD and SysV seem to support it. */ /* %{static:} simply prevents an error message if the target machine @@ -706,19 +734,16 @@ proper position among the other output files. */ %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ %(linker) " \ LINK_PLUGIN_SPEC \ - "%{flto|flto=*:%<fcompare-debug*} \ + "%{flto|flto=*:%<fcompare-debug*} \ %{flto} %{flto=*} %l " LINK_PIE_SPEC \ "%{fuse-ld=*:-fuse-ld=%*}\ %X %{o*} %{e*} %{N} %{n} %{r}\ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\ - %{static:} %{L*} %(mfwrap) %(link_libgcc) \ - %{fsanitize=address:" LIBASAN_EARLY_SPEC "} %o\ + %{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}\ - %{fsanitize=address:" LIBASAN_SPEC "%{static:%ecannot specify -static with -fsanitize=address}}\ - %{fsanitize=thread:" LIBTSAN_SPEC "}\ + %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \ %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\ %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}" #endif |