]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/CodeGen/SanitizerBlacklist.cpp
Merge clang 3.5.0 release from ^/vendor/clang/dist, resolve conflicts,
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / CodeGen / SanitizerBlacklist.cpp
1 //===--- SanitizerBlacklist.cpp - Blacklist for sanitizers ----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // User-provided blacklist used to disable/alter instrumentation done in
11 // sanitizers.
12 //
13 //===----------------------------------------------------------------------===//
14 #include "SanitizerBlacklist.h"
15 #include "llvm/IR/Function.h"
16 #include "llvm/IR/GlobalValue.h"
17 #include "llvm/IR/Module.h"
18
19 using namespace clang;
20 using namespace CodeGen;
21
22 static StringRef GetGlobalTypeString(const llvm::GlobalValue &G) {
23   // Types of GlobalVariables are always pointer types.
24   llvm::Type *GType = G.getType()->getElementType();
25   // For now we support blacklisting struct types only.
26   if (llvm::StructType *SGType = dyn_cast<llvm::StructType>(GType)) {
27     if (!SGType->isLiteral())
28       return SGType->getName();
29   }
30   return "<unknown type>";
31 }
32
33 bool SanitizerBlacklist::isIn(const llvm::Module &M,
34                               const StringRef Category) const {
35   return SCL->inSection("src", M.getModuleIdentifier(), Category);
36 }
37
38 bool SanitizerBlacklist::isIn(const llvm::Function &F) const {
39   return isIn(*F.getParent()) ||
40          SCL->inSection("fun", F.getName(), "");
41 }
42
43 bool SanitizerBlacklist::isIn(const llvm::GlobalVariable &G,
44                               const StringRef Category) const {
45   return isIn(*G.getParent(), Category) ||
46          SCL->inSection("global", G.getName(), Category) ||
47          SCL->inSection("type", GetGlobalTypeString(G), Category);
48 }
49
50 bool SanitizerBlacklist::isBlacklistedType(StringRef MangledTypeName) const {
51   return SCL->inSection("type", MangledTypeName);
52 }