summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2012-09-05 07:29:56 +0000
committerKostya Serebryany <kcc@google.com>2012-09-05 07:29:56 +0000
commit2fa38f8ce07466e8a80716ee575c38066dab1f80 (patch)
treed4c6a4f718e71e4b6cdf7f60d7f6434d4fec8468 /llvm/lib
parent81f06df699ae30113fcdf6f84c4876f8aac45d89 (diff)
downloadbcm5719-llvm-2fa38f8ce07466e8a80716ee575c38066dab1f80.tar.gz
bcm5719-llvm-2fa38f8ce07466e8a80716ee575c38066dab1f80.zip
[asan] extend the blacklist functionality to handle global-init. Patch by Reid Watson
llvm-svn: 163199
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp3
-rw-r--r--llvm/lib/Transforms/Instrumentation/BlackList.cpp4
-rw-r--r--llvm/lib/Transforms/Instrumentation/BlackList.h5
3 files changed, 11 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index 42f21d2983a..33047293658 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -544,6 +544,7 @@ bool AddressSanitizer::ShouldInstrumentGlobal(GlobalVariable *G) {
Type *Ty = cast<PointerType>(G->getType())->getElementType();
DEBUG(dbgs() << "GLOBAL: " << *G);
+ if (BL->isIn(*G)) return false;
if (!Ty->isSized()) return false;
if (!G->hasInitializer()) return false;
// Touch only those globals that will not be defined in other modules.
@@ -643,6 +644,8 @@ bool AddressSanitizer::insertGlobalRedzones(Module &M) {
Type *RightRedZoneTy = ArrayType::get(IRB.getInt8Ty(), RightRedzoneSize);
// Determine whether this global should be poisoned in initialization.
bool GlobalHasDynamicInitializer = HasDynamicInitializer(G);
+ // Don't check initialization order if this global is blacklisted.
+ GlobalHasDynamicInitializer &= ! BL->isInInit(*G);
StructType *NewTy = StructType::get(Ty, RightRedZoneTy, NULL);
Constant *NewInitializer = ConstantStruct::get(
diff --git a/llvm/lib/Transforms/Instrumentation/BlackList.cpp b/llvm/lib/Transforms/Instrumentation/BlackList.cpp
index ecfe954dec1..2cb119964a3 100644
--- a/llvm/lib/Transforms/Instrumentation/BlackList.cpp
+++ b/llvm/lib/Transforms/Instrumentation/BlackList.cpp
@@ -89,6 +89,10 @@ bool BlackList::isIn(const Module &M) {
return inSection("src", M.getModuleIdentifier());
}
+bool BlackList::isInInit(const GlobalVariable &G) {
+ return isIn(*G.getParent()) || inSection("global-init", G.getName());
+}
+
bool BlackList::inSection(const StringRef Section,
const StringRef Query) {
Regex *FunctionRegex = Entries[Section];
diff --git a/llvm/lib/Transforms/Instrumentation/BlackList.h b/llvm/lib/Transforms/Instrumentation/BlackList.h
index e303dbcd961..73977fc10a6 100644
--- a/llvm/lib/Transforms/Instrumentation/BlackList.h
+++ b/llvm/lib/Transforms/Instrumentation/BlackList.h
@@ -14,7 +14,8 @@
// variables. Each line contains a prefix, followed by a wild card expression.
// ---
// fun:*_ZN4base6subtle*
-// global:*global_with_initialization_problems*
+// global:*global_with_bad_access_or_initialization*
+// global-init:*global_with_initialization_issues*
// src:file_with_tricky_code.cc
// ---
// Note that the wild card is in fact an llvm::Regex, but * is automatically
@@ -43,6 +44,8 @@ class BlackList {
bool isIn(const GlobalVariable &G);
// Returns whether this module is blacklisted by filename.
bool isIn(const Module &M);
+ // Returns whether a global should be excluded from initialization checking.
+ bool isInInit(const GlobalVariable &G);
private:
StringMap<Regex*> Entries;
OpenPOWER on IntegriCloud