Clang Project

clang_source_code/include/clang/Driver/SanitizerArgs.h
1//===--- SanitizerArgs.h - Arguments for sanitizer tools  -------*- C++ -*-===//
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#ifndef LLVM_CLANG_DRIVER_SANITIZERARGS_H
9#define LLVM_CLANG_DRIVER_SANITIZERARGS_H
10
11#include "clang/Basic/Sanitizers.h"
12#include "clang/Driver/Types.h"
13#include "llvm/Option/Arg.h"
14#include "llvm/Option/ArgList.h"
15#include <string>
16#include <vector>
17
18namespace clang {
19namespace driver {
20
21class ToolChain;
22
23class SanitizerArgs {
24  SanitizerSet Sanitizers;
25  SanitizerSet RecoverableSanitizers;
26  SanitizerSet TrapSanitizers;
27
28  std::vector<std::stringBlacklistFiles;
29  std::vector<std::stringExtraDeps;
30  int CoverageFeatures = 0;
31  int MsanTrackOrigins = 0;
32  bool MsanUseAfterDtor = true;
33  bool CfiCrossDso = false;
34  bool CfiICallGeneralizePointers = false;
35  int AsanFieldPadding = 0;
36  bool SharedRuntime = false;
37  bool AsanUseAfterScope = true;
38  bool AsanPoisonCustomArrayCookie = false;
39  bool AsanGlobalsDeadStripping = false;
40  bool AsanUseOdrIndicator = false;
41  std::string HwasanAbi;
42  bool LinkCXXRuntimes = false;
43  bool NeedPIE = false;
44  bool SafeStackRuntime = false;
45  bool Stats = false;
46  bool TsanMemoryAccess = true;
47  bool TsanFuncEntryExit = true;
48  bool TsanAtomics = true;
49  bool MinimalRuntime = false;
50  // True if cross-dso CFI support if provided by the system (i.e. Android).
51  bool ImplicitCfiRuntime = false;
52
53 public:
54  /// Parses the sanitizer arguments from an argument list.
55  SanitizerArgs(const ToolChain &TCconst llvm::opt::ArgList &Args);
56
57  bool needsSharedRt() const { return SharedRuntime; }
58
59  bool needsAsanRt() const { return Sanitizers.has(SanitizerKind::Address); }
60  bool needsHwasanRt() const { return Sanitizers.has(SanitizerKind::HWAddress); }
61  bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); }
62  bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); }
63  bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); }
64  bool needsLsanRt() const {
65    return Sanitizers.has(SanitizerKind::Leak) &&
66           !Sanitizers.has(SanitizerKind::Address) &&
67           !Sanitizers.has(SanitizerKind::HWAddress);
68  }
69  bool needsUbsanRt() const;
70  bool requiresMinimalRuntime() const { return MinimalRuntime; }
71  bool needsDfsanRt() const { return Sanitizers.has(SanitizerKind::DataFlow); }
72  bool needsSafeStackRt() const { return SafeStackRuntime; }
73  bool needsCfiRt() const;
74  bool needsCfiDiagRt() const;
75  bool needsStatsRt() const { return Stats; }
76  bool needsScudoRt() const { return Sanitizers.has(SanitizerKind::Scudo); }
77
78  bool requiresPIE() const;
79  bool needsUnwindTables() const;
80  bool needsLTO() const;
81  bool linkCXXRuntimes() const { return LinkCXXRuntimes; }
82  bool hasCrossDsoCfi() const { return CfiCrossDso; }
83  bool hasAnySanitizer() const { return !Sanitizers.empty(); }
84  void addArgs(const ToolChain &TCconst llvm::opt::ArgList &Args,
85               llvm::opt::ArgStringList &CmdArgstypes::ID InputTypeconst;
86};
87
88}  // namespace driver
89}  // namespace clang
90
91#endif
92
clang::driver::SanitizerArgs::Sanitizers
clang::driver::SanitizerArgs::RecoverableSanitizers
clang::driver::SanitizerArgs::TrapSanitizers
clang::driver::SanitizerArgs::BlacklistFiles
clang::driver::SanitizerArgs::ExtraDeps
clang::driver::SanitizerArgs::CoverageFeatures
clang::driver::SanitizerArgs::MsanTrackOrigins
clang::driver::SanitizerArgs::MsanUseAfterDtor
clang::driver::SanitizerArgs::CfiCrossDso
clang::driver::SanitizerArgs::CfiICallGeneralizePointers
clang::driver::SanitizerArgs::AsanFieldPadding
clang::driver::SanitizerArgs::SharedRuntime
clang::driver::SanitizerArgs::AsanUseAfterScope
clang::driver::SanitizerArgs::AsanPoisonCustomArrayCookie
clang::driver::SanitizerArgs::AsanGlobalsDeadStripping
clang::driver::SanitizerArgs::AsanUseOdrIndicator
clang::driver::SanitizerArgs::HwasanAbi
clang::driver::SanitizerArgs::LinkCXXRuntimes
clang::driver::SanitizerArgs::NeedPIE
clang::driver::SanitizerArgs::SafeStackRuntime
clang::driver::SanitizerArgs::Stats
clang::driver::SanitizerArgs::TsanMemoryAccess
clang::driver::SanitizerArgs::TsanFuncEntryExit
clang::driver::SanitizerArgs::TsanAtomics
clang::driver::SanitizerArgs::MinimalRuntime
clang::driver::SanitizerArgs::ImplicitCfiRuntime
clang::driver::SanitizerArgs::needsSharedRt
clang::driver::SanitizerArgs::needsAsanRt
clang::driver::SanitizerArgs::needsHwasanRt
clang::driver::SanitizerArgs::needsTsanRt
clang::driver::SanitizerArgs::needsMsanRt
clang::driver::SanitizerArgs::needsFuzzer
clang::driver::SanitizerArgs::needsLsanRt
clang::driver::SanitizerArgs::needsUbsanRt
clang::driver::SanitizerArgs::requiresMinimalRuntime
clang::driver::SanitizerArgs::needsDfsanRt
clang::driver::SanitizerArgs::needsSafeStackRt
clang::driver::SanitizerArgs::needsCfiRt
clang::driver::SanitizerArgs::needsCfiDiagRt
clang::driver::SanitizerArgs::needsStatsRt
clang::driver::SanitizerArgs::needsScudoRt
clang::driver::SanitizerArgs::requiresPIE
clang::driver::SanitizerArgs::needsUnwindTables
clang::driver::SanitizerArgs::needsLTO
clang::driver::SanitizerArgs::linkCXXRuntimes
clang::driver::SanitizerArgs::hasCrossDsoCfi
clang::driver::SanitizerArgs::hasAnySanitizer
clang::driver::SanitizerArgs::addArgs
clang::driver::SanitizerArgs::addArgs