[asan] Fix a false positive ODR violation due to LTO ConstantMerge pass [compiler...
authorKuba Mracek <mracek@apple.com>
Thu, 8 Mar 2018 21:02:52 +0000 (21:02 +0000)
committerKuba Mracek <mracek@apple.com>
Thu, 8 Mar 2018 21:02:52 +0000 (21:02 +0000)
This fixes a false positive ODR violation that is reported by ASan when using LTO. In cases, where two constant globals have the same value, LTO will merge them, which breaks ASan's ODR detection. See the included testcase for an example.

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

llvm-svn: 327062

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

index 40abec5827d5f57554226b06549a297b96adc8e7..56dd89b164c22ba8db56359b13bf6f8024f73c62 100644 (file)
@@ -3,15 +3,10 @@
 
 // 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
+// RUN: %env_asan_opts=use_odr_indicator=1 %run %t 2>&1 | FileCheck %s
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -40,6 +35,5 @@ void putstest()
 
 #endif // PART == 1
 
-// CHECK-ODR: ERROR: AddressSanitizer: odr-violation
-// CHECK-NO-ODR-NOT: ERROR: AddressSanitizer: odr-violation
-// CHECK-NO-ODR: Done.
+// CHECK-NOT: ERROR: AddressSanitizer: odr-violation
+// CHECK: Done.
diff --git a/compiler-rt/test/asan/TestCases/lto-constmerge-odr.cc b/compiler-rt/test/asan/TestCases/lto-constmerge-odr.cc
new file mode 100644 (file)
index 0000000..9dc1397
--- /dev/null
@@ -0,0 +1,14 @@
+// RUN: %clangxx_asan -O3 -flto %s -o %t
+// RUN: %run %t 2>&1
+
+// REQUIRES: lto
+
+int main(int argc, const char * argv[]) {
+  struct { long width, height; } a = {16, 16};
+  struct { long width, height; } b = {16, 16};
+
+  // Just to make sure 'a' and 'b' don't get optimized out.
+  asm volatile("" : : "r" (&a), "r" (&b));
+
+  return 0;
+}