1 //===--- Sanitizers.cpp - C Language Family Language Options ----*- C++ -*-===// 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 // This file defines the classes from Sanitizers.h 11 // 12 //===----------------------------------------------------------------------===// 13 #include "clang/Basic/Sanitizers.h" 14 #include "clang/Basic/LLVM.h" 15 #include "llvm/ADT/StringRef.h" 16 #include "llvm/ADT/StringSwitch.h" 17 #include "llvm/Support/MathExtras.h" 18 19 using namespace clang; 20 21 SanitizerSet::SanitizerSet() : Mask(0) {} 22 23 bool SanitizerSet::has(SanitizerMask K) const { 24 assert(llvm::countPopulation(K) == 1); 25 return Mask & K; 26 } 27 28 bool SanitizerSet::hasOneOf(SanitizerMask K) const { 29 return Mask & K; 30 } 31 32 void SanitizerSet::set(SanitizerMask K, bool Value) { 33 assert(llvm::countPopulation(K) == 1); 34 Mask = Value ? (Mask | K) : (Mask & ~K); 35 } 36 37 void SanitizerSet::clear() { 38 Mask = 0; 39 } 40 41 bool SanitizerSet::empty() const { 42 return Mask == 0; 43 } 44 45 SanitizerMask clang::parseSanitizerValue(StringRef Value, bool AllowGroups) { 46 SanitizerMask ParsedKind = llvm::StringSwitch<SanitizerMask>(Value) 47 #define SANITIZER(NAME, ID) .Case(NAME, SanitizerKind::ID) 48 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 49 .Case(NAME, AllowGroups ? SanitizerKind::ID##Group : 0) 50 #include "clang/Basic/Sanitizers.def" 51 .Default(0); 52 return ParsedKind; 53 } 54 55 SanitizerMask clang::expandSanitizerGroups(SanitizerMask Kinds) { 56 #define SANITIZER(NAME, ID) 57 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 58 if (Kinds & SanitizerKind::ID##Group) \ 59 Kinds |= SanitizerKind::ID; 60 #include "clang/Basic/Sanitizers.def" 61 return Kinds; 62 } 63