[asan] Enable -asan-use-private-alias on Darwin/Mach-O, add test for ODR false positi...
authorKuba Brecka <kuba.brecka@gmail.com>
Wed, 14 Sep 2016 14:09:18 +0000 (14:09 +0000)
committerKuba Brecka <kuba.brecka@gmail.com>
Wed, 14 Sep 2016 14:09:18 +0000 (14:09 +0000)
The '-asan-use-private-alias’ option (disabled by default) option is currently only enabled for Linux and ELF, but it also works on Darwin and Mach-O. This option also fixes a known problem with LTO on Darwin (https://github.com/google/sanitizers/issues/647). This patch enables the support for Darwin (but still keeps it off by default) and adds the LTO test case.

Differential Revision: https://reviews.llvm.org/D24292

llvm-svn: 281472

compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc [new file with mode: 0644]
compiler-rt/test/lit.common.cfg
compiler-rt/test/safestack/lit.cfg

diff --git a/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc b/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc
new file mode 100644 (file)
index 0000000..23f1e05
--- /dev/null
@@ -0,0 +1,41 @@
+// Check that -asan-use-private-alias and use_odr_indicator=1 silence the false
+// positive ODR violation on Darwin with LTO.
+
+// REQUIRES: lto
+
+// RUN: %clangxx_asan -DPART=0 -c %s -o %t-1.o -flto
+// RUN: %clangxx_asan -DPART=1 -c %s -o %t-2.o -flto
+// RUN: %clangxx_asan %t-1.o %t-2.o -o %t -flto
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ODR
+
+// RUN: %clangxx_asan -DPART=0 -c %s -o %t-1.o -flto -mllvm -asan-use-private-alias
+// RUN: %clangxx_asan -DPART=1 -c %s -o %t-2.o -flto -mllvm -asan-use-private-alias
+// RUN: %clangxx_asan %t-1.o %t-2.o -o %t -flto
+// RUN: %env_asan_opts=use_odr_indicator=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NO-ODR
+
+#include <stdio.h>
+#include <stdlib.h>
+void putstest();
+
+#if PART == 1
+
+int main()
+{
+  fputs("test\n", stderr);
+  putstest();
+  fprintf(stderr, "Done.\n");
+  return 0;
+}
+
+#else // PART == 1
+
+void putstest()
+{
+  fputs("test\n", stderr);
+}
+
+#endif // PART == 1
+
+// CHECK-ODR: ERROR: AddressSanitizer: odr-violation
+// CHECK-NO-ODR-NOT: ERROR: AddressSanitizer: odr-violation
+// CHECK-NO-ODR: Done.
index 9c5e7d0..d4e7eb3 100644 (file)
@@ -177,6 +177,9 @@ elif config.host_os == 'Windows' and is_windows_lto_supported():
 else:
   config.lto_supported = False
 
+if config.lto_supported:
+  config.available_features.add('lto')
+
 # Ask llvm-config about assertion mode.
 try:
   llvm_config_cmd = subprocess.Popen(
index 535c097..d4ec73c 100644 (file)
@@ -16,7 +16,6 @@ config.substitutions.append( ("%clang_nosafestack ", config.clang + " -O0 -fno-s
 config.substitutions.append( ("%clang_safestack ", config.clang + " -O0 -fsanitize=safe-stack ") )
 
 if config.lto_supported:
-  config.available_features.add('lto')
   config.substitutions.append((r"%clang_lto_safestack ", ' '.join(config.lto_launch + [config.clang] + config.lto_flags + ['-flto -fsanitize=safe-stack '])))
 
 # SafeStack tests are currently supported on Linux, FreeBSD and Darwin only.