[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
This commit is contained in:
Kuba Mracek 2018-03-08 17:24:47 +00:00
parent 0cdccf5f37
commit 653f94df53
2 changed files with 17 additions and 9 deletions

View 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.

View File

@ -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;
}