[ASan] Hoist blacklisting globals from init-order checking to Clang.
authorAlexey Samsonov <vonosmas@gmail.com>
Thu, 29 May 2014 01:43:53 +0000 (01:43 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Thu, 29 May 2014 01:43:53 +0000 (01:43 +0000)
Clang knows about the sanitizer blacklist and it makes no sense to
add global to the list of llvm.asan.dynamically_initialized_globals if it
will be blacklisted in the instrumentation pass anyway. Instead, we should
do as much blacklisting as possible (if not all) in the frontend.

llvm-svn: 209789

clang/lib/CodeGen/CodeGenModule.cpp
clang/test/CodeGen/sanitize-init-order.cpp

index c55e231..484373b 100644 (file)
@@ -1878,12 +1878,11 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
     EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
 
   // If we are compiling with ASan, add metadata indicating dynamically
-  // initialized globals.
-  if (SanOpts.Address && NeedsGlobalCtor) {
-    llvm::Module &M = getModule();
-
-    llvm::NamedMDNode *DynamicInitializers =
-        M.getOrInsertNamedMetadata("llvm.asan.dynamically_initialized_globals");
+  // initialized (and not blacklisted) globals.
+  if (SanOpts.Address && NeedsGlobalCtor &&
+      !SanitizerBlacklist->isIn(*GV, "init")) {
+    llvm::NamedMDNode *DynamicInitializers = TheModule.getOrInsertNamedMetadata(
+        "llvm.asan.dynamically_initialized_globals");
     llvm::Value *GlobalToAdd[] = { GV };
     llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalToAdd);
     DynamicInitializers->addOperand(ThisGlobal);
index 3e94620..88a93d1 100644 (file)
@@ -1,5 +1,12 @@
 // RUN: %clang_cc1 -fsanitize=address,init-order -emit-llvm -o - %s | FileCheck %s
 
+// Test blacklist functionality.
+// RUN: echo "global-init-src:%s" > %t-file.blacklist
+// RUN: echo "global-init-type:struct.PODWithCtorAndDtor" > %t-type.blacklist
+// RUN: %clang_cc1 -fsanitize=address,init-order -fsanitize-blacklist=%t-file.blacklist -emit-llvm -o - %s | FileCheck %s --check-prefix=BLACKLIST
+// RUN: %clang_cc1 -fsanitize=address,init-order -fsanitize-blacklist=%t-type.blacklist -emit-llvm -o - %s | FileCheck %s --check-prefix=BLACKLIST
+// REQUIRES: shell
+
 struct PODStruct {
   int x;
 };
@@ -22,3 +29,5 @@ PODWithCtorAndDtor s3;
 // constructor.
 // CHECK: !llvm.asan.dynamically_initialized_globals = !{[[GLOB:![0-9]+]]}
 // CHECK: [[GLOB]] = metadata !{%struct.PODWithCtorAndDtor
+
+// BLACKLIST-NOT: llvm.asan.dynamically_initialized_globals