From eca0bcfaee4c16fe21552234b0c44dfb978974e5 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Thu, 29 May 2014 01:43:53 +0000 Subject: [PATCH] [ASan] Hoist blacklisting globals from init-order checking to Clang. 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209789 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 11 +++++------ test/CodeGen/sanitize-init-order.cpp | 9 +++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index c55e2310d8..484373b20e 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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); diff --git a/test/CodeGen/sanitize-init-order.cpp b/test/CodeGen/sanitize-init-order.cpp index 3e94620193..88a93d1e6b 100644 --- a/test/CodeGen/sanitize-init-order.cpp +++ b/test/CodeGen/sanitize-init-order.cpp @@ -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 -- 2.50.1