From 653f94df536568e0ebad840c2d1dd035085213a8 Mon Sep 17 00:00:00 2001 From: Kuba Mracek Date: Thu, 8 Mar 2018 17:24:47 +0000 Subject: [PATCH] [asan] Fix a false positive ODR violation due to LTO ConstantMerge pass [compiler-rt part] 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. Differential Revision: https://reviews.llvm.org/D43959 llvm-svn: 327031 --- compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc | 12 +++--------- .../test/asan/TestCases/lto-constmerge-odr.cc | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 compiler-rt/test/asan/TestCases/lto-constmerge-odr.cc diff --git a/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc b/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc index 40abec5827d5..56dd89b164c2 100644 --- a/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc +++ b/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc @@ -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 #include @@ -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 index 000000000000..11f4ad0c1774 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/lto-constmerge-odr.cc @@ -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; +}