Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1528,7 +1528,8 @@ Constant *ODRIndicator = ConstantExpr::getNullValue(IRB.getInt8PtrTy()); GlobalValue *InstrumentedGlobal = NewGlobal; - bool CanUsePrivateAliases = TargetTriple.isOSBinFormatELF(); + bool CanUsePrivateAliases = + TargetTriple.isOSBinFormatELF() || TargetTriple.isOSBinFormatMachO(); if (CanUsePrivateAliases && ClUsePrivateAliasForGlobals) { // Create local alias for NewGlobal to avoid crash on ODR between // instrumented and non-instrumented libraries. Index: projects/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc =================================================================== --- projects/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc +++ projects/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc @@ -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 +#include +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: projects/compiler-rt/test/lit.common.cfg =================================================================== --- projects/compiler-rt/test/lit.common.cfg +++ projects/compiler-rt/test/lit.common.cfg @@ -180,6 +180,9 @@ 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: projects/compiler-rt/test/safestack/lit.cfg =================================================================== --- projects/compiler-rt/test/safestack/lit.cfg +++ projects/compiler-rt/test/safestack/lit.cfg @@ -16,7 +16,6 @@ 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.