diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:47:56 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:47:56 +0000 |
commit | 5e20cdd81c44a443562a09007668ffdf76c455af (patch) | |
tree | dbbd4047878da71c1a706e26ce05b4e7791b14cc /include/clang/Basic/Sanitizers.h | |
parent | d5f23b0b7528b5c3caed1ba14f897cc4aaa9e3c3 (diff) | |
download | src-5e20cdd81c44a443562a09007668ffdf76c455af.tar.gz src-5e20cdd81c44a443562a09007668ffdf76c455af.zip |
Vendor import of clang trunk r238337:vendor/clang/clang-trunk-r238337
Notes
Notes:
svn path=/vendor/clang/dist/; revision=283627
svn path=/vendor/clang/clang-trunk-r238337/; revision=283628; tag=vendor/clang/clang-trunk-r238337
Diffstat (limited to 'include/clang/Basic/Sanitizers.h')
-rw-r--r-- | include/clang/Basic/Sanitizers.h | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/include/clang/Basic/Sanitizers.h b/include/clang/Basic/Sanitizers.h index 868b331f2f36..3b1797e9f539 100644 --- a/include/clang/Basic/Sanitizers.h +++ b/include/clang/Basic/Sanitizers.h @@ -15,33 +15,64 @@ #ifndef LLVM_CLANG_BASIC_SANITIZERS_H #define LLVM_CLANG_BASIC_SANITIZERS_H +#include "clang/Basic/LLVM.h" +#include "llvm/ADT/StringRef.h" + +#include <stdint.h> + namespace clang { -enum class SanitizerKind { -#define SANITIZER(NAME, ID) ID, +typedef uint64_t SanitizerMask; + +namespace SanitizerKind { + +// Assign ordinals to possible values of -fsanitize= flag, which we will use as +// bit positions. +enum SanitizerOrdinal : uint64_t { +#define SANITIZER(NAME, ID) SO_##ID, +#define SANITIZER_GROUP(NAME, ID, ALIAS) SO_##ID##Group, #include "clang/Basic/Sanitizers.def" - Unknown + SO_Count }; -class SanitizerSet { - /// \brief Bitmask of enabled sanitizers. - unsigned Kinds; -public: +// Define the set of sanitizer kinds, as well as the set of sanitizers each +// sanitizer group expands into. +#define SANITIZER(NAME, ID) \ + const SanitizerMask ID = 1ULL << SO_##ID; +#define SANITIZER_GROUP(NAME, ID, ALIAS) \ + const SanitizerMask ID = ALIAS; \ + const SanitizerMask ID##Group = 1ULL << SO_##ID##Group; +#include "clang/Basic/Sanitizers.def" + +} + +struct SanitizerSet { SanitizerSet(); - /// \brief Check if a certain sanitizer is enabled. - bool has(SanitizerKind K) const; + /// \brief Check if a certain (single) sanitizer is enabled. + bool has(SanitizerMask K) const; - /// \brief Enable or disable a certain sanitizer. - void set(SanitizerKind K, bool Value); + /// \brief Enable or disable a certain (single) sanitizer. + void set(SanitizerMask K, bool Value); /// \brief Disable all sanitizers. void clear(); /// \brief Returns true if at least one sanitizer is enabled. bool empty() const; + + /// \brief Bitmask of enabled sanitizers. + SanitizerMask Mask; }; +/// Parse a single value from a -fsanitize= or -fno-sanitize= value list. +/// Returns a non-zero SanitizerMask, or \c 0 if \p Value is not known. +SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups); + +/// For each sanitizer group bit set in \p Kinds, set the bits for sanitizers +/// this group enables. +SanitizerMask expandSanitizerGroups(SanitizerMask Kinds); + } // end namespace clang #endif |