]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Enable libsanitizer on Solaris (PR sanitizer/80953)
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Tue, 6 Nov 2018 10:49:34 +0000 (10:49 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Tue, 6 Nov 2018 10:49:34 +0000 (10:49 +0000)
gcc:
PR sanitizer/80953
* config/sol2.h (ASAN_CC1_SPEC): Define.
(LD_WHOLE_ARCHIVE_OPTION): Define.
(LD_NO_WHOLE_ARCHIVE_OPTION): Define.
(ASAN_REJECT_SPEC): Provide default.
(LIBASAN_EARLY_SPEC): Define.
(LIBTSAN_EARLY_SPEC): Define.
(LIBLSAN_EARLY_SPEC): Define.
* config/i386/sol2.h (CC1_SPEC): Redefine.
(ASAN_REJECT_SPEC): Define.

* config/sparc/sparc.c (sparc_asan_shadow_offset): Declare.
(TARGET_ASAN_SHADOW_OFFSET): Define.
(sparc_asan_shadow_offset): New function.
* config/sparc/sol2.h (CC1_SPEC): Append ASAN_CC1_SPEC.
(ASAN_REJECT_SPEC): Define.

gcc/testsuite:
PR sanitizer/80953
* c-c++-common/asan/alloca_loop_unpoisoning.c: Require alloca
support.
(foo): Use __builtin_alloca.

libsanitizer:
PR sanitizer/80953
* configure.tgt (sparc*-*-solaris2.11*): Enable.
(x86_64-*-solaris2.11* | i?86-*-solaris2.11*): Enable.

From-SVN: r265837

gcc/ChangeLog
gcc/config/i386/sol2.h
gcc/config/sol2.h
gcc/config/sparc/sol2.h
gcc/config/sparc/sparc.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/asan/alloca_loop_unpoisoning.c
libsanitizer/ChangeLog
libsanitizer/configure.tgt

index 90b4699237a186fe45593630b577b42e9a29bbd8..11a6b4745129d35254348dc11c11d2e7a328f54a 100644 (file)
@@ -1,3 +1,22 @@
+2018-11-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR sanitizer/80953
+       * config/sol2.h (ASAN_CC1_SPEC): Define.
+       (LD_WHOLE_ARCHIVE_OPTION): Define.
+       (LD_NO_WHOLE_ARCHIVE_OPTION): Define.
+       (ASAN_REJECT_SPEC): Provide default.
+       (LIBASAN_EARLY_SPEC): Define.
+       (LIBTSAN_EARLY_SPEC): Define.
+       (LIBLSAN_EARLY_SPEC): Define.
+       * config/i386/sol2.h (CC1_SPEC): Redefine.
+       (ASAN_REJECT_SPEC): Define.
+
+       * config/sparc/sparc.c (sparc_asan_shadow_offset): Declare.
+       (TARGET_ASAN_SHADOW_OFFSET): Define.
+       (sparc_asan_shadow_offset): New function.
+       * config/sparc/sol2.h (CC1_SPEC): Append ASAN_CC1_SPEC.
+       (ASAN_REJECT_SPEC): Define.
+
 018-11-06  Jan Hubicka  <jh@suse.cz>
 
        * tree.c (fld_type_variant): Copy canonical type.
index 3491f45f75d082b05e877c4b4fb22e4d7d9c1055..73ebc4a85e1bdc5d455e0c260b37071aff58cb78 100644 (file)
@@ -54,6 +54,9 @@ along with GCC; see the file COPYING3.  If not see
 #undef CPP_SPEC
 #define CPP_SPEC "%(cpp_subtarget)"
 
+#undef CC1_SPEC
+#define CC1_SPEC "%(cc1_cpu) " ASAN_CC1_SPEC
+
 /* GNU as understands --32 and --64, but the native Solaris
    assembler requires -xarch=generic or -xarch=generic64 instead.  */
 #ifdef USE_GAS
@@ -241,6 +244,10 @@ along with GCC; see the file COPYING3.  If not see
 #define LARGECOMM_SECTION_ASM_OP "\t.lbcomm\t"
 #endif
 
+/* -fsanitize=address is currently only supported for 32-bit.  */
+#define ASAN_REJECT_SPEC \
+  DEF_ARCH64_SPEC("%e:-fsanitize=address is not supported in this configuration")
+
 #define USE_IX86_FRAME_POINTER 1
 #define USE_X86_64_FRAME_POINTER 1
 
index 8b67e78dee06d05ab845be5250ba858a9edbe9c1..197acfbd0fe43448cb89fcc7ff1ba1003cf6a70f 100644 (file)
@@ -138,6 +138,9 @@ along with GCC; see the file COPYING3.  If not see
 #define DEF_ARCH64_SPEC(__str) "%{!m32:" __str "}"
 #endif
 
+/* Solaris needs -fasynchronous-unwind-tables to generate unwind info.  */
+#define ASAN_CC1_SPEC "%{%:sanitize(address):-fasynchronous-unwind-tables}"
+
 /* It's safe to pass -s always, even if -g is not used.  Those options are
    handled by both Sun as and GNU as.  */
 #define ASM_SPEC_BASE \
@@ -231,6 +234,36 @@ along with GCC; see the file COPYING3.  If not see
 #define ENDFILE_VTV_SPEC ""
 #endif /* !ENABLE_VTABLE_VERIFY */
 
+/* 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 with --{,no-}whole-archive around
+   it to force everything into the executable.  */
+
+#ifndef USE_GNU_LD
+#define LD_WHOLE_ARCHIVE_OPTION "-z allextract"
+#define LD_NO_WHOLE_ARCHIVE_OPTION "-z defaultextract"
+#else
+#define LD_WHOLE_ARCHIVE_OPTION "--whole-archive"
+#define LD_NO_WHOLE_ARCHIVE_OPTION "--no-whole-archive"
+#endif
+
+/* Allow rejecting -fsanitize=address, e.g. for specific multilibs.  */
+#ifndef ASAN_REJECT_SPEC
+#define ASAN_REJECT_SPEC ""
+#endif
+
+#define LIBASAN_EARLY_SPEC ASAN_REJECT_SPEC \
+  " %{!shared:libasan_preinit%O%s} \
+    %{static-libasan:%{!shared: -Bstatic "\
+    LD_WHOLE_ARCHIVE_OPTION " -lasan " LD_NO_WHOLE_ARCHIVE_OPTION \
+    "-Bdynamic}}%{!static-libasan:-lasan}"
+
+/* Error out on -fsanitize=thread|leak.  */
+#define LIBTSAN_EARLY_SPEC "\
+  %e:-fsanitize=thread is not supported in this configuration"
+#define LIBLSAN_EARLY_SPEC "\
+  %e:-fsanitize=leak is not supported in this configuration"
+
 /* We don't use the standard svr4 STARTFILE_SPEC because it's wrong for us.  */
 #undef STARTFILE_SPEC
 #ifdef HAVE_SOLARIS_CRTS
index 1bd4d61b2f3b8c6e6f0488fbaaded2d9719e6aae..61069b52ed6173a0356b747f75d7b68f3771a377 100644 (file)
@@ -237,7 +237,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
 %{m64:%{m32:%emay not use both -m32 and -m64}} \
 %{m64:-mptr64 -mstack-bias -mno-v8plus \
   %{!mcpu*:-%{!mv8plus:mcpu=v9}}} \
-"
+" ASAN_CC1_SPEC
 #else
 #define CC1_SPEC "\
 %{m32:%{m64:%emay not use both -m32 and -m64}} \
@@ -245,7 +245,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
   %{!mcpu*:%{!mv8plus:-mcpu=v9}}} \
 %{mv8plus:-m32 -mptr32 -mno-stack-bias \
   %{!mcpu*:-mcpu=v9}} \
-"
+" ASAN_CC1_SPEC
 #endif
 
 /* Support for a compile-time default CPU, et cetera.  The rules are:
@@ -322,6 +322,9 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
 
 #define ENDFILE_ARCH_SPEC ""
 
+/* -fsanitize=address is currently only supported for 32-bit.  */
+#define ASAN_REJECT_SPEC \
+  DEF_ARCH64_SPEC("%e:-fsanitize=address is not supported in this configuration")
 \f
 
 /* Register the Solaris-specific #pragma directives.  */
index 8d982d284f3fbc87b2185dad4628088430e779f9..dcdaef20dc04eabb1bb16f6cd23da6df1079a072 100644 (file)
@@ -674,6 +674,7 @@ static unsigned int sparc_function_arg_boundary (machine_mode,
                                                 const_tree);
 static int sparc_arg_partial_bytes (cumulative_args_t,
                                    machine_mode, tree, bool);
+static unsigned HOST_WIDE_INT sparc_asan_shadow_offset (void);
 static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
 static void sparc_file_end (void);
 static bool sparc_frame_pointer_required (void);
@@ -839,6 +840,9 @@ char sparc_hard_reg_printed[8];
 #undef TARGET_STRICT_ARGUMENT_NAMING
 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
 
+#undef TARGET_ASAN_SHADOW_OFFSET
+#define TARGET_ASAN_SHADOW_OFFSET sparc_asan_shadow_offset
+
 #undef TARGET_EXPAND_BUILTIN_VA_START
 #define TARGET_EXPAND_BUILTIN_VA_START sparc_va_start
 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
@@ -12476,7 +12480,15 @@ sparc_init_machine_status (void)
 {
   return ggc_cleared_alloc<machine_function> ();
 }
+\f
+/* Implement the TARGET_ASAN_SHADOW_OFFSET hook.  */
 
+static unsigned HOST_WIDE_INT
+sparc_asan_shadow_offset (void)
+{
+  return TARGET_ARCH64 ? HOST_WIDE_INT_C (0x7fff8000) : (HOST_WIDE_INT_1 << 29);
+}
+\f
 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
    We need to emit DTP-relative relocations.  */
 
index 1ba1eaf13efc70e1fb480d7f84cfcb67a64ebc97..6d7683b6e987fa20645d217f709a499d11186201 100644 (file)
@@ -1,3 +1,10 @@
+2018-11-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR sanitizer/80953
+       * c-c++-common/asan/alloca_loop_unpoisoning.c: Require alloca
+       support.
+       (foo): Use __builtin_alloca.
+
 2018-11-06  Jan Hubicka  <jh@suse.cz>
 
        * gcc.dg/lto/tbaa-1.c: New testcase.
index 0ddadb9c3853c51ab5476f0f7958ecdb87e176ca..55345fdb3a5843f61ad3d06be6d0bc871a984934 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-require-effective-target alloca } */
 
 /* This testcase checks that allocas and VLAs inside loop are correctly unpoisoned.  */
 
@@ -16,7 +17,7 @@ __attribute__((noinline)) void foo(int len) {
   top = &x;
   volatile char array[len];
   assert(!((uintptr_t) array & 31L));
-  alloca(len);
+  __builtin_alloca(len);
   for (int i = 0; i < thirty_two; ++i) {
     char array[i];
     bot = array;
index a9bbf889cbc8ae165a809d8f7f99a3cae5ca11a0..6664c63a4f7f01de5f1fc391ac79bd7aa0628989 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR sanitizer/80953
+       * configure.tgt (sparc*-*-solaris2.11*): Enable.
+       (x86_64-*-solaris2.11* | i?86-*-solaris2.11*): Enable.
+
 2018-11-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR sanitizer/80953
index 1dce1e6dc2736436c8bf50f55e102444da94b508..b241ddbfec4b5a278e265bf106dc0c5e844a6b90 100644 (file)
@@ -43,6 +43,8 @@ case "${target}" in
        ;;
   s390*-*-linux*)
        ;;
+  sparc*-*-solaris2.11*)
+       ;;
   arm*-*-linux*)
        ;;
   mips*64*-*-linux*)
@@ -61,6 +63,8 @@ case "${target}" in
   x86_64-*-darwin[1]* | i?86-*-darwin[1]*)
        TSAN_SUPPORTED=no
        ;;
+  x86_64-*-solaris2.11* | i?86-*-solaris2.11*)
+       ;;
   *)
        UNSUPPORTED=1
        ;;