blob: 8c4884b8ec367ae208a7f390b712b2431c96ca97 [file] [log] [blame]
Alexey Samsonova0416102014-11-11 01:26:14 +00001//===--- Sanitizers.cpp - C Language Family Language Options ----*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the classes from Sanitizers.h
11//
12//===----------------------------------------------------------------------===//
13#include "clang/Basic/Sanitizers.h"
Peter Collingbournebf59c342015-05-11 21:39:20 +000014#include "clang/Basic/LLVM.h"
15#include "llvm/ADT/StringRef.h"
16#include "llvm/ADT/StringSwitch.h"
Peter Collingbourne3eea6772015-05-11 21:39:14 +000017#include "llvm/Support/MathExtras.h"
Alexey Samsonova0416102014-11-11 01:26:14 +000018
19using namespace clang;
20
Peter Collingbourne3eea6772015-05-11 21:39:14 +000021SanitizerSet::SanitizerSet() : Mask(0) {}
Alexey Samsonova0416102014-11-11 01:26:14 +000022
Peter Collingbourne3eea6772015-05-11 21:39:14 +000023bool SanitizerSet::has(SanitizerMask K) const {
24 assert(llvm::countPopulation(K) == 1);
25 return Mask & K;
Alexey Samsonova0416102014-11-11 01:26:14 +000026}
27
Peter Collingbourne3eea6772015-05-11 21:39:14 +000028void SanitizerSet::set(SanitizerMask K, bool Value) {
29 assert(llvm::countPopulation(K) == 1);
30 Mask = Value ? (Mask | K) : (Mask & ~K);
Alexey Samsonova0416102014-11-11 01:26:14 +000031}
32
33void SanitizerSet::clear() {
Peter Collingbourne3eea6772015-05-11 21:39:14 +000034 Mask = 0;
Alexey Samsonova0416102014-11-11 01:26:14 +000035}
Alexey Samsonov4c12c6c2014-11-14 02:59:20 +000036
37bool SanitizerSet::empty() const {
Peter Collingbourne3eea6772015-05-11 21:39:14 +000038 return Mask == 0;
Alexey Samsonov4c12c6c2014-11-14 02:59:20 +000039}
Peter Collingbournebf59c342015-05-11 21:39:20 +000040
41SanitizerMask clang::parseSanitizerValue(StringRef Value, bool AllowGroups) {
42 SanitizerMask ParsedKind = llvm::StringSwitch<SanitizerMask>(Value)
43#define SANITIZER(NAME, ID) .Case(NAME, SanitizerKind::ID)
44#define SANITIZER_GROUP(NAME, ID, ALIAS) \
45 .Case(NAME, AllowGroups ? SanitizerKind::ID##Group : 0)
46#include "clang/Basic/Sanitizers.def"
47 .Default(0);
48 return ParsedKind;
49}
50
51SanitizerMask clang::expandSanitizerGroups(SanitizerMask Kinds) {
52#define SANITIZER(NAME, ID)
53#define SANITIZER_GROUP(NAME, ID, ALIAS) \
54 if (Kinds & SanitizerKind::ID##Group) \
55 Kinds |= SanitizerKind::ID;
56#include "clang/Basic/Sanitizers.def"
57 return Kinds;
58}