[PATCH] D21541: [asan] Do not instrument accesses to profiling globals

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 20 17:39:24 PDT 2016


vsk created this revision.
vsk added reviewers: zaks.anna, davidxl.
vsk added a subscriber: llvm-commits.

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.

N.b we don't actually need to add any special logic to asan to skip
instrprof globals, because they are marked private. This patch adds a
regression test for this specific use-case.

http://reviews.llvm.org/D21541

Files:
  lib/Transforms/Instrumentation/AddressSanitizer.cpp
  test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll

Index: test/Instrumentation/AddressSanitizer/do-not-instrument-profiling-globals.ll
===================================================================
--- /dev/null
+++ 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
+
+ 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
Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp
===================================================================
--- lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -853,10 +853,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) {
@@ -1231,7 +1240,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.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21541.61327.patch
Type: text/x-patch
Size: 2204 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160621/88118cc0/attachment.bin>


More information about the llvm-commits mailing list