[compiler-rt] r327062 - [asan] Fix a false positive ODR violation due to LTO ConstantMerge pass [compiler-rt part, take 3]

Kuba Mracek via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 8 13:02:52 PST 2018


Author: kuba.brecka
Date: Thu Mar  8 13:02:52 2018
New Revision: 327062

URL: http://llvm.org/viewvc/llvm-project?rev=327062&view=rev
Log:
[asan] Fix a false positive ODR violation due to LTO ConstantMerge pass [compiler-rt part, take 3]

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


Added:
    compiler-rt/trunk/test/asan/TestCases/lto-constmerge-odr.cc
Modified:
    compiler-rt/trunk/test/asan/TestCases/Darwin/odr-lto.cc

Modified: compiler-rt/trunk/test/asan/TestCases/Darwin/odr-lto.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Darwin/odr-lto.cc?rev=327062&r1=327061&r2=327062&view=diff
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Darwin/odr-lto.cc (original)
+++ compiler-rt/trunk/test/asan/TestCases/Darwin/odr-lto.cc Thu Mar  8 13:02:52 2018
@@ -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.

Added: compiler-rt/trunk/test/asan/TestCases/lto-constmerge-odr.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/lto-constmerge-odr.cc?rev=327062&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/lto-constmerge-odr.cc (added)
+++ compiler-rt/trunk/test/asan/TestCases/lto-constmerge-odr.cc Thu Mar  8 13:02:52 2018
@@ -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;
+}




More information about the llvm-commits mailing list