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