Index: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -857,10 +857,19 @@ 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 @@ 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. Index: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll =================================================================== --- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll +++ llvm/trunk/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