diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 396e23b88ce7e..33693eb5417db 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -857,10 +857,19 @@ static GlobalVariable *createPrivateGlobalForSourceLoc(Module &M, return GV; } -static bool GlobalWasGeneratedByAsan(GlobalVariable *G) { - return G->getName().startswith(kAsanGenPrefix) || - G->getName().startswith(kSanCovGenPrefix) || - G->getName().startswith(kODRGenPrefix); +/// \brief Check if \p G has been created by a trusted compiler pass. +static bool GlobalWasGeneratedByCompiler(GlobalVariable *G) { + // Do not instrument asan globals. + if (G->getName().startswith(kAsanGenPrefix) || + G->getName().startswith(kSanCovGenPrefix) || + G->getName().startswith(kODRGenPrefix)) + return true; + + // Do not instrument gcov counter arrays. + if (G->getName() == "__llvm_gcov_ctr") + return true; + + return false; } Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) { @@ -1243,7 +1252,7 @@ bool AddressSanitizerModule::ShouldInstrumentGlobal(GlobalVariable *G) { if (GlobalsMD.get(G).IsBlacklisted) return false; if (!Ty->isSized()) return false; if (!G->hasInitializer()) return false; - if (GlobalWasGeneratedByAsan(G)) return false; // Our own global. + if (GlobalWasGeneratedByCompiler(G)) return false; // Our own globals. // Touch only those globals that will not be defined in other modules. // Don't handle ODR linkage types and COMDATs since other modules may be built // without ASan. diff --git a/llvm/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll b/llvm/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll new file mode 100644 index 0000000000000..82fb2f0d2f7b0 --- /dev/null +++ b/llvm/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll @@ -0,0 +1,9 @@ +; This test checks that we don't instrument globals created by profiling passes. +; RUN: opt < %s -asan -asan-module -S | FileCheck %s + +@__profc_test = private global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 +@__llvm_gcov_ctr = internal global [1 x i64] zeroinitializer + +; CHECK-DAG: @asan.module_ctor +; CHECK-NOT: @__asan_gen{{.*}}__llvm_gcov_ctr +; CHECK-NOT: @__asan_gen{{.*}}__profc_test