Path: blob/main/contrib/llvm-project/clang/lib/Basic/Sanitizers.cpp
35233 views
//===- Sanitizers.cpp - C Language Family Language Options ----------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines the classes from Sanitizers.h9//10//===----------------------------------------------------------------------===//1112#include "clang/Basic/Sanitizers.h"13#include "llvm/ADT/Hashing.h"14#include "llvm/ADT/SmallVector.h"15#include "llvm/ADT/StringSwitch.h"16#include "llvm/Support/MathExtras.h"1718using namespace clang;1920// Once LLVM switches to C++17, the constexpr variables can be inline and we21// won't need this.22#define SANITIZER(NAME, ID) constexpr SanitizerMask SanitizerKind::ID;23#define SANITIZER_GROUP(NAME, ID, ALIAS) \24constexpr SanitizerMask SanitizerKind::ID; \25constexpr SanitizerMask SanitizerKind::ID##Group;26#include "clang/Basic/Sanitizers.def"2728SanitizerMask clang::parseSanitizerValue(StringRef Value, bool AllowGroups) {29SanitizerMask 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());35return ParsedKind;36}3738void clang::serializeSanitizerSet(SanitizerSet Set,39SmallVectorImpl<StringRef> &Values) {40#define SANITIZER(NAME, ID) \41if (Set.has(SanitizerKind::ID)) \42Values.push_back(NAME);43#include "clang/Basic/Sanitizers.def"44}4546SanitizerMask clang::expandSanitizerGroups(SanitizerMask Kinds) {47#define SANITIZER(NAME, ID)48#define SANITIZER_GROUP(NAME, ID, ALIAS) \49if (Kinds & SanitizerKind::ID##Group) \50Kinds |= SanitizerKind::ID;51#include "clang/Basic/Sanitizers.def"52return Kinds;53}5455llvm::hash_code SanitizerMask::hash_value() const {56return llvm::hash_combine_range(&maskLoToHigh[0], &maskLoToHigh[kNumElem]);57}5859namespace clang {60unsigned SanitizerMask::countPopulation() const {61unsigned total = 0;62for (const auto &Val : maskLoToHigh)63total += llvm::popcount(Val);64return total;65}6667llvm::hash_code hash_value(const clang::SanitizerMask &Arg) {68return Arg.hash_value();69}7071StringRef AsanDtorKindToString(llvm::AsanDtorKind kind) {72switch (kind) {73case llvm::AsanDtorKind::None:74return "none";75case llvm::AsanDtorKind::Global:76return "global";77case llvm::AsanDtorKind::Invalid:78return "invalid";79}80return "invalid";81}8283llvm::AsanDtorKind AsanDtorKindFromString(StringRef kindStr) {84return llvm::StringSwitch<llvm::AsanDtorKind>(kindStr)85.Case("none", llvm::AsanDtorKind::None)86.Case("global", llvm::AsanDtorKind::Global)87.Default(llvm::AsanDtorKind::Invalid);88}8990StringRef AsanDetectStackUseAfterReturnModeToString(91llvm::AsanDetectStackUseAfterReturnMode mode) {92switch (mode) {93case llvm::AsanDetectStackUseAfterReturnMode::Always:94return "always";95case llvm::AsanDetectStackUseAfterReturnMode::Runtime:96return "runtime";97case llvm::AsanDetectStackUseAfterReturnMode::Never:98return "never";99case llvm::AsanDetectStackUseAfterReturnMode::Invalid:100return "invalid";101}102return "invalid";103}104105llvm::AsanDetectStackUseAfterReturnMode106AsanDetectStackUseAfterReturnModeFromString(StringRef modeStr) {107return llvm::StringSwitch<llvm::AsanDetectStackUseAfterReturnMode>(modeStr)108.Case("always", llvm::AsanDetectStackUseAfterReturnMode::Always)109.Case("runtime", llvm::AsanDetectStackUseAfterReturnMode::Runtime)110.Case("never", llvm::AsanDetectStackUseAfterReturnMode::Never)111.Default(llvm::AsanDetectStackUseAfterReturnMode::Invalid);112}113114} // namespace clang115116117