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