1 //===--- SanitizerArgs.h - Arguments for sanitizer tools -------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 #ifndef CLANG_LIB_DRIVER_SANITIZERARGS_H_
10 #define CLANG_LIB_DRIVER_SANITIZERARGS_H_
12 #include "clang/Driver/ArgList.h"
18 /// Assign ordinals to sanitizer flags. We'll use the ordinal values as
19 /// bit positions within \c Kind.
20 enum SanitizeOrdinal {
21 #define SANITIZER(NAME, ID) SO_##ID,
22 #include "clang/Basic/Sanitizers.def"
26 /// Bugs to catch at runtime.
28 #define SANITIZER(NAME, ID) ID = 1 << SO_##ID,
29 #define SANITIZER_GROUP(NAME, ID, ALIAS) ID = ALIAS,
30 #include "clang/Basic/Sanitizers.def"
31 NeedsAsanRt = Address,
33 NeedsUbsanRt = Undefined
38 SanitizerArgs() : Kind(0) {}
39 /// Parses the sanitizer arguments from an argument list.
40 SanitizerArgs(const Driver &D, const ArgList &Args);
42 bool needsAsanRt() const { return Kind & NeedsAsanRt; }
43 bool needsTsanRt() const { return Kind & NeedsTsanRt; }
44 bool needsUbsanRt() const { return Kind & NeedsUbsanRt; }
46 bool sanitizesVptr() const { return Kind & Vptr; }
48 void addArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
51 llvm::SmallString<256> SanitizeOpt("-fsanitize=");
52 #define SANITIZER(NAME, ID) \
54 SanitizeOpt += NAME ",";
55 #include "clang/Basic/Sanitizers.def"
56 SanitizeOpt.pop_back();
57 CmdArgs.push_back(Args.MakeArgString(SanitizeOpt));
61 /// Parse a single value from a -fsanitize= or -fno-sanitize= value list.
62 /// Returns a member of the \c SanitizeKind enumeration, or \c 0 if \p Value
64 static unsigned parse(const char *Value) {
65 return llvm::StringSwitch<SanitizeKind>(Value)
66 #define SANITIZER(NAME, ID) .Case(NAME, ID)
67 #define SANITIZER_GROUP(NAME, ID, ALIAS) .Case(NAME, ID)
68 #include "clang/Basic/Sanitizers.def"
69 .Default(SanitizeKind());
72 /// Parse a -fsanitize= or -fno-sanitize= argument's values, diagnosing any
73 /// invalid components.
74 static unsigned parse(const Driver &D, const Arg *A) {
76 for (unsigned I = 0, N = A->getNumValues(); I != N; ++I) {
77 if (unsigned K = parse(A->getValue(I)))
80 D.Diag(diag::err_drv_unsupported_option_argument)
81 << A->getOption().getName() << A->getValue(I);
86 /// Produce an argument string from argument \p A, which shows how it provides
87 /// a value in \p Mask. For instance, the argument
88 /// "-fsanitize=address,alignment" with mask \c NeedsUbsanRt would produce
89 /// "-fsanitize=alignment".
90 static std::string describeSanitizeArg(const ArgList &Args, const Arg *A,
92 if (!A->getOption().matches(options::OPT_fsanitize_EQ))
93 return A->getAsString(Args);
95 for (unsigned I = 0, N = A->getNumValues(); I != N; ++I)
96 if (parse(A->getValue(I)) & Mask)
97 return std::string("-fsanitize=") + A->getValue(I);
99 llvm_unreachable("arg didn't provide expected value");
103 } // namespace driver
106 #endif // CLANG_LIB_DRIVER_SANITIZERARGS_H_