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 18using 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 28SanitizerMask 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 38void 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 46SanitizerMask 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 55llvm::hash_code SanitizerMask::hash_value() const { 56 return llvm::hash_combine_range(&maskLoToHigh[0], &maskLoToHigh[kNumElem]); 57} 58 59namespace clang { 60llvm::hash_code hash_value(const clang::SanitizerMask &Arg) { 61 return Arg.hash_value(); 62} 63 64StringRef 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 76llvm::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