[llvm] r273444 - [asan] Do not instrument accesses to profiling globals
Vedant Kumar via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 22 10:30:59 PDT 2016
Author: vedantk
Date: Wed Jun 22 12:30:58 2016
New Revision: 273444
URL: http://llvm.org/viewvc/llvm-project?rev=273444&view=rev
Log:
[asan] Do not instrument accesses to profiling globals
It's only useful to asan-itize profiling globals while debugging llvm's
profiling instrumentation passes. Enabling asan along with instrprof or
gcov instrumentation shouldn't incur extra overhead.
This patch is in the same spirit as r264805 and r273202, which disabled
tsan instrumentation of instrprof/gcov globals.
Differential Revision: http://reviews.llvm.org/D21541
Added:
llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll
Modified:
llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=273444&r1=273443&r2=273444&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Wed Jun 22 12:30:58 2016
@@ -857,10 +857,19 @@ static GlobalVariable *createPrivateGlob
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::ShouldInstr
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.
Added: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll?rev=273444&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll (added)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll Wed Jun 22 12:30:58 2016
@@ -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
+
+ at __profc_test = private global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
+ at __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
More information about the llvm-commits
mailing list