29#include "clang/Config/config.h"
43#include "llvm/ADT/APInt.h"
44#include "llvm/ADT/ArrayRef.h"
45#include "llvm/ADT/CachedHashString.h"
46#include "llvm/ADT/FloatingPointMode.h"
47#include "llvm/ADT/STLExtras.h"
48#include "llvm/ADT/SmallVector.h"
49#include "llvm/ADT/StringRef.h"
50#include "llvm/ADT/StringSwitch.h"
51#include "llvm/ADT/Twine.h"
52#include "llvm/Config/llvm-config.h"
53#include "llvm/Frontend/Debug/Options.h"
54#include "llvm/IR/DebugInfoMetadata.h"
55#include "llvm/Linker/Linker.h"
56#include "llvm/MC/MCTargetOptions.h"
57#include "llvm/Option/Arg.h"
58#include "llvm/Option/ArgList.h"
59#include "llvm/Option/OptSpecifier.h"
60#include "llvm/Option/OptTable.h"
61#include "llvm/Option/Option.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/Remarks/HotnessThresholdParser.h"
64#include "llvm/Support/CodeGen.h"
65#include "llvm/Support/Compiler.h"
66#include "llvm/Support/Error.h"
67#include "llvm/Support/ErrorHandling.h"
68#include "llvm/Support/ErrorOr.h"
69#include "llvm/Support/FileSystem.h"
70#include "llvm/Support/HashBuilder.h"
71#include "llvm/Support/MathExtras.h"
72#include "llvm/Support/MemoryBuffer.h"
73#include "llvm/Support/Path.h"
74#include "llvm/Support/Process.h"
75#include "llvm/Support/Regex.h"
76#include "llvm/Support/VersionTuple.h"
77#include "llvm/Support/VirtualFileSystem.h"
78#include "llvm/Support/raw_ostream.h"
79#include "llvm/Target/TargetOptions.h"
80#include "llvm/TargetParser/Host.h"
81#include "llvm/TargetParser/Triple.h"
109 if (Arg.getAsInteger(10, Val))
110 return llvm::createStringError(llvm::inconvertibleErrorCode(),
111 "Not an integer: %s", Arg.data());
120 return std::make_shared<T>(
X);
191 if (Storage.use_count() > 1)
192 Storage = std::make_shared<T>(*Storage);
255#define OPTTABLE_STR_TABLE_CODE
256#include "clang/Options/Options.inc"
257#undef OPTTABLE_STR_TABLE_CODE
260 return OptionStrTable[Offset];
263#define SIMPLE_ENUM_VALUE_TABLE
264#include "clang/Options/Options.inc"
265#undef SIMPLE_ENUM_VALUE_TABLE
271 if (Args.hasArg(Opt))
280 if (Args.hasArg(Opt))
290 unsigned SpellingOffset, Option::OptionClass,
295 const Twine &Spelling, Option::OptionClass,
301 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
305 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
307 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
309 if (Args.hasArg(Opt))
316 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
322 OptSpecifier OtherOpt) {
323 return [
Value, OtherValue,
324 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
326 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
327 return A->getOption().matches(Opt) ?
Value : OtherValue;
335 Option::OptionClass,
unsigned,
bool KeyPath) {
336 if (KeyPath ==
Value)
342 const Twine &Spelling,
343 Option::OptionClass OptClass,
unsigned,
344 const Twine &
Value) {
346 case Option::SeparateClass:
347 case Option::JoinedOrSeparateClass:
348 case Option::JoinedAndSeparateClass:
352 case Option::JoinedClass:
353 case Option::CommaJoinedClass:
354 Consumer(Spelling +
Value);
357 llvm_unreachable(
"Cannot denormalize an option with option class "
358 "incompatible with string denormalization.");
365 Option::OptionClass OptClass,
unsigned TableIndex,
T Value) {
367 TableIndex, Twine(
Value));
372 Option::OptionClass OptClass,
unsigned TableIndex,
377static std::optional<SimpleEnumValue>
379 for (
int I = 0, E = Table.Size; I != E; ++I)
380 if (Name == Table.Table[I].Name)
381 return Table.Table[I];
386static std::optional<SimpleEnumValue>
388 for (
int I = 0, E = Table.Size; I != E; ++I)
390 return Table.Table[I];
399 assert(TableIndex < SimpleEnumValueTablesSize);
400 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
402 auto *Arg = Args.getLastArg(Opt);
406 StringRef ArgValue = Arg->getValue();
408 return MaybeEnumVal->Value;
410 Diags.
Report(diag::err_drv_invalid_value)
411 << Arg->getAsString(Args) << ArgValue;
416 unsigned SpellingOffset,
417 Option::OptionClass OptClass,
418 unsigned TableIndex,
unsigned Value) {
419 assert(TableIndex < SimpleEnumValueTablesSize);
420 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
423 TableIndex, MaybeEnumVal->Name);
425 llvm_unreachable(
"The simple enum value was not correctly defined in "
426 "the tablegen option description");
432 unsigned SpellingOffset,
433 Option::OptionClass OptClass,
434 unsigned TableIndex,
T Value) {
436 TableIndex,
static_cast<unsigned>(
Value));
443 auto *Arg = Args.getLastArg(Opt);
446 return std::string(Arg->getValue());
449template <
typename IntTy>
453 auto *Arg = Args.getLastArg(Opt);
457 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
458 Diags.
Report(diag::err_drv_invalid_int_value)
459 << Arg->getAsString(Args) << Arg->getValue();
465static std::optional<std::vector<std::string>>
468 return Args.getAllArgValues(Opt);
472 unsigned SpellingOffset,
473 Option::OptionClass OptClass,
475 const std::vector<std::string> &Values) {
477 case Option::CommaJoinedClass: {
478 std::string CommaJoinedValue;
479 if (!Values.empty()) {
480 CommaJoinedValue.append(Values.front());
481 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
482 CommaJoinedValue.append(
",");
483 CommaJoinedValue.append(
Value);
487 Option::OptionClass::JoinedClass, TableIndex,
491 case Option::JoinedClass:
492 case Option::SeparateClass:
493 case Option::JoinedOrSeparateClass:
494 for (
const std::string &
Value : Values)
498 llvm_unreachable(
"Cannot denormalize an option with option class "
499 "incompatible with string vector denormalization.");
507 auto *Arg = Args.getLastArg(Opt);
510 return llvm::Triple::normalize(Arg->getValue());
513template <
typename T,
typename U>
515 return static_cast<T>(
Value);
519 return KeyPath |
Value;
526template <
typename T,
typename U, U Value>
531#define PARSE_OPTION_WITH_MARSHALLING( \
532 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
533 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
534 METAVAR, VALUES, SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
535 DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
536 MERGER, EXTRACTOR, TABLE_INDEX) \
537 if ((VISIBILITY) & options::CC1Option) { \
538 KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
540 KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
542 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
544 MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
549#define GENERATE_OPTION_WITH_MARSHALLING( \
550 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
551 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
552 SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
553 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
555 if ((VISIBILITY) & options::CC1Option) { \
556 [&](const auto &Extracted) { \
559 static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
560 : (DEFAULT_VALUE)))) \
561 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
562 TABLE_INDEX, Extracted); \
563 }(EXTRACTOR(KEYPATH)); \
577 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
578 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
579 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
580 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
583 CodeGenOpts.ClearASTBeforeBackend =
false;
585 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
586 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
589 llvm::Triple
T(TargetOpts.
Triple);
590 llvm::Triple::ArchType
Arch =
T.getArch();
595 if (CodeGenOpts.getExceptionHandling() !=
597 T.isWindowsMSVCEnvironment())
598 Diags.
Report(diag::err_fe_invalid_exception_model)
599 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) <<
T.str();
601 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
602 Diags.
Report(diag::warn_c_kext);
604 if (LangOpts.NewAlignOverride &&
605 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
606 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
607 Diags.
Report(diag::err_fe_invalid_alignment)
608 << A->getAsString(Args) << A->getValue();
609 LangOpts.NewAlignOverride = 0;
614 if (LangOpts.CPlusPlus11) {
615 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
616 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
617 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
618 <<
bool(LangOpts.RawStringLiterals);
622 LangOpts.RawStringLiterals =
true;
625 LangOpts.NamedLoops =
626 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
629 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
630 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
633 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
634 Diags.
Report(diag::err_drv_argument_not_allowed_with)
637 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
638 Diags.
Report(diag::err_drv_argument_not_allowed_with)
641 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
642 Diags.
Report(diag::err_drv_argument_not_allowed_with)
645 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
646 Diags.
Report(diag::err_drv_argument_not_allowed_with)
649 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
650 Diags.
Report(diag::warn_ignored_hip_only_option)
651 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
653 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
654 Diags.
Report(diag::warn_ignored_hip_only_option)
655 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
664 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
665 if (LangOpts.ApproxFunc)
666 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
667 if (LangOpts.AllowFPReassoc)
668 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
669 if (LangOpts.AllowRecip)
670 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
676 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
678 Diags.
Report(diag::warn_option_invalid_ocl_version)
680 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
682 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
683 auto DefaultCC = LangOpts.getDefaultCallingConv();
687 Arch != llvm::Triple::x86;
693 Diags.
Report(diag::err_drv_argument_not_allowed_with)
694 << A->getSpelling() <<
T.getTriple();
705 llvm::opt::OptSpecifier OptSpecifier) {
708 Option::OptionClass::FlagClass, 0);
712 llvm::opt::OptSpecifier OptSpecifier,
713 const Twine &
Value) {
751 bool CheckAgainstOriginalInvocation =
false,
752 bool ForceRoundTrip =
false) {
754 bool DoRoundTripDefault =
true;
756 bool DoRoundTripDefault =
false;
759 bool DoRoundTrip = DoRoundTripDefault;
760 if (ForceRoundTrip) {
763 for (
const auto *Arg : CommandLineArgs) {
764 if (Arg == StringRef(
"-round-trip-args"))
766 if (Arg == StringRef(
"-no-round-trip-args"))
774 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
779 llvm::raw_string_ostream OS(Buffer);
780 for (
const char *Arg : Args) {
781 llvm::sys::printArg(OS, Arg,
true);
794 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
801 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
807 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
808 Diags.
Report(diag::note_cc1_round_trip_original)
809 << SerializeArgs(CommandLineArgs);
814 llvm::BumpPtrAllocator Alloc;
815 llvm::StringSaver StringPool(Alloc);
816 auto SA = [&StringPool](
const Twine &Arg) {
817 return StringPool.save(Arg).data();
824 Generate(DummyInvocation, GeneratedArgs, SA);
830 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
835 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
836 Diags.
Report(diag::note_cc1_round_trip_generated)
837 << 1 << SerializeArgs(GeneratedArgs);
842 if (CheckAgainstOriginalInvocation)
844 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
848 Generate(RealInvocation, ComparisonArgs, SA);
853 return llvm::equal(A, B, [](
const char *AElem,
const char *BElem) {
854 return StringRef(AElem) == StringRef(BElem);
861 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
862 Diags.
Report(diag::err_cc1_round_trip_mismatch);
863 Diags.
Report(diag::note_cc1_round_trip_generated)
864 << 1 << SerializeArgs(GeneratedArgs);
865 Diags.
Report(diag::note_cc1_round_trip_generated)
866 << 2 << SerializeArgs(ComparisonArgs);
870 Diags.
Report(diag::remark_cc1_round_trip_generated)
871 << 1 << SerializeArgs(GeneratedArgs);
872 Diags.
Report(diag::remark_cc1_round_trip_generated)
873 << 2 << SerializeArgs(ComparisonArgs);
885 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
889 Args.push_back(
"-cc1");
892 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
897 OptSpecifier GroupWithValue,
898 std::vector<std::string> &Diagnostics) {
899 for (
auto *A : Args.filtered(Group)) {
900 if (A->getOption().getKind() == Option::FlagClass) {
903 Diagnostics.push_back(
904 std::string(A->getOption().getName().drop_front(1)));
905 }
else if (A->getOption().matches(GroupWithValue)) {
908 Diagnostics.push_back(
909 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
912 Diagnostics.push_back(A->getValue());
923 std::vector<std::string> &Funcs) {
924 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
926 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
933#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
934 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
935#include "clang/Options/Options.inc"
936#undef ANALYZER_OPTION_WITH_MARSHALLING
940#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
942 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
944#include "clang/StaticAnalyzer/Core/Analyses.def"
946 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
952#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
954 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
956#include "clang/StaticAnalyzer/Core/Analyses.def"
958 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
964#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
966 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
968#include "clang/StaticAnalyzer/Core/Analyses.def"
970 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
976#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
978 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
980#include "clang/StaticAnalyzer/Core/Analyses.def"
982 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
988 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
997 for (
const auto &
C : Opts.
Config)
998 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
999 llvm::sort(SortedConfigOpts, llvm::less_first());
1001 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1004 auto Entry = ConfigOpts.
Config.find(Key);
1005 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1020#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1021 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1022#include "clang/Options/Options.inc"
1023#undef ANALYZER_OPTION_WITH_MARSHALLING
1025 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1026 StringRef Name = A->getValue();
1028#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1029 .Case(CMDFLAG, NAME##Model)
1030#include "clang/StaticAnalyzer/Core/Analyses.def"
1033 Diags.
Report(diag::err_drv_invalid_value)
1034 << A->getAsString(Args) << Name;
1037 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1038 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1045 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1046 StringRef Name = A->getValue();
1048#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1049 .Case(CMDFLAG, PD_##NAME)
1050#include "clang/StaticAnalyzer/Core/Analyses.def"
1053 Diags.
Report(diag::err_drv_invalid_value)
1054 << A->getAsString(Args) << Name;
1060 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1061 StringRef Name = A->getValue();
1063#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1064 .Case(CMDFLAG, NAME)
1065#include "clang/StaticAnalyzer/Core/Analyses.def"
1068 Diags.
Report(diag::err_drv_invalid_value)
1069 << A->getAsString(Args) << Name;
1075 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1076 StringRef Name = A->getValue();
1078#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1079 .Case(CMDFLAG, NAME)
1080#include "clang/StaticAnalyzer/Core/Analyses.def"
1083 Diags.
Report(diag::err_drv_invalid_value)
1084 << A->getAsString(Args) << Name;
1092 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1094 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1097 StringRef CheckerAndPackageList = A->getValue();
1099 CheckerAndPackageList.split(CheckersAndPackages,
",");
1100 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1106 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1110 StringRef configList = A->getValue();
1112 configList.split(configVals,
",");
1113 for (
const auto &configVal : configVals) {
1115 std::tie(key, val) = configVal.split(
"=");
1118 diag::err_analyzer_config_no_value) << configVal;
1121 if (val.contains(
'=')) {
1123 diag::err_analyzer_config_multiple_values)
1132 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1137 Opts.
Config[key] = std::string(val);
1147 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1150 os << Args.getArgString(i);
1157 StringRef OptionName, StringRef DefaultVal) {
1158 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1163 StringRef &OptionField, StringRef Name,
1164 StringRef DefaultVal) {
1173 bool &OptionField, StringRef Name,
bool DefaultVal) {
1174 auto PossiblyInvalidVal =
1175 llvm::StringSwitch<std::optional<bool>>(
1178 .Case(
"false",
false)
1179 .Default(std::nullopt);
1181 if (!PossiblyInvalidVal) {
1183 Diags->
Report(diag::err_analyzer_config_invalid_input)
1184 << Name <<
"a boolean";
1186 OptionField = DefaultVal;
1188 OptionField = *PossiblyInvalidVal;
1193 unsigned &OptionField, StringRef Name,
1194 unsigned DefaultVal) {
1196 OptionField = DefaultVal;
1197 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1198 .getAsInteger(0, OptionField);
1199 if (Diags && HasFailed)
1200 Diags->
Report(diag::err_analyzer_config_invalid_input)
1201 << Name <<
"an unsigned";
1207 unsigned DefaultVal) {
1210 if (Parsed.has_value()) {
1211 OptionField = Parsed.value();
1214 if (Diags && !Parsed.has_value())
1215 Diags->
Report(diag::err_analyzer_config_invalid_input)
1216 << Name <<
"a positive";
1218 OptionField = DefaultVal;
1226#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1227 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1228#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1229#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1231 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1232 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1234#define ANALYZER_OPTION(...)
1235#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1236 SHALLOW_VAL, DEEP_VAL) \
1237 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1238 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1239#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1246 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1247 std::vector<StringRef> Checkers =
1249 std::vector<StringRef> Packages =
1253 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1255 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1257 bool IsChecker = CheckerOrPackage.contains(
'.');
1258 bool IsValidName = IsChecker
1259 ? llvm::is_contained(Checkers, CheckerOrPackage)
1260 : llvm::is_contained(Packages, CheckerOrPackage);
1263 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1264 << CheckerOrPackage;
1274 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1275 Diags->
Report(diag::err_analyzer_config_invalid_input)
1276 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1284 if (
Remark.hasValidPattern()) {
1289 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1298 OptSpecifier OptEQ, StringRef Name) {
1301 auto InitializeResultPattern = [&Diags, &Args, &Result](
const Arg *A,
1302 StringRef Pattern) {
1303 Result.Pattern = Pattern.str();
1305 std::string RegexError;
1306 Result.Regex = std::make_shared<llvm::Regex>(Result.Pattern);
1307 if (!Result.Regex->isValid(RegexError)) {
1308 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1309 << RegexError << A->getAsString(Args);
1316 for (Arg *A : Args) {
1317 if (A->getOption().matches(OPT_R_Joined)) {
1318 StringRef
Value = A->getValue();
1322 else if (
Value ==
"everything")
1324 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1326 else if (
Value ==
"no-everything")
1333 Result.Pattern =
"";
1334 Result.Regex =
nullptr;
1336 InitializeResultPattern(A,
".*");
1338 }
else if (A->getOption().matches(OptEQ)) {
1340 if (!InitializeResultPattern(A, A->getValue()))
1349 const std::vector<std::string> &Levels,
1353 for (
const auto &Level : Levels) {
1355 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1363 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1371 const std::vector<std::string> &Sanitizers,
1373 for (
const auto &Sanitizer : Sanitizers) {
1376 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1390 const std::vector<std::string> &Sanitizers,
1393 for (
const auto &Sanitizer : Sanitizers) {
1395 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1404 llvm::SplitString(Bundle, BundleParts,
",");
1405 for (
const auto &B : BundleParts) {
1409 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1423 llvm::raw_string_ostream OS(Buffer);
1424 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1430 const llvm::Triple &Triple) {
1431 assert(Triple.getArch() == llvm::Triple::aarch64);
1438 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1439 : Discrimination::None);
1442 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1443 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1444 : Discrimination::None);
1446 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1461 if (
LangOpts.PointerAuthInitFini) {
1463 Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1473 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1492 if (
LangOpts.PointerAuthObjcClassROPointers)
1505 const llvm::Triple &Triple,
1507 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1508 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1509 !LangOpts.AArch64JumpTableHardening)
1515void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1517 const llvm::Triple &
T,
1518 const std::string &OutputFile,
1522 if (Opts.OptimizationLevel == 0)
1525 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1527#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1528 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1529#include "clang/Options/Options.inc"
1530#undef CODEGEN_OPTION_WITH_MARSHALLING
1532 if (Opts.OptimizationLevel > 0) {
1536 GenerateArg(Consumer, OPT_finline_hint_functions);
1541 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1542 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1543 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1544 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1546 std::optional<StringRef> DebugInfoVal;
1547 switch (Opts.DebugInfo) {
1548 case llvm::codegenoptions::DebugLineTablesOnly:
1549 DebugInfoVal =
"line-tables-only";
1551 case llvm::codegenoptions::DebugDirectivesOnly:
1552 DebugInfoVal =
"line-directives-only";
1554 case llvm::codegenoptions::DebugInfoConstructor:
1555 DebugInfoVal =
"constructor";
1557 case llvm::codegenoptions::LimitedDebugInfo:
1558 DebugInfoVal =
"limited";
1560 case llvm::codegenoptions::FullDebugInfo:
1561 DebugInfoVal =
"standalone";
1563 case llvm::codegenoptions::UnusedTypeInfo:
1564 DebugInfoVal =
"unused-types";
1566 case llvm::codegenoptions::NoDebugInfo:
1567 DebugInfoVal = std::nullopt;
1569 case llvm::codegenoptions::LocTrackingOnly:
1570 DebugInfoVal = std::nullopt;
1574 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1578 Prefix.first +
"=" + Prefix.second);
1581 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1582 Prefix.first +
"=" + Prefix.second);
1584 if (Opts.NewStructPathTBAA)
1587 if (Opts.OptimizeSize == 1)
1589 else if (Opts.OptimizeSize == 2)
1597 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1599 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1602 if (Opts.InterchangeLoops)
1608 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1613 if (Opts.DebugNameTable ==
1614 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1616 else if (Opts.DebugNameTable ==
1617 static_cast<unsigned>(
1618 llvm::DICompileUnit::DebugNameTableKind::Default))
1621 if (Opts.DebugTemplateAlias)
1624 auto TNK = Opts.getDebugSimpleTemplateNames();
1625 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1626 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1627 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1628 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1629 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1634 if (Opts.TimePasses) {
1635 if (Opts.TimePassesPerRun)
1636 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1640 if (Opts.TimePassesJson)
1644 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1647 if (Opts.PrepareForThinLTO)
1656 StringRef MemProfileBasename(
"memprof.profraw");
1677 std::string InstrBundle =
1679 if (!InstrBundle.empty())
1680 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1683 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1684 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1685 else if (Opts.CFProtectionReturn)
1686 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1687 else if (Opts.CFProtectionBranch)
1688 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1690 if (Opts.CFProtectionBranch) {
1691 switch (Opts.getCFBranchLabelScheme()) {
1694#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1695 case CFBranchLabelSchemeKind::Kind: \
1696 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1698#include "clang/Basic/CFProtectionOptions.def"
1702 if (Opts.FunctionReturnThunks)
1703 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1706 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1707 F.PropagateAttrs && F.Internalize;
1709 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1713 if (Opts.EmulatedTLS)
1721 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1726 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1730 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1734 if (Opts.EnableAIXExtendedAltivecABI)
1737 if (Opts.XCOFFReadOnlyPointers)
1755 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1760 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1764 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1767 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1769 for (StringRef Sanitizer :
1771 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1773 SmallVector<std::string, 4> Values;
1775 for (std::string Sanitizer : Values)
1776 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1779 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1783 for (StringRef Sanitizer :
1785 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1787 if (!Opts.EmitVersionIdentMetadata)
1790 switch (Opts.FiniteLoops) {
1801 if (Opts.StaticClosure)
1805bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1808 const llvm::Triple &
T,
1809 const std::string &OutputFile,
1820 const LangOptions *
LangOpts = &LangOptsRef;
1822#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1823 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1824#include "clang/Options/Options.inc"
1825#undef CODEGEN_OPTION_WITH_MARSHALLING
1829 if (Opts.OptimizationLevel == 0) {
1831 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1832 options::OPT_finline_hint_functions,
1833 options::OPT_fno_inline_functions,
1834 options::OPT_fno_inline)) {
1837 if (A->getOption().matches(options::OPT_finline_functions))
1839 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1849 Opts.DirectAccessExternalData =
1850 Args.hasArg(OPT_fdirect_access_external_data) ||
1851 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1854 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1856 llvm::StringSwitch<unsigned>(A->getValue())
1857 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1858 .Case(
"line-directives-only",
1859 llvm::codegenoptions::DebugDirectivesOnly)
1860 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1861 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1862 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1863 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1866 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1869 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1875 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1876 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1877 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1878 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1879 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1880 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1881 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1884 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1885 auto Split = StringRef(Arg).split(
'=');
1889 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1890 auto Split = StringRef(Arg).split(
'=');
1894 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1895 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1896 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1897 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el,
1898 llvm::Triple::riscv32, llvm::Triple::riscv64};
1901 llvm::is_contained(DebugEntryValueArchs,
T.getArch()))
1902 Opts.EmitCallSiteInfo =
true;
1905 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1910 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1911 Args.hasArg(OPT_new_struct_path_tbaa);
1913 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1914 if (Opts.SimplifyLibCalls)
1917 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1918 (Opts.OptimizationLevel > 1));
1919 Opts.InterchangeLoops =
1920 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
false);
1921 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1922 OPT_fno_experimental_loop_fusion,
false);
1924 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1926 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1928 Opts.DebugNameTable =
static_cast<unsigned>(
1929 Args.hasArg(OPT_ggnu_pubnames)
1930 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1931 : Args.hasArg(OPT_gpubnames)
1932 ? llvm::DICompileUnit::DebugNameTableKind::Default
1933 : llvm::DICompileUnit::DebugNameTableKind::None);
1934 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1935 StringRef
Value = A->getValue();
1937 Diags.
Report(diag::err_drv_unsupported_option_argument)
1938 << A->getSpelling() << A->getValue();
1939 Opts.setDebugSimpleTemplateNames(
1940 StringRef(A->getValue()) ==
"simple"
1941 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1942 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1945 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1946 OPT_stats_file_timers)) {
1947 Opts.TimePasses =
true;
1950 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1951 StringRef Val =
EQ->getValue();
1952 if (Val ==
"per-pass")
1953 Opts.TimePassesPerRun =
false;
1954 else if (Val ==
"per-pass-run")
1955 Opts.TimePassesPerRun =
true;
1957 Diags.
Report(diag::err_drv_invalid_value)
1958 <<
EQ->getAsString(Args) <<
EQ->getValue();
1961 if (Args.getLastArg(OPT_ftime_report_json))
1962 Opts.TimePassesJson =
true;
1965 Opts.PrepareForLTO =
false;
1966 Opts.PrepareForThinLTO =
false;
1967 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1968 Opts.PrepareForLTO =
true;
1969 StringRef S = A->getValue();
1971 Opts.PrepareForThinLTO =
true;
1972 else if (S !=
"full")
1973 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1974 if (Args.hasArg(OPT_funified_lto))
1975 Opts.PrepareForThinLTO =
true;
1977 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
1979 Diags.
Report(diag::err_drv_argument_only_allowed_with)
1980 << A->getAsString(Args) <<
"-x ir";
1982 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
1984 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
1986 llvm::StringSwitch<std::string>(A->getValue())
1987 .Case(
"obj", OutputFile)
1988 .Default(llvm::sys::path::filename(OutputFile).str());
1991 const char *MemProfileBasename =
"memprof.profraw";
1992 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
1993 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
1994 llvm::sys::path::append(Path, MemProfileBasename);
1996 }
else if (Args.hasArg(OPT_fmemory_profile))
2000 if (Args.hasArg(OPT_coverage_version_EQ)) {
2001 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2002 if (CoverageVersion.size() != 4) {
2003 Diags.
Report(diag::err_drv_invalid_value)
2004 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2014 for (
const auto &A : Args) {
2016 if (A->getOption().getID() == options::OPT_o ||
2017 A->getOption().getID() == options::OPT_INPUT ||
2018 A->getOption().getID() == options::OPT_x ||
2019 A->getOption().getID() == options::OPT_fembed_bitcode ||
2020 A->getOption().matches(options::OPT_W_Group))
2023 A->render(Args, ASL);
2024 for (
const auto &arg : ASL) {
2025 StringRef ArgStr(arg);
2026 llvm::append_range(Opts.
CmdArgs, ArgStr);
2032 auto XRayInstrBundles =
2033 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2034 if (XRayInstrBundles.empty())
2037 for (
const auto &A : XRayInstrBundles)
2041 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2042 StringRef Name = A->getValue();
2043 if (Name ==
"full") {
2044 Opts.CFProtectionReturn = 1;
2045 Opts.CFProtectionBranch = 1;
2046 }
else if (Name ==
"return")
2047 Opts.CFProtectionReturn = 1;
2048 else if (Name ==
"branch")
2049 Opts.CFProtectionBranch = 1;
2050 else if (Name !=
"none")
2051 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2054 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2055 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2057 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2058#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2059 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2060#include "clang/Basic/CFProtectionOptions.def"
2063 Opts.setCFBranchLabelScheme(Scheme);
2065 Diags.
Report(diag::err_drv_invalid_value)
2066 << A->getAsString(Args) << A->getValue();
2070 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2071 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2072 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2073 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2074 .Default(llvm::FunctionReturnThunksKind::Invalid);
2077 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2078 << A->getSpelling() <<
T.getTriple();
2079 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2080 Diags.
Report(diag::err_drv_invalid_value)
2081 << A->getAsString(Args) << A->getValue();
2082 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2083 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2084 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2085 << A->getAsString(Args)
2086 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2088 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2092 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2093 CodeGenOptions::BitcodeFileToLink F;
2095 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2096 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2105 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2106 StringRef Val = A->getValue();
2110 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2113 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2114 StringRef Val = A->getValue();
2117 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2123 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2124 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2128 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2129 << A->getSpelling() <<
T.str();
2131 const Option &O = A->getOption();
2132 if (O.matches(OPT_fpcc_struct_return) ||
2133 O.matches(OPT_maix_struct_return)) {
2136 assert(O.matches(OPT_freg_struct_return) ||
2137 O.matches(OPT_msvr4_struct_return));
2142 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2144 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2145 << A->getSpelling() <<
T.str();
2155 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2156 Diags.
Report(diag::err_roptr_requires_data_sections);
2158 Opts.XCOFFReadOnlyPointers =
true;
2161 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2162 if (!
T.isOSAIX() ||
T.isPPC32())
2163 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2164 << A->getSpelling() <<
T.str();
2167 bool NeedLocTracking =
false;
2170 NeedLocTracking =
true;
2172 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2174 NeedLocTracking =
true;
2177 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2179 NeedLocTracking =
true;
2189 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2199 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2202 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2203 <<
"-fdiagnostics-show-hotness";
2207 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2209 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2212 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2213 <<
"-fdiagnostics-hotness-threshold=";
2219 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2220 <<
"-fdiagnostics-hotness-threshold=";
2225 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2229 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2230 <<
"-fdiagnostics-misexpect-tolerance=";
2236 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2237 <<
"-fdiagnostics-misexpect-tolerance=";
2244 if (UsingSampleProfile)
2245 NeedLocTracking =
true;
2248 NeedLocTracking =
true;
2252 if (NeedLocTracking &&
2253 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2254 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2259 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2262 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2265 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2270 "-fsanitize-skip-hot-cutoff=",
2271 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2274 "-fsanitize-annotate-debug-info=",
2275 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2279 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2282 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2283 Diags.
Report(diag::err_drv_invalid_value)
2284 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2290 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2295 if (Args.hasArg(options::OPT_ffinite_loops))
2297 else if (Args.hasArg(options::OPT_fno_finite_loops))
2300 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2301 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2302 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2303 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2305 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2313#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2314 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2315#include "clang/Options/Options.inc"
2316#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2321 for (
const auto &Dep : Opts.
ExtraDeps) {
2322 switch (Dep.second) {
2335 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2344 bool ShowLineMarkers) {
2348#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2349 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2350#include "clang/Options/Options.inc"
2351#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2353 if (Args.hasArg(OPT_show_includes)) {
2368 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2369 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2370 StringRef Val = A->getValue();
2371 if (!Val.contains(
'='))
2375 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2376 StringRef Val = A->getValue();
2377 if (!Val.contains(
'='))
2384 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2388 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2392 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2393 StringRef Val = A->getValue();
2394 if (!Val.contains(
'='))
2402 if (Args.hasArg(OPT_header_include_format_EQ))
2403 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2407 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2411 if (Args.hasArg(OPT_header_include_filtering_EQ))
2412 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2416 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2432 } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2433 for (
auto *A : Args) {
2434 const Option &O = A->getOption();
2435 if (O.matches(options::OPT_fcolor_diagnostics)) {
2436 ShowColors = Colors_On;
2437 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2438 ShowColors = Colors_Off;
2439 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2440 StringRef
Value(A->getValue());
2441 if (
Value ==
"always")
2442 ShowColors = Colors_On;
2443 else if (
Value ==
"never")
2444 ShowColors = Colors_Off;
2445 else if (
Value ==
"auto")
2446 ShowColors = Colors_Auto;
2449 return ShowColors == Colors_On ||
2450 (ShowColors == Colors_Auto &&
2451 llvm::sys::Process::StandardErrHasColors());
2457 for (
const auto &Prefix : VerifyPrefixes) {
2460 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2463 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2465 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2466 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2476#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2477 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2478#include "clang/Options/Options.inc"
2479#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2488#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2489 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2490#include "clang/Options/Options.inc"
2491#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2499#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2500 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2501#include "clang/Options/Options.inc"
2502#undef MIGRATOR_OPTION_WITH_MARSHALLING
2511#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2512 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2513#include "clang/Options/Options.inc"
2514#undef MIGRATOR_OPTION_WITH_MARSHALLING
2519void CompilerInvocationBase::GenerateDiagnosticArgs(
2521 bool DefaultDiagColor) {
2523#define DIAG_OPTION_WITH_MARSHALLING(...) \
2524 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2525#include "clang/Options/Options.inc"
2526#undef DIAG_OPTION_WITH_MARSHALLING
2529 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2532 if (Opts.ShowColors)
2535 if (Opts.VerifyDiagnostics &&
2540 if (Prefix !=
"expected")
2547 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2550 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2552 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2554 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2556 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2561 if (
Warning ==
"undef-prefix")
2564 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2566 Consumer(StringRef(
"-W") +
Warning);
2572 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2573 "pass-analysis",
"no-pass-analysis",
2574 "pass-missed",
"no-pass-missed"};
2575 if (llvm::is_contained(IgnoredRemarks,
Remark))
2578 Consumer(StringRef(
"-R") +
Remark);
2582 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2587std::unique_ptr<DiagnosticOptions>
2589 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2590 unsigned MissingArgIndex, MissingArgCount;
2592 Argv.slice(1), MissingArgIndex, MissingArgCount);
2594 bool ShowColors =
true;
2595 if (std::optional<std::string> NoColor =
2596 llvm::sys::Process::GetEnv(
"NO_COLOR");
2597 NoColor && !NoColor->empty()) {
2612 bool DefaultDiagColor) {
2613 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2614 std::optional<DiagnosticsEngine> IgnoringDiags;
2616 IgnoringDiagOpts.emplace();
2619 Diags = &*IgnoringDiags;
2628#define DIAG_OPTION_WITH_MARSHALLING(...) \
2629 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2630#include "clang/Options/Options.inc"
2631#undef DIAG_OPTION_WITH_MARSHALLING
2633 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2636 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2640 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2642 if (Args.hasArg(OPT_verify))
2647 Opts.VerifyDiagnostics =
false;
2652 "-verify-ignore-unexpected=",
2653 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2654 if (Args.hasArg(OPT_verify_ignore_unexpected))
2656 Opts.setVerifyIgnoreUnexpected(DiagMask);
2658 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2663 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2674 unsigned DefaultOpt = 0;
2677 !Args.hasArg(OPT_cl_opt_disable))
2680 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2681 if (A->getOption().matches(options::OPT_O0))
2684 if (A->getOption().matches(options::OPT_Ofast))
2687 assert(A->getOption().matches(options::OPT_O));
2689 StringRef S(A->getValue());
2690 if (S ==
"s" || S ==
"z")
2699 unsigned MaxOptLevel = 3;
2700 if (DefaultOpt > MaxOptLevel) {
2703 Diags.
Report(diag::warn_drv_optimization_value)
2704 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2705 DefaultOpt = MaxOptLevel;
2712 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2713 if (A->getOption().matches(options::OPT_O)) {
2714 switch (A->getValue()[0]) {
2732 std::string &BlockName,
2733 unsigned &MajorVersion,
2734 unsigned &MinorVersion,
2736 std::string &UserInfo) {
2738 Arg.split(Args,
':', 5);
2739 if (Args.size() < 5)
2742 BlockName = std::string(Args[0]);
2743 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2744 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2745 if (Args[3].getAsInteger(2, Hashed))
return true;
2746 if (Args.size() > 4)
2747 UserInfo = std::string(Args[4]);
2756 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2787 OPT_emit_reduced_module_interface},
2804 OPT_print_dependency_directives_minimized_source},
2811static std::optional<frontend::ActionKind>
2814 if (ActionOpt.second == Opt.getID())
2815 return ActionOpt.first;
2817 return std::nullopt;
2821static std::optional<OptSpecifier>
2824 if (ActionOpt.first == ProgramAction)
2825 return OptSpecifier(ActionOpt.second);
2827 return std::nullopt;
2833#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2834 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2835#include "clang/Options/Options.inc"
2836#undef FRONTEND_OPTION_WITH_MARSHALLING
2838 std::optional<OptSpecifier> ProgramActionOpt =
2846 if (!ProgramActionOpt) {
2849 "Frontend action without option.");
2850 GenerateProgramAction = [&]() {
2857 GenerateProgramAction = [&]() {
2865 llvm_unreachable(
"Default AST dump format.");
2872 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2885 GenerateProgramAction = [&]() {
2890 GenerateProgramAction();
2892 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2894 for (
const auto &PluginArg : PluginArgs.second)
2896 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2897 Opt.getKind(), 0, PluginArg);
2901 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2902 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2908 for (
const auto &Plugin : Opts.
Plugins)
2914 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2927 StringRef HeaderUnit =
"";
2932 HeaderUnit =
"-user";
2935 HeaderUnit =
"-system";
2938 HeaderUnit =
"-header-unit";
2941 StringRef Header = IsHeader ?
"-header" :
"";
2964 Lang =
"objective-c";
2967 Lang =
"objective-c++";
2970 Lang =
"assembler-with-cpp";
2974 "Generating -x argument for unknown language (not precompiled).");
2989 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
2993 for (
const auto &Input : Opts.
Inputs)
2994 Consumer(Input.getFile());
3003#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3004 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3005#include "clang/Options/Options.inc"
3006#undef FRONTEND_OPTION_WITH_MARSHALLING
3009 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3010 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3012 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3015 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3016 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3019 .Default(std::numeric_limits<unsigned>::max());
3021 if (Val != std::numeric_limits<unsigned>::max())
3024 Diags.
Report(diag::err_drv_invalid_value)
3025 << A->getAsString(Args) << A->getValue();
3035 Args.hasArg(OPT_interface_stub_version_EQ)
3036 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3038 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3039 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3040 ArgStr ==
"experimental-tapi-elf-v1") {
3041 std::string ErrorMessage =
3042 "Invalid interface stub format: " + ArgStr.str() +
3044 Diags.
Report(diag::err_drv_invalid_value)
3045 <<
"Must specify a valid interface stub format type, ie: "
3046 "-interface-stub-version=ifs-v1"
3049 }
else if (!ArgStr.starts_with(
"ifs-")) {
3050 std::string ErrorMessage =
3051 "Invalid interface stub format: " + ArgStr.str() +
".";
3052 Diags.
Report(diag::err_drv_invalid_value)
3053 <<
"Must specify a valid interface stub format type, ie: "
3054 "-interface-stub-version=ifs-v1"
3069 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3070 const Arg *SavedAction =
nullptr;
3071 for (
const Arg *AA :
3072 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3073 if (AA->getOption().matches(OPT_main_file_name)) {
3074 SavedAction =
nullptr;
3075 }
else if (!SavedAction) {
3078 if (!A->getOption().matches(OPT_ast_dump_EQ))
3079 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3080 << SavedAction->getSpelling() << A->getSpelling();
3087 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3088 Opts.
Plugins.emplace_back(A->getValue(0));
3092 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3093 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3095 for (
const std::string &Arg :
3096 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3097 std::string BlockName;
3098 unsigned MajorVersion;
3099 unsigned MinorVersion;
3101 std::string UserInfo;
3103 MinorVersion, Hashed, UserInfo)) {
3104 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3111 std::make_shared<TestModuleFileExtension>(
3112 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3115 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3119 Diags.
Report(diag::err_drv_invalid_value)
3120 << A->getAsString(Args) << A->getValue();
3121 Diags.
Report(diag::note_command_line_code_loc_requirement);
3125 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3126 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3127 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3129 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3130 StringRef Val = A->getValue();
3131 if (!Val.contains(
'='))
3136 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3138 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3142 if (Args.hasArg(OPT_clangir_disable_passes))
3145 if (Args.hasArg(OPT_clangir_disable_verifier))
3149 if (Args.hasArg(OPT_aux_target_cpu))
3150 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3151 if (Args.hasArg(OPT_aux_target_feature))
3155 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3156 StringRef XValue = A->getValue();
3161 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3162 bool ModuleMap = XValue.consume_back(
"-module-map");
3165 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3171 if (IsHeader || Preprocessed) {
3172 if (XValue.consume_back(
"-header-unit"))
3174 else if (XValue.consume_back(
"-system"))
3176 else if (XValue.consume_back(
"-user"))
3182 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3186 DashX = llvm::StringSwitch<InputKind>(XValue)
3202 DashX = llvm::StringSwitch<InputKind>(XValue)
3210 DashX = llvm::StringSwitch<InputKind>(XValue)
3213 .Cases({
"ast",
"pcm",
"precompiled-header"},
3220 Diags.
Report(diag::err_drv_invalid_value)
3221 << A->getAsString(Args) << A->getValue();
3228 IsHeaderFile =
true;
3229 }
else if (IsHeaderFile)
3236 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3239 Inputs.push_back(
"-");
3243 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3245 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3249 StringRef(Inputs[i]).rsplit(
'.').second);
3258 bool IsSystem =
false;
3267 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3278#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3279 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3280#include "clang/Options/Options.inc"
3281#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3290 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3297 std::optional<bool> IsFramework,
3298 std::optional<bool> IgnoreSysRoot) {
3299 return llvm::is_contained(Groups, Entry.
Group) &&
3300 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3301 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3310 OptSpecifier Opt = [It, Matches]() {
3315 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3329 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3336 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3342 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3347 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3355 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3357 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3367 ? OPT_internal_isystem
3368 : OPT_internal_externc_isystem;
3372 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3374 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3378 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3379 : OPT_no_system_header_prefix;
3393#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3394 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3395#include "clang/Options/Options.inc"
3396#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3398 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3399 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3402 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3403 StringRef Val = A->getValue();
3404 if (Val.contains(
'=')) {
3405 auto Split = Val.split(
'=');
3407 std::string(Split.first), std::string(Split.second));
3410 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3413 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3414 StringRef MacroDef = A->getValue();
3416 llvm::CachedHashString(MacroDef.split(
'=').first));
3420 bool IsSysrootSpecified =
3421 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3425 auto PrefixHeaderPath = [IsSysrootSpecified,
3426 &Opts](
const llvm::opt::Arg *A,
3427 bool IsFramework =
false) -> std::string {
3428 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3429 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3431 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3432 llvm::StringRef(A->getValue()).substr(1));
3433 return std::string(Buffer);
3435 return A->getValue();
3438 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3439 bool IsFramework = A->getOption().matches(OPT_F);
3445 StringRef Prefix =
"";
3446 for (
const auto *A :
3447 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3448 if (A->getOption().matches(OPT_iprefix))
3449 Prefix = A->getValue();
3450 else if (A->getOption().matches(OPT_iwithprefix))
3456 for (
const auto *A : Args.filtered(OPT_idirafter))
3458 for (
const auto *A : Args.filtered(OPT_iquote))
3461 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3462 if (A->getOption().matches(OPT_iwithsysroot)) {
3469 for (
const auto *A : Args.filtered(OPT_iframework))
3471 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3476 for (
const auto *A : Args.filtered(OPT_c_isystem))
3478 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3480 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3482 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3486 for (
const auto *A :
3487 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3489 if (A->getOption().matches(OPT_internal_externc_isystem))
3491 Opts.
AddPath(A->getValue(), Group,
false,
true);
3493 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3497 for (
const auto *A :
3498 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3500 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3502 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3511 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3515 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3520 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3522 diags.
Report(diag::err_drv_invalid_value)
3523 << A->getAsString(Args) << A->getValue();
3525 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3531 if (Opts.PointerAuthIntrinsics)
3533 if (Opts.PointerAuthCalls)
3535 if (Opts.PointerAuthReturns)
3537 if (Opts.PointerAuthIndirectGotos)
3538 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3539 if (Opts.PointerAuthAuthTraps)
3541 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3542 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3543 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3544 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3545 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3546 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3547 if (Opts.PointerAuthFunctionTypeDiscrimination)
3548 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3549 if (Opts.PointerAuthInitFini)
3551 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3552 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3553 if (Opts.PointerAuthELFGOT)
3555 if (Opts.AArch64JumpTableHardening)
3556 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3557 if (Opts.PointerAuthObjcIsa)
3559 if (Opts.PointerAuthObjcInterfaceSel)
3560 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3561 if (Opts.PointerAuthObjcClassROPointers)
3562 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3563 if (Opts.PointerAuthBlockDescriptorPointers)
3564 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3569 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3570 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3571 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3572 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3573 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3574 Opts.PointerAuthVTPtrAddressDiscrimination =
3575 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3576 Opts.PointerAuthVTPtrTypeDiscrimination =
3577 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3578 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3579 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3580 Opts.PointerAuthFunctionTypeDiscrimination =
3581 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3582 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3583 Opts.PointerAuthInitFiniAddressDiscrimination =
3584 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3585 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3586 Opts.AArch64JumpTableHardening =
3587 Args.hasArg(OPT_faarch64_jump_table_hardening);
3588 Opts.PointerAuthBlockDescriptorPointers =
3589 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3590 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3591 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3592 Opts.PointerAuthObjcInterfaceSel =
3593 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3595 if (Opts.PointerAuthObjcInterfaceSel)
3596 Opts.PointerAuthObjcInterfaceSelKey =
3607 llvm_unreachable(
"should not parse language flags for this input");
3642 llvm_unreachable(
"unexpected input language");
3651 return "Objective-C";
3655 return "Objective-C++";
3659 return "C++ for OpenCL";
3678 llvm_unreachable(
"unknown input language");
3681void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3683 const llvm::Triple &
T,
3688 if (Opts.ObjCAutoRefCount)
3690 if (Opts.PICLevel != 0)
3691 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3695 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3700 OptSpecifier StdOpt;
3702 case LangStandard::lang_opencl10:
3703 case LangStandard::lang_opencl11:
3704 case LangStandard::lang_opencl12:
3705 case LangStandard::lang_opencl20:
3706 case LangStandard::lang_opencl30:
3707 case LangStandard::lang_openclcpp10:
3708 case LangStandard::lang_openclcpp2021:
3709 StdOpt = OPT_cl_std_EQ;
3712 StdOpt = OPT_std_EQ;
3717 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3719 if (Opts.IncludeDefaultHeader)
3720 GenerateArg(Consumer, OPT_finclude_default_header);
3721 if (Opts.DeclareOpenCLBuiltins)
3722 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3724 const LangOptions *
LangOpts = &Opts;
3726#define LANG_OPTION_WITH_MARSHALLING(...) \
3727 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3728#include "clang/Options/Options.inc"
3729#undef LANG_OPTION_WITH_MARSHALLING
3740 else if (Opts.ObjCAutoRefCount == 1)
3743 if (Opts.ObjCWeakRuntime)
3744 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3749 if (Opts.ObjCSubscriptingLegacyRuntime)
3750 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3753 if (Opts.GNUCVersion != 0) {
3754 unsigned Major = Opts.GNUCVersion / 100 / 100;
3755 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3756 unsigned Patch = Opts.GNUCVersion % 100;
3758 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3761 if (Opts.IgnoreXCOFFVisibility)
3762 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3770 if (Opts.PointerOverflowDefined)
3773 if (Opts.MSCompatibilityVersion != 0) {
3774 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3775 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3776 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3777 GenerateArg(Consumer, OPT_fms_compatibility_version,
3778 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3781 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3783 if (!Opts.Trigraphs)
3790 if (
T.isOSzOS() && !Opts.ZOSExt)
3792 else if (Opts.ZOSExt)
3795 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3798 if (Opts.ConvergentFunctions)
3801 GenerateArg(Consumer, OPT_fno_convergent_functions);
3803 if (Opts.NoBuiltin && !Opts.Freestanding)
3806 if (!Opts.NoBuiltin)
3810 if (Opts.LongDoubleSize == 128)
3812 else if (Opts.LongDoubleSize == 64)
3814 else if (Opts.LongDoubleSize == 80)
3821 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3824 if (Opts.OpenMP != 51)
3825 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3827 if (!Opts.OpenMPUseTLS)
3830 if (Opts.OpenMPIsTargetDevice)
3831 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3833 if (Opts.OpenMPIRBuilder)
3834 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3837 if (Opts.OpenMPSimd) {
3840 if (Opts.OpenMP != 51)
3841 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3844 if (Opts.OpenMPThreadSubscription)
3845 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3847 if (Opts.OpenMPTeamSubscription)
3848 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3850 if (Opts.OpenMPTargetDebug != 0)
3851 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3852 Twine(Opts.OpenMPTargetDebug));
3854 if (Opts.OpenMPCUDANumSMs != 0)
3855 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3856 Twine(Opts.OpenMPCUDANumSMs));
3858 if (Opts.OpenMPCUDABlocksPerSM != 0)
3859 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3860 Twine(Opts.OpenMPCUDABlocksPerSM));
3862 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3863 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3864 Twine(Opts.OpenMPCUDAReductionBufNum));
3867 std::string Targets;
3868 llvm::raw_string_ostream
OS(Targets);
3871 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3872 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3875 if (Opts.OpenMPCUDAMode)
3891 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3894 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3898 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3900 switch (Opts.getClangABICompat()) {
3901#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3902 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3903 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3905#define ABI_VER_MAJOR(Major) \
3906 case LangOptions::ClangABI::Ver##Major: \
3907 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3909#define ABI_VER_LATEST(Latest) \
3910 case LangOptions::ClangABI::Latest: \
3912#include "clang/Basic/ABIVersions.def"
3915 if (Opts.getSignReturnAddressScope() ==
3917 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3918 else if (Opts.getSignReturnAddressScope() ==
3920 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3922 if (Opts.getSignReturnAddressKey() ==
3924 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3930 if (Opts.RelativeCXXABIVTables)
3931 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3933 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3941 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3951 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
3952 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
3955 if (Opts.MatrixTypes) {
3956 if (Opts.getDefaultMatrixMemoryLayout() ==
3958 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
3959 if (Opts.getDefaultMatrixMemoryLayout() ==
3961 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
3965bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3967 std::vector<std::string> &Includes,
3977 if (Args.hasArg(OPT_fobjc_arc))
3978 Opts.ObjCAutoRefCount = 1;
3982 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
3994 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
3997 Diags.
Report(diag::err_drv_invalid_value)
3998 << A->getAsString(Args) << A->getValue();
4000 for (
unsigned KindValue = 0;
4006 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4008 unsigned NumAliases = 0;
4009#define LANGSTANDARD(id, name, lang, desc, features, version)
4010#define LANGSTANDARD_ALIAS(id, alias) \
4011 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4012#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4013#include "clang/Basic/LangStandards.def"
4015#define LANGSTANDARD(id, name, lang, desc, features, version)
4016#define LANGSTANDARD_ALIAS(id, alias) \
4017 if (KindValue == LangStandard::lang_##id) Diag << alias;
4018#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4019#include "clang/Basic/LangStandards.def"
4027 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4035 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4037 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4038 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4039 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4040 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4041 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4042 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4043 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4044 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4045 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4046 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4050 Diags.
Report(diag::err_drv_invalid_value)
4051 << A->getAsString(Args) << A->getValue();
4054 LangStd = OpenCLLangStd;
4058 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4059 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4067#define LANG_OPTION_WITH_MARSHALLING(...) \
4068 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4069#include "clang/Options/Options.inc"
4070#undef LANG_OPTION_WITH_MARSHALLING
4072 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4073 StringRef Name = A->getValue();
4074 if (Name ==
"full") {
4075 Opts.CFProtectionBranch = 1;
4076 Opts.CFProtectionReturn = 1;
4077 }
else if (Name ==
"branch") {
4078 Opts.CFProtectionBranch = 1;
4079 }
else if (Name ==
"return") {
4080 Opts.CFProtectionReturn = 1;
4084 if (Opts.CFProtectionBranch) {
4085 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4087 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4088#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4089 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4090#include "clang/Basic/CFProtectionOptions.def"
4092 Opts.setCFBranchLabelScheme(Scheme);
4096 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4097 !Args.hasArg(OPT_sycl_std_EQ)) {
4107 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4108 StringRef value =
arg->getValue();
4110 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4113 if (Args.hasArg(OPT_fobjc_gc_only))
4115 else if (Args.hasArg(OPT_fobjc_gc))
4117 else if (Args.hasArg(OPT_fobjc_arc)) {
4118 Opts.ObjCAutoRefCount = 1;
4120 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4127 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4128 Opts.ObjCWeakRuntime = 1;
4134 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4135 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4136 assert(!Opts.ObjCWeak);
4138 Diags.
Report(diag::err_objc_weak_with_gc);
4139 }
else if (!Opts.ObjCWeakRuntime) {
4140 Diags.
Report(diag::err_objc_weak_unsupported);
4144 }
else if (Opts.ObjCAutoRefCount) {
4145 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4148 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4149 Opts.ObjCSubscriptingLegacyRuntime =
4153 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4156 VersionTuple GNUCVer;
4157 bool Invalid = GNUCVer.tryParse(A->getValue());
4158 unsigned Major = GNUCVer.getMajor();
4159 unsigned Minor = GNUCVer.getMinor().value_or(0);
4160 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4161 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4162 Diags.
Report(diag::err_drv_invalid_value)
4163 << A->getAsString(Args) << A->getValue();
4165 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4168 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4169 Opts.IgnoreXCOFFVisibility = 1;
4171 if (Args.hasArg(OPT_ftrapv)) {
4175 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4177 else if (Args.hasArg(OPT_fwrapv))
4179 if (Args.hasArg(OPT_fwrapv_pointer))
4180 Opts.PointerOverflowDefined =
true;
4182 Opts.MSCompatibilityVersion = 0;
4183 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4185 if (VT.tryParse(A->getValue()))
4186 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4188 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4189 VT.getMinor().value_or(0) * 100000 +
4190 VT.getSubminor().value_or(0);
4198 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4201 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4204 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4206 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4207 && Opts.OpenCLVersion == 200);
4209 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4210 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4211 Opts.ConvergentFunctions =
4212 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4213 HasConvergentOperations);
4215 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4216 if (!Opts.NoBuiltin)
4218 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4219 if (A->getOption().matches(options::OPT_mlong_double_64))
4220 Opts.LongDoubleSize = 64;
4221 else if (A->getOption().matches(options::OPT_mlong_double_80))
4222 Opts.LongDoubleSize = 80;
4223 else if (A->getOption().matches(options::OPT_mlong_double_128))
4224 Opts.LongDoubleSize = 128;
4226 Opts.LongDoubleSize = 0;
4228 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4234 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4236 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4237 << A->getSpelling() <<
"-fdefault-calling-conv";
4239 switch (
T.getArch()) {
4240 case llvm::Triple::x86:
4243 case llvm::Triple::m68k:
4247 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4248 << A->getSpelling() <<
T.getTriple();
4254 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4256 bool IsSimdSpecified =
4257 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4259 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4261 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4262 Opts.OpenMPIsTargetDevice =
4263 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4264 Opts.OpenMPIRBuilder =
4265 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4266 bool IsTargetSpecified =
4267 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4269 if (Opts.OpenMP || Opts.OpenMPSimd) {
4271 Args, OPT_fopenmp_version_EQ,
4272 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4273 Opts.OpenMP = Version;
4276 if (!Opts.OpenMPIsTargetDevice) {
4277 switch (
T.getArch()) {
4281 case llvm::Triple::nvptx:
4282 case llvm::Triple::nvptx64:
4283 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4291 if ((Opts.OpenMPIsTargetDevice &&
T.isGPU()) || Opts.OpenCLCPlusPlus) {
4293 Opts.Exceptions = 0;
4294 Opts.CXXExceptions = 0;
4296 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4297 Opts.OpenMPCUDANumSMs =
4299 Opts.OpenMPCUDANumSMs, Diags);
4300 Opts.OpenMPCUDABlocksPerSM =
4302 Opts.OpenMPCUDABlocksPerSM, Diags);
4304 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4305 Opts.OpenMPCUDAReductionBufNum, Diags);
4310 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4311 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4313 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4314 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4315 Opts.OpenMPTargetDebug = 1;
4318 if (Opts.OpenMPIsTargetDevice) {
4319 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4320 Opts.OpenMPTeamSubscription =
true;
4321 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4322 Opts.OpenMPThreadSubscription =
true;
4326 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4327 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4328 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4329 if (
T.isArch16Bit())
4331 if (
T.isArch32Bit())
4333 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4337 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4338 llvm::Triple TT(A->getValue(i));
4340 if (TT.getArch() == llvm::Triple::UnknownArch ||
4341 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4342 TT.getArch() == llvm::Triple::spirv64 ||
4343 TT.getArch() == llvm::Triple::systemz ||
4344 TT.getArch() == llvm::Triple::loongarch64 ||
4345 TT.getArch() == llvm::Triple::nvptx ||
4346 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4347 TT.getArch() == llvm::Triple::x86 ||
4348 TT.getArch() == llvm::Triple::x86_64))
4349 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4350 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4351 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4352 << A->getValue(i) <<
T.str();
4359 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4360 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4361 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4364 if (Args.hasArg(options::OPT_fopenacc))
4365 Opts.OpenACC =
true;
4367 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4368 StringRef Val = A->getValue();
4371 else if (Val ==
"on")
4373 else if (Val ==
"off")
4375 else if (Val ==
"fast-honor-pragmas")
4378 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4382 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4383 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4385 llvm::StringSwitch<unsigned>(A->getValue(i))
4388 .Case(
"add-unsigned-overflow-test",
4390 .Case(
"add-signed-overflow-test",
4393 .Case(
"unsigned-post-decr-while",
4402 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4403 std::vector<std::string> systemIgnorelists =
4404 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4406 systemIgnorelists.begin(),
4407 systemIgnorelists.end());
4409 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4410 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4412 StringRef Ver = A->getValue();
4413 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4414 int Major, Minor = 0;
4418 if (!VerParts.first.starts_with(
"0") &&
4419 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4420 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4422 ? VerParts.second.size() == 1 &&
4423 !VerParts.second.getAsInteger(10, Minor)
4424 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4426#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4427 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4428 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4430#define ABI_VER_MAJOR(Major_) \
4431 if (Major <= Major_) \
4432 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4434#define ABI_VER_LATEST(Latest) \
4437#include "clang/Basic/ABIVersions.def"
4438 }
else if (Ver !=
"latest") {
4439 Diags.
Report(diag::err_drv_invalid_value)
4440 << A->getAsString(Args) << A->getValue();
4444 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4445 StringRef SignScope = A->getValue();
4447 if (SignScope.equals_insensitive(
"none"))
4448 Opts.setSignReturnAddressScope(
4450 else if (SignScope.equals_insensitive(
"all"))
4451 Opts.setSignReturnAddressScope(
4453 else if (SignScope.equals_insensitive(
"non-leaf"))
4454 Opts.setSignReturnAddressScope(
4457 Diags.
Report(diag::err_drv_invalid_value)
4458 << A->getAsString(Args) << SignScope;
4460 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4461 StringRef SignKey = A->getValue();
4462 if (!SignScope.empty() && !SignKey.empty()) {
4463 if (SignKey ==
"a_key")
4464 Opts.setSignReturnAddressKey(
4466 else if (SignKey ==
"b_key")
4467 Opts.setSignReturnAddressKey(
4470 Diags.
Report(diag::err_drv_invalid_value)
4471 << A->getAsString(Args) << SignKey;
4477 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4484 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4490 Opts.RelativeCXXABIVTables =
4491 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4492 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4496 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4497 Opts.OmitVTableRTTI =
4498 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4499 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4500 if (Opts.OmitVTableRTTI && HasRTTI)
4501 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4503 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4504 auto Split = StringRef(A).split(
'=');
4506 {std::string(
Split.first), std::string(
Split.second)});
4510 !Args.getLastArg(OPT_fno_file_reproducible) &&
4511 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4512 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4513 Args.getLastArg(OPT_ffile_reproducible));
4516 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4518 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4519 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4521 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4523 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4524 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4527 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4528 std::ifstream SeedFile(A->getValue(0));
4530 if (!SeedFile.is_open())
4531 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4537 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4540 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4541 StringRef S = Arg->getValue();
4543 if (S.getAsInteger(0,
Value))
4544 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4549 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4550 StringRef S = Arg->getValue();
4551 if (
auto Mode = getAllocTokenModeFromString(S))
4554 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4558 if (Opts.MatrixTypes) {
4559 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4560 StringRef ClangValue = A->getValue();
4561 if (ClangValue ==
"row-major")
4562 Opts.setDefaultMatrixMemoryLayout(
4565 Opts.setDefaultMatrixMemoryLayout(
4568 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4569 StringRef OptValue = A->getValue();
4570 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4571 ClangValue != OptValue)
4572 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4573 << ClangValue << OptValue;
4582 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4584 enum {
OS, Environment };
4586 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4588 if (
T.getOSName().empty()) {
4589 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4590 << ExpectedOS <<
OS <<
T.str();
4591 }
else if (
T.getEnvironmentName().empty()) {
4592 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4594 }
else if (!
T.isShaderStageEnvironment()) {
4595 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4600 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4601 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4602 << ShaderModel <<
T.getOSName() <<
T.str();
4607 if (Args.getLastArg(OPT_fnative_half_type) ||
4608 Args.getLastArg(OPT_fnative_int16_type)) {
4609 const LangStandard &Std =
4611 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4612 T.getOSVersion() >= VersionTuple(6, 2)))
4613 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4614 <<
"-enable-16bit-types" <<
true << Std.
getName()
4615 <<
T.getOSVersion().getAsString();
4617 }
else if (
T.isSPIRVLogical()) {
4618 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4619 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4620 << VulkanEnv <<
T.getOSName() <<
T.str();
4622 if (Args.getLastArg(OPT_fnative_half_type) ||
4623 Args.getLastArg(OPT_fnative_int16_type)) {
4624 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4625 ?
"-fnative-half-type"
4626 :
"-fnative-int16-type";
4627 const LangStandard &Std =
4629 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4630 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4631 << Str <<
false << Std.
getName();
4634 llvm_unreachable(
"expected DXIL or SPIR-V target");
4637 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4639 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4640 const LangStandard &Requested =
4642 const LangStandard &Recommended =
4644 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4695 llvm_unreachable(
"invalid frontend action");
4740 llvm_unreachable(
"invalid frontend action");
4750#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4751 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4752#include "clang/Options/Options.inc"
4753#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4756 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4759 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4766 for (
const auto &M : Opts.
Macros) {
4769 if (M.first ==
"__CET__=1" && !M.second &&
4770 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4772 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4773 !CodeGenOpts.CFProtectionBranch)
4775 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4776 CodeGenOpts.CFProtectionBranch)
4779 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4782 for (
const auto &I : Opts.
Includes) {
4785 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4786 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4791 if (LangOpts.HLSL && I ==
"hlsl.h")
4801 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4807 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4810 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4824#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4825 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4826#include "clang/Options/Options.inc"
4827#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4829 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4830 Args.hasArg(OPT_pch_through_hdrstop_use);
4832 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4835 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4836 StringRef
Value(A->getValue());
4837 size_t Comma =
Value.find(
',');
4839 unsigned EndOfLine = 0;
4841 if (Comma == StringRef::npos ||
4842 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4843 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4844 Diags.
Report(diag::err_drv_preamble_format);
4852 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4853 if (A->getOption().matches(OPT_D))
4860 for (
const auto *A : Args.filtered(OPT_include))
4861 Opts.
Includes.emplace_back(A->getValue());
4863 for (
const auto *A : Args.filtered(OPT_chain_include))
4866 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4867 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4869 if (Split.second.empty()) {
4870 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4877 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4878 StringRef Epoch = A->getValue();
4882 const uint64_t MaxTimestamp =
4883 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4885 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4886 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4887 << Epoch << MaxTimestamp;
4893 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4894 StringRef Val = A->getValue();
4905 Args.hasFlag(OPT_fdefine_target_os_macros,
4917#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4918 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4919#include "clang/Options/Options.inc"
4920#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4938#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4939 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4940#include "clang/Options/Options.inc"
4941#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4944 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4953#define TARGET_OPTION_WITH_MARSHALLING(...) \
4954 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4955#include "clang/Options/Options.inc"
4956#undef TARGET_OPTION_WITH_MARSHALLING
4962 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
4972#define TARGET_OPTION_WITH_MARSHALLING(...) \
4973 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4974#include "clang/Options/Options.inc"
4975#undef TARGET_OPTION_WITH_MARSHALLING
4977 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
4978 llvm::VersionTuple Version;
4979 if (Version.tryParse(A->getValue()))
4980 Diags.
Report(diag::err_drv_invalid_value)
4981 << A->getAsString(Args) << A->getValue();
4986 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
4987 llvm::VersionTuple Version;
4988 if (Version.tryParse(A->getValue()))
4989 Diags.
Report(diag::err_drv_invalid_value)
4990 << A->getAsString(Args) << A->getValue();
4998bool CompilerInvocation::CreateFromArgsImpl(
5006 unsigned MissingArgIndex, MissingArgCount;
5007 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5008 MissingArgCount, VisibilityMask);
5012 if (MissingArgCount)
5013 Diags.
Report(diag::err_drv_missing_argument)
5014 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5017 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5018 auto ArgString = A->getAsString(Args);
5019 std::string Nearest;
5020 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5021 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5023 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5024 << ArgString << Nearest;
5057 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5071 Diags.
Report(diag::warn_drv_openacc_without_cir);
5084 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5085 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5086 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5087 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5100 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5106 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5117 llvm::driver::ProfileInstrKind::ProfileNone)
5118 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5128 const char *Argv0) {
5134 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5138 Args.push_back(
"-cc1");
5141 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5146 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5161#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5162 if constexpr (CK::Compatibility != CK::Benign) \
5163 HBuilder.add(LangOpts->Name);
5164#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5165 if constexpr (CK::Compatibility != CK::Benign) \
5166 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5167#include "clang/Basic/LangOptions.def"
5172 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5189 StringRef MacroDef =
Macro.first;
5191 llvm::CachedHashString(MacroDef.split(
'=').first)))
5195 HBuilder.add(
Macro);
5211#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5212#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5213 HBuilder.add(diagOpts.get##Name());
5214#include "clang/Basic/DiagnosticOptions.def"
5224 ext->hashExtension(HBuilder);
5231 HBuilder.add(*Minor);
5232 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5233 HBuilder.add(*Subminor);
5235 HBuilder.add(*Build);
5241#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5242 if constexpr (CK::Compatibility != CK::Benign) \
5243 HBuilder.add(CodeGenOpts->Name);
5244#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5245 if constexpr (CK::Compatibility != CK::Benign) \
5246 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5247#define DEBUGOPT(Name, Bits, Default, Compatibility)
5248#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5249#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5250#include "clang/Basic/CodeGenOptions.def"
5262#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5263 if constexpr (CK::Compatibility != CK::Benign) \
5264 HBuilder.add(CodeGenOpts->Name);
5265#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5266 if constexpr (CK::Compatibility != CK::Benign) \
5267 HBuilder.add(CodeGenOpts->Name);
5268#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5269 if constexpr (CK::Compatibility != CK::Benign) \
5270 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5271#include "clang/Basic/DebugOptions.def"
5278 if (!SanHash.
empty())
5279 HBuilder.add(SanHash.
Mask);
5281 llvm::MD5::MD5Result
Result;
5282 HBuilder.getHasher().final(
Result);
5284 return toString(llvm::APInt(64, Hash), 36,
false);
5288 llvm::function_ref<
bool(std::string &)> Predicate) {
5289#define RETURN_IF(PATH) \
5291 if (Predicate(PATH)) \
5295#define RETURN_IF_MANY(PATHS) \
5297 if (llvm::any_of(PATHS, Predicate)) \
5301 auto &HeaderSearchOpts = *this->
HSOpts;
5304 for (
auto &Entry : HeaderSearchOpts.UserEntries)
5305 if (Entry.IgnoreSysRoot)
5307 RETURN_IF(HeaderSearchOpts.ResourceDir);
5308 RETURN_IF(HeaderSearchOpts.ModuleCachePath);
5309 RETURN_IF(HeaderSearchOpts.ModuleUserBuildPath);
5310 for (
auto &[Name,
File] : HeaderSearchOpts.PrebuiltModuleFiles)
5324 if (Input.isBuffer())
5339 auto &FileSystemOpts = *this->
FSOpts;
5361 llvm::function_ref<
bool(StringRef)> Callback)
const {
5365 [&Callback](std::string &Path) {
return Callback(StringRef(Path)); });
5393 std::vector<std::string> Args{
"-cc1"};
5395 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5421 llvm::vfs::getRealFileSystem());
5429 Diags, std::move(BaseFS));
5435 if (VFSOverlayFiles.empty())
5440 for (
const auto &
File : VFSOverlayFiles) {
5441 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5444 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5449 std::move(Buffer.get()),
nullptr,
File,
5452 Diags.
Report(diag::err_invalid_vfs_overlay) <<
File;
Defines the Diagnostic-related interfaces.
Defines enum values for all the target-independent builtin functions.
static void getAllNoBuiltinFuncValues(ArgList &Args, std::vector< std::string > &Funcs)
static T extractMaskValue(T KeyPath)
static std::optional< IntTy > normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &Diags)
static T mergeMaskValue(T KeyPath, U Value)
static std::optional< std::string > normalizeString(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, OptSpecifier OtherOpt)
static void parsePointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple, DiagnosticsEngine &Diags)
static void denormalizeString(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, T Value)
static SmallVector< StringRef, 4 > serializeSanitizerKinds(SanitizerSet S)
static void parseXRayInstrumentationBundle(StringRef FlagName, StringRef Bundle, ArgList &Args, DiagnosticsEngine &D, XRayInstrSet &S)
static void GenerateFrontendArgs(const FrontendOptions &Opts, ArgumentConsumer Consumer, bool IsHeader)
static std::optional< SimpleEnumValue > findValueTableByValue(const SimpleEnumValueTable &Table, unsigned Value)
static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static auto makeFlagToValueNormalizer(T Value)
static CodeGenOptions::OptRemark ParseOptimizationRemark(DiagnosticsEngine &Diags, ArgList &Args, OptSpecifier OptEQ, StringRef Name)
Parse a remark command line argument.
static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static constexpr bool is_uint64_t_convertible()
static void GeneratePointerAuthArgs(const LangOptions &Opts, ArgumentConsumer Consumer)
static std::optional< SimpleEnumValue > findValueTableByName(const SimpleEnumValueTable &Table, StringRef Name)
static std::optional< OptSpecifier > getProgramActionOpt(frontend::ActionKind ProgramAction)
Maps frontend action to command line option.
static bool parseDiagnosticLevelMask(StringRef FlagName, const std::vector< std::string > &Levels, DiagnosticsEngine &Diags, DiagnosticLevelMask &M)
static std::optional< bool > normalizeSimpleFlag(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
CompilerInvocation::ArgumentConsumer ArgumentConsumer
static void denormalizeSimpleEnumImpl(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, unsigned Value)
static void GenerateArg(ArgumentConsumer Consumer, llvm::opt::OptSpecifier OptSpecifier)
static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, OptSpecifier GroupWithValue, std::vector< std::string > &Diagnostics)
static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts, DiagnosticsEngine *Diags)
static void denormalizeSimpleFlag(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass, unsigned,...)
The tblgen-erated code passes in a fifth parameter of an arbitrary type, but denormalizeSimpleFlags n...
static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action, const FrontendOptions &FrontendOpts)
static std::optional< unsigned > normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
static StringRef GetInputKindName(InputKind IK)
Get language name for given input kind.
static void initOption(AnalyzerOptions::ConfigTable &Config, DiagnosticsEngine *Diags, StringRef &OptionField, StringRef Name, StringRef DefaultVal)
static std::optional< std::string > normalizeTriple(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
T & ensureOwned(std::shared_ptr< T > &Storage)
static void GenerateMigratorArgs(const MigratorOptions &Opts, ArgumentConsumer Consumer)
static const auto & getFrontendActionTable()
Return a table that associates command line option specifiers with the frontend action.
static void GenerateTargetArgs(const TargetOptions &Opts, ArgumentConsumer Consumer)
static std::optional< frontend::ActionKind > getFrontendAction(OptSpecifier &Opt)
Maps command line option to frontend action.
static bool checkVerifyPrefixes(const std::vector< std::string > &VerifyPrefixes, DiagnosticsEngine &Diags)
static SanitizerMaskCutoffs parseSanitizerWeightedKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags)
static void GenerateAPINotesArgs(const APINotesOptions &Opts, ArgumentConsumer Consumer)
static bool isCodeGenAction(frontend::ActionKind Action)
static std::optional< bool > normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, const ArgList &Args, DiagnosticsEngine &)
static void GenerateFileSystemArgs(const FileSystemOptions &Opts, ArgumentConsumer Consumer)
static bool IsInputCompatibleWithStandard(InputKind IK, const LangStandard &S)
Check if input file kind and language standard are compatible.
static void denormalizeStringImpl(ArgumentConsumer Consumer, const Twine &Spelling, Option::OptionClass OptClass, unsigned, const Twine &Value)
static llvm::StringRef lookupStrInTable(unsigned Offset)
static void GeneratePreprocessorArgs(const PreprocessorOptions &Opts, ArgumentConsumer Consumer, const LangOptions &LangOpts, const FrontendOptions &FrontendOpts, const CodeGenOptions &CodeGenOpts)
static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, bool &IsHeaderFile)
static auto makeBooleanOptionDenormalizer(bool Value)
static void GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, ArgumentConsumer Consumer, frontend::ActionKind Action)
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action)
#define RETURN_IF_MANY(PATHS)
static std::string serializeXRayInstrumentationBundle(const XRayInstrSet &S)
static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor)
static T mergeForwardValue(T KeyPath, U Value)
static void ParseAPINotesArgs(APINotesOptions &Opts, ArgList &Args, DiagnosticsEngine &diags)
static void denormalizeStringVector(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, const std::vector< std::string > &Values)
static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action, bool ShowLineMarkers)
static Expected< std::optional< uint32_t > > parseToleranceOption(StringRef Arg)
static std::optional< std::vector< std::string > > normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &)
static void GenerateAnalyzerArgs(const AnalyzerOptions &Opts, ArgumentConsumer Consumer)
static void GenerateOptimizationRemark(ArgumentConsumer Consumer, OptSpecifier OptEQ, StringRef Name, const CodeGenOptions::OptRemark &Remark)
Generate a remark argument. This is an inverse of ParseOptimizationRemark.
static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action)
llvm::function_ref< void( CompilerInvocation &, SmallVectorImpl< const char * > &, CompilerInvocation::StringAllocator)> GenerateFn
static bool RoundTrip(ParseFn Parse, GenerateFn Generate, CompilerInvocation &RealInvocation, CompilerInvocation &DummyInvocation, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0, bool CheckAgainstOriginalInvocation=false, bool ForceRoundTrip=false)
May perform round-trip of command line arguments.
static T extractForwardValue(T KeyPath)
static void denormalizeSimpleEnum(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, T Value)
std::shared_ptr< T > make_shared_copy(const T &X)
llvm::function_ref< bool(CompilerInvocation &, ArrayRef< const char * >, DiagnosticsEngine &, const char *)> ParseFn
static bool parseTestModuleFileExtensionArg(StringRef Arg, std::string &BlockName, unsigned &MajorVersion, unsigned &MinorVersion, bool &Hashed, std::string &UserInfo)
Parse the argument to the -ftest-module-file-extension command-line argument.
static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, ArgumentConsumer Consumer)
static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config, StringRef OptionName, StringRef DefaultVal)
static bool FixupInvocation(CompilerInvocation &Invocation, DiagnosticsEngine &Diags, const ArgList &Args, InputKind IK)
static void parseSanitizerKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags, SanitizerSet &S)
static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts, ArgumentConsumer Consumer)
Defines the clang::FileSystemOptions interface.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines types useful for describing an Objective-C runtime.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SanitizerKind enum.
Defines the clang::SourceLocation class and associated facilities.
#define CXXABI(Name, Str)
Defines the clang::TargetOptions class.
Defines version macros and version-related utility functions for Clang.
Defines the clang::XRayInstrKind enum.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Tracks various options which control how API notes are found and handled.
llvm::VersionTuple SwiftVersion
The Swift version which should be used for API notes.
std::vector< std::string > ModuleSearchPaths
The set of search paths where we API notes can be found for particular modules.
Stores options for the analyzer from the command line.
static std::vector< StringRef > getRegisteredPackages(bool IncludeExperimental=false)
Retrieves the list of packages generated from Checkers.td.
std::vector< std::pair< std::string, bool > > CheckersAndPackages
Pairs of checker/package name and enable/disable.
std::vector< std::string > SilencedCheckersAndPackages
Vector of checker/package names which will not emit warnings.
AnalysisDiagClients AnalysisDiagOpt
AnalysisConstraints AnalysisConstraintsOpt
ConfigTable Config
A key-value table of use-specified configuration values.
unsigned ShouldEmitErrorsOnInvalidConfigValue
AnalysisPurgeMode AnalysisPurgeOpt
bool isUnknownAnalyzerConfig(llvm::StringRef Name)
static std::vector< StringRef > getRegisteredCheckers(bool IncludeExperimental=false)
Retrieves the list of checkers generated from Checkers.td.
llvm::StringMap< std::string > ConfigTable
std::string FullCompilerInvocation
Store full compiler invocation for reproducible instructions in the generated report.
AnalysisInliningMode InliningMode
The mode of function selection used during inlining.
static bool isBuiltinFunc(llvm::StringRef Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::SmallVector< std::pair< std::string, std::string >, 0 > CoveragePrefixMap
Prefix replacement map for source-based code coverage to remap source file paths in coverage mapping.
SanitizerSet SanitizeMergeHandlers
Set of sanitizer checks that can merge handlers (smaller code size at the expense of debuggability).
llvm::SmallVector< std::pair< std::string, std::string >, 0 > DebugPrefixMap
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
std::string BinutilsVersion
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
std::optional< uint64_t > DiagnosticsHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
char CoverageVersion[4]
The version string to put into coverage files.
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
uint64_t LargeDataThreshold
The code model-specific large data threshold to use (-mlarge-data-threshold).
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::string CodeModel
The code model to use (-mcmodel).
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::optional< uint32_t > DiagnosticsMisExpectTolerance
The maximum percentage profiling weights can deviate from the expected values in order to be included...
std::string StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
std::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
bool hasSanitizeCoverage() const
SanitizerSet SanitizeAnnotateDebugInfo
Set of sanitizer checks, for which the instrumentation will be annotated with extra debug info.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
bool hasReducedDebugInfo() const
Check if type and variable info should be emitted.
OptRemark OptimizationRemark
Selected optimizations for which we should enable optimization remarks.
std::string ThinLTOIndexFile
Name of the function summary index file to use for ThinLTO function importing.
const char * Argv0
Executable and command-line used to create a given CompilerInvocation.
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
OptRemark OptimizationRemarkAnalysis
Selected optimizations for which we should enable optimization analyses.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
The base class of CompilerInvocation.
std::shared_ptr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::shared_ptr< AnalyzerOptions > AnalyzerOpts
Options controlling the static analyzer.
std::shared_ptr< MigratorOptions > MigratorOpts
std::shared_ptr< PreprocessorOutputOptions > PreprocessorOutputOpts
Options controlling preprocessed output.
std::shared_ptr< APINotesOptions > APINotesOpts
Options controlling API notes.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
const FrontendOptions & getFrontendOpts() const
const CodeGenOptions & getCodeGenOpts() const
void visitPathsImpl(llvm::function_ref< bool(std::string &)> Predicate)
Visits paths stored in the invocation.
llvm::function_ref< const char *(const Twine &)> StringAllocator
Command line generation.
const FileSystemOptions & getFileSystemOpts() const
std::shared_ptr< PreprocessorOptions > PPOpts
Options controlling the preprocessor (aside from #include handling).
const PreprocessorOutputOptions & getPreprocessorOutputOpts() const
void visitPaths(llvm::function_ref< bool(StringRef)> Callback) const
Visitation.
std::vector< std::string > getCC1CommandLine() const
Generate cc1-compatible command line arguments from this instance, wrapping the result as a std::vect...
std::shared_ptr< FileSystemOptions > FSOpts
Options controlling file system operations.
const AnalyzerOptions & getAnalyzerOpts() const
const MigratorOptions & getMigratorOpts() const
void generateCC1CommandLine(llvm::SmallVectorImpl< const char * > &Args, StringAllocator SA) const
Generate cc1-compatible command line arguments from this instance.
CompilerInvocationBase & deep_copy_assign(const CompilerInvocationBase &X)
const DependencyOutputOptions & getDependencyOutputOpts() const
CompilerInvocationBase & shallow_copy_assign(const CompilerInvocationBase &X)
const TargetOptions & getTargetOpts() const
std::shared_ptr< CodeGenOptions > CodeGenOpts
Options controlling IRgen and the backend.
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
const APINotesOptions & getAPINotesOpts() const
const HeaderSearchOptions & getHeaderSearchOpts() const
std::shared_ptr< HeaderSearchOptions > HSOpts
Options controlling the #include directive.
const PreprocessorOptions & getPreprocessorOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
const LangOptions & getLangOpts() const
Const getters.
std::shared_ptr< FrontendOptions > FrontendOpts
Options controlling the frontend itself.
llvm::function_ref< void(const Twine &)> ArgumentConsumer
std::shared_ptr< DependencyOutputOptions > DependencyOutputOpts
Options controlling dependency output.
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
MigratorOptions & getMigratorOpts()
AnalyzerOptions & getAnalyzerOpts()
APINotesOptions & getAPINotesOpts()
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
LangOptions & getLangOpts()
Mutable getters.
static bool checkCC1RoundTrip(ArrayRef< const char * > Args, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Check that Args can be parsed and re-serialized without change, emiting diagnostics for any differenc...
DependencyOutputOptions & getDependencyOutputOpts()
CompilerInvocation()=default
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
std::string getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
FileSystemOptions & getFileSystemOpts()
CompilerInvocation & operator=(const CompilerInvocation &X)
static void setDefaultPointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple)
Populate Opts with the default set of pointer authentication-related options given LangOpts and Tripl...
CodeGenOptions & getCodeGenOpts()
TargetOptions & getTargetOpts()
HeaderSearchOptions & getHeaderSearchOpts()
DiagnosticOptions & getDiagnosticOpts()
PreprocessorOutputOptions & getPreprocessorOutputOpts()
Same as CompilerInvocation, but with copy-on-write optimization.
FrontendOptions & getMutFrontendOpts()
LangOptions & getMutLangOpts()
Mutable getters.
HeaderSearchOptions & getMutHeaderSearchOpts()
MigratorOptions & getMutMigratorOpts()
PreprocessorOptions & getMutPreprocessorOpts()
APINotesOptions & getMutAPINotesOpts()
PreprocessorOutputOptions & getMutPreprocessorOutputOpts()
CodeGenOptions & getMutCodeGenOpts()
TargetOptions & getMutTargetOpts()
FileSystemOptions & getMutFileSystemOpts()
AnalyzerOptions & getMutAnalyzerOpts()
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
HeaderIncludeFormatKind HeaderIncludeFormat
The format of header information.
std::string OutputFile
The file to write dependency output to.
HeaderIncludeFilteringKind HeaderIncludeFiltering
Determine whether header information should be filtered.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
unsigned IncludeSystemHeaders
Include system header dependencies.
static llvm::IntrusiveRefCntPtr< DiagnosticIDs > create()
Options for controlling the compiler diagnostics engine.
std::string DiagnosticSuppressionMappingsFile
Path for the file that defines diagnostic suppression mappings.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > VerifyPrefixes
The prefixes for comment directives sought by -verify ("expected" by default).
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setClient(DiagnosticConsumer *client, bool ShouldOwnClient=true)
Set the diagnostic client associated with this diagnostic object.
unsigned getNumErrors() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
unsigned getNumWarnings() const
Keeps track of options that affect how file operations are performed.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input.
unsigned ClangIRDisablePasses
Disable Clang IR specific (CIR) passes.
std::map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
unsigned ClangIRDisableCIRVerifier
Disable Clang IR (CIR) verifier.
unsigned IsSystemModule
When using -emit-module, treat the modulemap as a system module.
unsigned UseClangIRPipeline
Use Clang IR pipeline to emit code.
ASTDumpOutputFormat ASTDumpFormat
Specifies the output format of the AST.
std::optional< std::string > AuxTargetCPU
Auxiliary target CPU for CUDA/HIP compilation.
std::string OutputFile
The output file, if any.
unsigned ShowStats
Show frontend performance metrics and statistics.
unsigned GenReducedBMI
Whether to generate reduced BMI for C++20 named modules.
std::string ActionName
The name of the action to run when using a plugin action.
std::vector< std::shared_ptr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
static InputKind getInputKindForExtension(StringRef Extension)
getInputKindForExtension - Return the appropriate input kind for a file extension.
std::vector< std::string > Plugins
The list of plugins to load.
unsigned ASTDumpAll
Whether we deserialize all decls when forming AST dumps.
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
unsigned DisableFree
Disable memory freeing on exit.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
frontend::ActionKind ProgramAction
The frontend action to perform.
std::optional< std::vector< std::string > > AuxTargetFeatures
Auxiliary target features for CUDA/HIP compilation.
std::string AuxTriple
Auxiliary triple for CUDA/HIP compilation.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
A diagnostic client that ignores all diagnostics.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ None
Don't exclude any overflow patterns from sanitizers.
@ AddUnsignedOverflowTest
if (a + b < a)
@ All
Exclude all overflow patterns (below)
@ AddSignedOverflowTest
if (a + b < a)
@ PostDecrInWhile
while (count–)
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
clang::ObjCRuntime ObjCRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
SanitizerSet Sanitize
Set of enabled sanitizers.
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
bool UseTargetPathSeparator
Indicates whether to use target's platform-specific file separator when FILE macro is used and when c...
static void setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, std::vector< std::string > &Includes, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
std::string RandstructSeed
The seed used by the randomize structure layout feature.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint64_t > AllocTokenMax
Maximum number of allocation tokens (0 = target SIZE_MAX), nullopt if none set (use target SIZE_MAX).
LangStandard::Kind LangStd
The used language standard.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
bool SanitizeCoverage
Is at least one coverage instrumentation type enabled.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
The basic abstraction for the target Objective-C runtime.
bool allowsWeak() const
Does this runtime allow the use of __weak?
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
std::string getAsString() const
bool allowsARC() const
Does this runtime allow ARC at all?
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
Discrimination
Forms of extra discrimination.
ARM8_3Key
Hardware pointer-signing keys in ARM8.3.
static constexpr std::optional< PositiveAnalyzerOption > create(unsigned Val)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a pragma hdrstop to separ...
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
void resetNonModularOptions()
Reset any options that are not considered when building a module.
void addMacroUndef(StringRef Name)
std::set< std::string > DeserializedPCHDeclsToErrorOn
This is a set of names for decls that we do not want to be deserialized, and we emit an error if they...
std::vector< std::string > EmbedEntries
User specified embed entries.
void addMacroDef(StringRef Name)
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a pragma hdrstop is expected to indicate the beginnin...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
std::vector< std::pair< std::string, bool > > Macros
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
unsigned ShowMacros
Print macro definitions.
unsigned ShowCPP
Print normal preprocessed output.
unsigned ShowLineMarkers
Show #line markers.
unsigned DirectivesOnly
Process directives but do not expand macros.
Encodes a location in the source.
static bool isSupportedCXXABI(const llvm::Triple &T, Kind Kind)
static const auto & getSpelling(Kind ABIKind)
static bool usesRelativeVTables(const llvm::Triple &T)
static bool isABI(StringRef Name)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
uint64_t LargeDataThreshold
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
constexpr XRayInstrMask None
constexpr XRayInstrMask All
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
@ CXXSystem
Like System, but only used for C++.
@ Angled
Paths for '#include <>' added by '-I'.
@ CSystem
Like System, but only used for C.
@ System
Like Angled, but marks system directories.
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
@ ExternCSystem
Like System, but headers are implicitly wrapped in extern "C".
@ ObjCSystem
Like System, but only used for ObjC.
@ ObjCXXSystem
Like System, but only used for ObjC++.
@ After
Like System, but searched after the system directories.
@ GenerateHeaderUnit
Generate a C++20 header unit module from a header file.
@ VerifyPCH
Load and verify that a PCH file is usable.
@ PrintPreprocessedInput
-E mode.
@ RewriteTest
Rewriter playground.
@ ParseSyntaxOnly
Parse and perform semantic analysis.
@ TemplightDump
Dump template instantiations.
@ GenerateModuleInterface
Generate pre-compiled module from a standard C++ module interface unit.
@ EmitLLVM
Emit a .ll file.
@ PrintPreamble
Print the "preamble" of the input file.
@ InitOnly
Only execute frontend initialization.
@ ASTView
Parse ASTs and view them in Graphviz.
@ PluginAction
Run a plugin action,.
@ DumpRawTokens
Dump out raw tokens.
@ PrintDependencyDirectivesSourceMinimizerOutput
Print the output of the dependency directives source minimizer.
@ RewriteObjC
ObjC->C Rewriter.
@ RunPreprocessorOnly
Just lex, no output.
@ ModuleFileInfo
Dump information about a module file.
@ EmitCIR
Emit a .cir file.
@ DumpCompilerOptions
Dump the compiler configuration.
@ RunAnalysis
Run one or more source code analyses.
@ ASTPrint
Parse ASTs and print them.
@ GenerateReducedModuleInterface
Generate reduced module interface for a standard C++ module interface unit.
@ GenerateInterfaceStubs
Generate Interface Stub Files.
@ ASTDump
Parse ASTs and dump them.
@ DumpTokens
Dump out preprocessed tokens.
@ FixIt
Parse and apply any fixits to the source.
@ EmitAssembly
Emit a .s file.
@ EmitCodeGenOnly
Generate machine code, but don't emit anything.
@ RewriteMacros
Expand macros but not #includes.
@ EmitHTML
Translate input source into HTML.
@ GeneratePCH
Generate pre-compiled header.
@ EmitLLVMOnly
Generate LLVM IR, but do not emit anything.
@ GenerateModule
Generate pre-compiled module from a module map.
@ ASTDeclList
Parse ASTs and list Decl nodes.
bool EQ(InterpState &S, CodePtr OpPC)
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
The JSON file list parser is used to communicate input to InstallAPI.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromOverlayFiles(ArrayRef< std::string > VFSOverlayFiles, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS)
DiagnosticLevelMask
A bitmask representing the diagnostic levels used by VerifyDiagnosticConsumer.
const char * headerIncludeFormatKindToString(HeaderIncludeFormatKind K)
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
constexpr uint16_t BlockDescriptorConstantDiscriminator
Constant discriminator to be used with block descriptor pointers.
constexpr uint16_t IsaPointerConstantDiscriminator
Constant discriminator to be used with objective-c isa pointers.
const char * headerIncludeFilteringKindToString(HeaderIncludeFilteringKind K)
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ Success
Annotation was successful.
@ Parse
Parse the block; this code is always used.
constexpr uint16_t SuperPointerConstantDiscriminator
Constant discriminator to be used with objective-c superclass pointers.
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
constexpr uint16_t MethodListPointerConstantDiscriminator
Constant discriminator to be used with method list pointers.
constexpr uint16_t ClassROConstantDiscriminator
Constant discriminator to be used with objective-c class_ro_t pointers.
constexpr uint16_t InitFiniPointerConstantDiscriminator
Constant discriminator to be used with function pointers in .init_array and .fini_array.
@ C
Languages that the frontend can parse and compile.
@ CIR
LLVM IR & CIR: we accept these so that we can run the optimizer on them, and compile them to assembly...
@ Asm
Assembly: we accept this only so that we can preprocess it.
bool parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskCutoffs &Cutoffs)
Parse a single weighted value (e.g., 'undefined=0.05') from a -fsanitize= or -fno-sanitize= value lis...
@ Result
The result type of a method or function.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
XRayInstrMask parseXRayInstrValue(StringRef Value)
Parses a command line argument into a mask.
const FunctionProtoType * T
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void serializeXRayInstrValue(XRayInstrSet Set, SmallVectorImpl< StringRef > &Values)
Serializes a set into a list of command line arguments.
unsigned getOptimizationLevelSize(const llvm::opt::ArgList &Args)
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
void serializeSanitizerMaskCutoffs(const SanitizerMaskCutoffs &Cutoffs, SmallVectorImpl< std::string > &Values)
Serialize a SanitizerMaskCutoffs into command line arguments.
ShaderStage
Shader programs run in specific pipeline stages.
constexpr uint16_t StdTypeInfoVTablePointerConstantDiscrimination
Constant discriminator for std::type_info vtable pointers: 0xB1EA/45546 The value is ptrauth_string_d...
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const llvm::opt::OptTable & getDriverOptTable()
AnalysisDiagClients
AnalysisDiagClients - Set of available diagnostic clients for rendering analysis results.
@ NUM_ANALYSIS_DIAG_CLIENTS
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
int getLastArgIntValue(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, int Default, DiagnosticsEngine *Diags=nullptr, unsigned Base=0)
Return the value of the last argument as an integer, or a default.
AnalysisInliningMode
AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
int const char * function
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
bool Internalize
If true, we use LLVM module internalizer.
bool PropagateAttrs
If true, we set attributes functions in the bitcode library according to our CodeGenOptions,...
std::string Filename
The filename of the bitcode file to link in.
unsigned LinkFlags
Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
Dummy tag type whose instance can be passed into the constructor to prevent creation of the reference...
LangStandard - Information about the properties of a particular language standard.
clang::Language getLanguage() const
Get the language that this standard describes.
const char * getDescription() const
getDescription - Get the description of this standard.
static const LangStandard & getLangStandardForKind(Kind K)
const char * getName() const
getName - Get the name of this standard.
static Kind getLangKind(StringRef Name)
static ParsedSourceLocation FromString(StringRef Str)
Construct a parsed source location from a string; the Filename is empty on error.
std::string ToString() const
Serialize ParsedSourceLocation back to a string.
PointerAuthSchema BlockDescriptorPointers
The ABI for pointers to block descriptors.
PointerAuthSchema BlockHelperFunctionPointers
The ABI for block object copy/destroy function pointers.
PointerAuthSchema CXXVTablePointers
The ABI for C++ virtual table pointers (the pointer to the table itself) as installed in an actual cl...
PointerAuthSchema InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
PointerAuthSchema BlockInvocationFunctionPointers
The ABI for block invocation function pointers.
PointerAuthSchema BlockByrefHelperFunctionPointers
The ABI for __block variable copy/destroy function pointers.
PointerAuthSchema CXXVTTVTablePointers
The ABI for C++ virtual table pointers as installed in a VTT.
bool ReturnAddresses
Should return addresses be authenticated?
PointerAuthSchema CXXTypeInfoVTablePointer
TypeInfo has external ABI requirements and is emitted without actually having parsed the libcxx defin...
bool AArch64JumpTableHardening
Use hardened lowering for jump-table dispatch?
PointerAuthSchema ObjCMethodListPointer
The ABI for a reference to an Objective-C method list in _class_ro_t.
PointerAuthSchema FunctionPointers
The ABI for C function pointers.
PointerAuthSchema ObjCSuperPointers
The ABI for Objective-C superclass pointers.
bool AuthTraps
Do authentication failures cause a trap?
PointerAuthSchema CXXMemberFunctionPointers
The ABI for C++ member function pointers.
PointerAuthSchema CXXVirtualVariadicFunctionPointers
The ABI for variadic C++ virtual function pointers.
PointerAuthSchema ObjCMethodListFunctionPointers
The ABI for Objective-C method lists.
PointerAuthSchema ObjCClassROPointers
The ABI for Objective-C class_ro_t pointers.
PointerAuthSchema CXXVirtualFunctionPointers
The ABI for most C++ virtual function pointers, i.e. v-table entries.
PointerAuthSchema ObjCIsaPointers
The ABI for Objective-C isa pointers.
bool IndirectGotos
Do indirect goto label addresses need to be authenticated?
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool empty() const
Returns true if no sanitizers are enabled.
SanitizerMask Mask
Bitmask of enabled sanitizers.
void set(XRayInstrMask K, bool Value)