1 //===- Sanitizers.cpp - C Language Family Language Options ----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the classes from Sanitizers.h 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/Basic/Sanitizers.h" 14 #include "llvm/ADT/Hashing.h" 15 #include "llvm/ADT/SmallVector.h" 16 #include "llvm/ADT/StringSwitch.h" 17 18 using namespace clang; 19 20 // Once LLVM switches to C++17, the constexpr variables can be inline and we 21 // won't need this. 22 #define SANITIZER(NAME, ID) constexpr SanitizerMask SanitizerKind::ID; 23 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 24 constexpr SanitizerMask SanitizerKind::ID; \ 25 constexpr SanitizerMask SanitizerKind::ID##Group; 26 #include "clang/Basic/Sanitizers.def" 27 28 SanitizerMask clang::parseSanitizerValue(StringRef Value, bool AllowGroups) { 29 SanitizerMask ParsedKind = llvm::StringSwitch<SanitizerMask>(Value) 30 #define SANITIZER(NAME, ID) .Case(NAME, SanitizerKind::ID) 31 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 32 .Case(NAME, AllowGroups ? SanitizerKind::ID##Group : SanitizerMask()) 33 #include "clang/Basic/Sanitizers.def" 34 .Default(SanitizerMask()); 35 return ParsedKind; 36 } 37 38 void clang::serializeSanitizerSet(SanitizerSet Set, 39 SmallVectorImpl<StringRef> &Values) { 40 #define SANITIZER(NAME, ID) \ 41 if (Set.has(SanitizerKind::ID)) \ 42 Values.push_back(NAME); 43 #include "clang/Basic/Sanitizers.def" 44 } 45 46 SanitizerMask clang::expandSanitizerGroups(SanitizerMask Kinds) { 47 #define SANITIZER(NAME, ID) 48 #define SANITIZER_GROUP(NAME, ID, ALIAS) \ 49 if (Kinds & SanitizerKind::ID##Group) \ 50 Kinds |= SanitizerKind::ID; 51 #include "clang/Basic/Sanitizers.def" 52 return Kinds; 53 } 54 55 llvm::hash_code SanitizerMask::hash_value() const { 56 return llvm::hash_combine_range(&maskLoToHigh[0], &maskLoToHigh[kNumElem]); 57 } 58 59 namespace clang { 60 llvm::hash_code hash_value(const clang::SanitizerMask &Arg) { 61 return Arg.hash_value(); 62 } 63 64 StringRef AsanDtorKindToString(llvm::AsanDtorKind kind) { 65 switch (kind) { 66 case llvm::AsanDtorKind::None: 67 return "none"; 68 case llvm::AsanDtorKind::Global: 69 return "global"; 70 case llvm::AsanDtorKind::Invalid: 71 return "invalid"; 72 } 73 return "invalid"; 74 } 75 76 llvm::AsanDtorKind AsanDtorKindFromString(StringRef kindStr) { 77 return llvm::StringSwitch<llvm::AsanDtorKind>(kindStr) 78 .Case("none", llvm::AsanDtorKind::None) 79 .Case("global", llvm::AsanDtorKind::Global) 80 .Default(llvm::AsanDtorKind::Invalid); 81 } 82 83 } // namespace clang 84