Home | History | Annotate | Line # | Download | only in Basic
      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