[ASan]: Add minimalistic support for turning off initialization-order checking for globals of specified types. Tests for this behavior will go to ASan test suite in compiler-rt.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167725 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexey Samsonov 2012-11-12 14:00:01 +00:00
parent d54393153a
commit 9cc45d2d7e
2 changed files with 16 additions and 2 deletions

View File

@ -20,6 +20,7 @@
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
#include "llvm/Module.h"
@ -92,12 +93,24 @@ bool BlackList::isIn(const Module &M) {
return inSection("src", M.getModuleIdentifier());
}
static StringRef GetGVTypeString(const GlobalVariable &G) {
// Types of GlobalVariables are always pointer types.
Type *GType = G.getType()->getElementType();
// For now we support blacklisting struct types only.
if (GType->isStructTy()) {
return GType->getStructName();
}
return "<unknown type>";
}
bool BlackList::isInInit(const GlobalVariable &G) {
return isIn(*G.getParent()) || inSection("global-init", G.getName());
return (isIn(*G.getParent()) ||
inSection("global-init", G.getName()) ||
inSection("global-init-type", GetGVTypeString(G)));
}
bool BlackList::inSection(const StringRef Section,
const StringRef Query) {
const StringRef Query) {
Regex *FunctionRegex = Entries[Section];
return FunctionRegex ? FunctionRegex->match(Query) : false;
}

View File

@ -18,6 +18,7 @@
// fun:*_ZN4base6subtle*
// global:*global_with_bad_access_or_initialization*
// global-init:*global_with_initialization_issues*
// global-init-type:*Namespace::ClassName*
// src:file_with_tricky_code.cc
// ---
// Note that the wild card is in fact an llvm::Regex, but * is automatically