29#include "clang/Config/config.h"
44#include "llvm/ADT/APInt.h"
45#include "llvm/ADT/ArrayRef.h"
46#include "llvm/ADT/CachedHashString.h"
47#include "llvm/ADT/FloatingPointMode.h"
48#include "llvm/ADT/STLExtras.h"
49#include "llvm/ADT/SmallVector.h"
50#include "llvm/ADT/StringRef.h"
51#include "llvm/ADT/StringSwitch.h"
52#include "llvm/ADT/Twine.h"
53#include "llvm/Config/llvm-config.h"
54#include "llvm/Frontend/Debug/Options.h"
55#include "llvm/IR/DebugInfoMetadata.h"
56#include "llvm/Linker/Linker.h"
57#include "llvm/MC/MCTargetOptions.h"
58#include "llvm/Option/Arg.h"
59#include "llvm/Option/ArgList.h"
60#include "llvm/Option/OptSpecifier.h"
61#include "llvm/Option/OptTable.h"
62#include "llvm/Option/Option.h"
63#include "llvm/ProfileData/InstrProfReader.h"
64#include "llvm/Remarks/HotnessThresholdParser.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/Compiler.h"
67#include "llvm/Support/Error.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/ErrorOr.h"
70#include "llvm/Support/FileSystem.h"
71#include "llvm/Support/HashBuilder.h"
72#include "llvm/Support/MathExtras.h"
73#include "llvm/Support/MemoryBuffer.h"
74#include "llvm/Support/Path.h"
75#include "llvm/Support/Process.h"
76#include "llvm/Support/Regex.h"
77#include "llvm/Support/VersionTuple.h"
78#include "llvm/Support/VirtualFileSystem.h"
79#include "llvm/Support/raw_ostream.h"
80#include "llvm/Target/TargetOptions.h"
81#include "llvm/TargetParser/Host.h"
82#include "llvm/TargetParser/Triple.h"
111 if (Arg.getAsInteger(10, Val))
112 return llvm::createStringError(llvm::inconvertibleErrorCode(),
113 "Not an integer: %s", Arg.data());
122 return std::make_shared<T>(
X);
193 if (Storage.use_count() > 1)
194 Storage = std::make_shared<T>(*Storage);
257#define OPTTABLE_STR_TABLE_CODE
258#include "clang/Options/Options.inc"
259#undef OPTTABLE_STR_TABLE_CODE
262 return OptionStrTable[Offset];
265#define SIMPLE_ENUM_VALUE_TABLE
266#include "clang/Options/Options.inc"
267#undef SIMPLE_ENUM_VALUE_TABLE
273 if (Args.hasArg(Opt))
282 if (Args.hasArg(Opt))
292 unsigned SpellingOffset, Option::OptionClass,
297 const Twine &Spelling, Option::OptionClass,
303 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
307 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
309 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
311 if (Args.hasArg(Opt))
318 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
324 OptSpecifier OtherOpt) {
325 return [
Value, OtherValue,
326 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
328 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
329 return A->getOption().matches(Opt) ?
Value : OtherValue;
337 Option::OptionClass,
unsigned,
bool KeyPath) {
338 if (KeyPath ==
Value)
344 const Twine &Spelling,
345 Option::OptionClass OptClass,
unsigned,
346 const Twine &
Value) {
348 case Option::SeparateClass:
349 case Option::JoinedOrSeparateClass:
350 case Option::JoinedAndSeparateClass:
354 case Option::JoinedClass:
355 case Option::CommaJoinedClass:
356 Consumer(Spelling +
Value);
359 llvm_unreachable(
"Cannot denormalize an option with option class "
360 "incompatible with string denormalization.");
367 Option::OptionClass OptClass,
unsigned TableIndex,
T Value) {
369 TableIndex, Twine(
Value));
374 Option::OptionClass OptClass,
unsigned TableIndex,
379static std::optional<SimpleEnumValue>
381 for (
int I = 0, E = Table.Size; I != E; ++I)
382 if (Name == Table.Table[I].Name)
383 return Table.Table[I];
388static std::optional<SimpleEnumValue>
390 for (
int I = 0, E = Table.Size; I != E; ++I)
392 return Table.Table[I];
401 assert(TableIndex < SimpleEnumValueTablesSize);
402 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
404 auto *Arg = Args.getLastArg(Opt);
408 StringRef ArgValue = Arg->getValue();
410 return MaybeEnumVal->Value;
412 Diags.
Report(diag::err_drv_invalid_value)
413 << Arg->getAsString(Args) << ArgValue;
418 unsigned SpellingOffset,
419 Option::OptionClass OptClass,
420 unsigned TableIndex,
unsigned Value) {
421 assert(TableIndex < SimpleEnumValueTablesSize);
422 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
425 TableIndex, MaybeEnumVal->Name);
427 llvm_unreachable(
"The simple enum value was not correctly defined in "
428 "the tablegen option description");
434 unsigned SpellingOffset,
435 Option::OptionClass OptClass,
436 unsigned TableIndex,
T Value) {
438 TableIndex,
static_cast<unsigned>(
Value));
445 auto *Arg = Args.getLastArg(Opt);
448 return std::string(Arg->getValue());
451template <
typename IntTy>
455 auto *Arg = Args.getLastArg(Opt);
459 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
460 Diags.
Report(diag::err_drv_invalid_int_value)
461 << Arg->getAsString(Args) << Arg->getValue();
467static std::optional<std::vector<std::string>>
470 return Args.getAllArgValues(Opt);
474 unsigned SpellingOffset,
475 Option::OptionClass OptClass,
477 const std::vector<std::string> &Values) {
479 case Option::CommaJoinedClass: {
480 std::string CommaJoinedValue;
481 if (!Values.empty()) {
482 CommaJoinedValue.append(Values.front());
483 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
484 CommaJoinedValue.append(
",");
485 CommaJoinedValue.append(
Value);
489 Option::OptionClass::JoinedClass, TableIndex,
493 case Option::JoinedClass:
494 case Option::SeparateClass:
495 case Option::JoinedOrSeparateClass:
496 for (
const std::string &
Value : Values)
500 llvm_unreachable(
"Cannot denormalize an option with option class "
501 "incompatible with string vector denormalization.");
509 auto *Arg = Args.getLastArg(Opt);
512 return llvm::Triple::normalize(Arg->getValue());
515template <
typename T,
typename U>
517 return static_cast<T>(
Value);
521 return KeyPath |
Value;
528template <
typename T,
typename U, U Value>
533#define PARSE_OPTION_WITH_MARSHALLING( \
534 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
535 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
536 METAVAR, VALUES, SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
537 DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
538 MERGER, EXTRACTOR, TABLE_INDEX) \
539 if ((VISIBILITY) & options::CC1Option) { \
540 KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
542 KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
544 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
546 MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
551#define GENERATE_OPTION_WITH_MARSHALLING( \
552 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
553 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
554 SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
555 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
557 if ((VISIBILITY) & options::CC1Option) { \
558 [&](const auto &Extracted) { \
561 static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
562 : (DEFAULT_VALUE)))) \
563 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
564 TABLE_INDEX, Extracted); \
565 }(EXTRACTOR(KEYPATH)); \
579 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
580 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
581 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
582 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
585 CodeGenOpts.ClearASTBeforeBackend =
false;
587 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
588 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
591 llvm::Triple
T(TargetOpts.
Triple);
592 llvm::Triple::ArchType
Arch =
T.getArch();
597 if (CodeGenOpts.getExceptionHandling() !=
599 T.isWindowsMSVCEnvironment())
600 Diags.
Report(diag::err_fe_invalid_exception_model)
601 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) <<
T.str();
603 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
604 Diags.
Report(diag::warn_c_kext);
606 if (LangOpts.NewAlignOverride &&
607 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
608 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
609 Diags.
Report(diag::err_fe_invalid_alignment)
610 << A->getAsString(Args) << A->getValue();
611 LangOpts.NewAlignOverride = 0;
616 if (LangOpts.CPlusPlus11) {
617 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
618 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
619 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
620 <<
bool(LangOpts.RawStringLiterals);
624 LangOpts.RawStringLiterals =
true;
627 LangOpts.NamedLoops =
628 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
631 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
632 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
635 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
636 Diags.
Report(diag::err_drv_argument_not_allowed_with)
639 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
640 Diags.
Report(diag::err_drv_argument_not_allowed_with)
643 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
644 Diags.
Report(diag::err_drv_argument_not_allowed_with)
647 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
648 Diags.
Report(diag::err_drv_argument_not_allowed_with)
651 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
652 Diags.
Report(diag::warn_ignored_hip_only_option)
653 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
655 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
656 Diags.
Report(diag::warn_ignored_hip_only_option)
657 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
666 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
667 if (LangOpts.ApproxFunc)
668 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
669 if (LangOpts.AllowFPReassoc)
670 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
671 if (LangOpts.AllowRecip)
672 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
678 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
680 Diags.
Report(diag::warn_option_invalid_ocl_version)
682 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
684 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
685 auto DefaultCC = LangOpts.getDefaultCallingConv();
689 Arch != llvm::Triple::x86;
695 Diags.
Report(diag::err_drv_argument_not_allowed_with)
696 << A->getSpelling() <<
T.getTriple();
707 llvm::opt::OptSpecifier OptSpecifier) {
710 Option::OptionClass::FlagClass, 0);
714 llvm::opt::OptSpecifier OptSpecifier,
715 const Twine &
Value) {
753 bool CheckAgainstOriginalInvocation =
false,
754 bool ForceRoundTrip =
false) {
756 bool DoRoundTripDefault =
true;
758 bool DoRoundTripDefault =
false;
761 bool DoRoundTrip = DoRoundTripDefault;
762 if (ForceRoundTrip) {
765 for (
const auto *Arg : CommandLineArgs) {
766 if (Arg == StringRef(
"-round-trip-args"))
768 if (Arg == StringRef(
"-no-round-trip-args"))
776 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
781 llvm::raw_string_ostream OS(Buffer);
782 for (
const char *Arg : Args) {
783 llvm::sys::printArg(OS, Arg,
true);
796 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
803 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
809 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
810 Diags.
Report(diag::note_cc1_round_trip_original)
811 << SerializeArgs(CommandLineArgs);
816 llvm::BumpPtrAllocator Alloc;
817 llvm::StringSaver StringPool(Alloc);
818 auto SA = [&StringPool](
const Twine &Arg) {
819 return StringPool.save(Arg).data();
826 Generate(DummyInvocation, GeneratedArgs, SA);
832 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
837 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
838 Diags.
Report(diag::note_cc1_round_trip_generated)
839 << 1 << SerializeArgs(GeneratedArgs);
844 if (CheckAgainstOriginalInvocation)
846 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
850 Generate(RealInvocation, ComparisonArgs, SA);
855 return std::equal(A.begin(), A.end(), B.begin(), B.end(),
856 [](
const char *AElem,
const char *BElem) {
857 return StringRef(AElem) == StringRef(BElem);
864 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
865 Diags.
Report(diag::err_cc1_round_trip_mismatch);
866 Diags.
Report(diag::note_cc1_round_trip_generated)
867 << 1 << SerializeArgs(GeneratedArgs);
868 Diags.
Report(diag::note_cc1_round_trip_generated)
869 << 2 << SerializeArgs(ComparisonArgs);
873 Diags.
Report(diag::remark_cc1_round_trip_generated)
874 << 1 << SerializeArgs(GeneratedArgs);
875 Diags.
Report(diag::remark_cc1_round_trip_generated)
876 << 2 << SerializeArgs(ComparisonArgs);
888 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
892 Args.push_back(
"-cc1");
895 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
900 OptSpecifier GroupWithValue,
901 std::vector<std::string> &Diagnostics) {
902 for (
auto *A : Args.filtered(Group)) {
903 if (A->getOption().getKind() == Option::FlagClass) {
906 Diagnostics.push_back(
907 std::string(A->getOption().getName().drop_front(1)));
908 }
else if (A->getOption().matches(GroupWithValue)) {
911 Diagnostics.push_back(
912 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
915 Diagnostics.push_back(A->getValue());
926 std::vector<std::string> &Funcs) {
927 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
929 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
936#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
937 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
938#include "clang/Options/Options.inc"
939#undef ANALYZER_OPTION_WITH_MARSHALLING
943#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
945 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
947#include "clang/StaticAnalyzer/Core/Analyses.def"
949 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
955#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
957 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
959#include "clang/StaticAnalyzer/Core/Analyses.def"
961 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
967#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
969 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
971#include "clang/StaticAnalyzer/Core/Analyses.def"
973 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
979#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
981 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
983#include "clang/StaticAnalyzer/Core/Analyses.def"
985 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
991 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1000 for (
const auto &
C : Opts.
Config)
1001 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1002 llvm::sort(SortedConfigOpts, llvm::less_first());
1004 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1007 auto Entry = ConfigOpts.
Config.find(Key);
1008 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1023#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1024 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1025#include "clang/Options/Options.inc"
1026#undef ANALYZER_OPTION_WITH_MARSHALLING
1028 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1029 StringRef Name = A->getValue();
1031#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1032 .Case(CMDFLAG, NAME##Model)
1033#include "clang/StaticAnalyzer/Core/Analyses.def"
1036 Diags.
Report(diag::err_drv_invalid_value)
1037 << A->getAsString(Args) << Name;
1040 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1041 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1048 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1049 StringRef Name = A->getValue();
1051#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1052 .Case(CMDFLAG, PD_##NAME)
1053#include "clang/StaticAnalyzer/Core/Analyses.def"
1056 Diags.
Report(diag::err_drv_invalid_value)
1057 << A->getAsString(Args) << Name;
1063 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1064 StringRef Name = A->getValue();
1066#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1067 .Case(CMDFLAG, NAME)
1068#include "clang/StaticAnalyzer/Core/Analyses.def"
1071 Diags.
Report(diag::err_drv_invalid_value)
1072 << A->getAsString(Args) << Name;
1078 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1079 StringRef Name = A->getValue();
1081#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1082 .Case(CMDFLAG, NAME)
1083#include "clang/StaticAnalyzer/Core/Analyses.def"
1086 Diags.
Report(diag::err_drv_invalid_value)
1087 << A->getAsString(Args) << Name;
1095 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1097 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1100 StringRef CheckerAndPackageList = A->getValue();
1102 CheckerAndPackageList.split(CheckersAndPackages,
",");
1103 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1109 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1113 StringRef configList = A->getValue();
1115 configList.split(configVals,
",");
1116 for (
const auto &configVal : configVals) {
1118 std::tie(key, val) = configVal.split(
"=");
1121 diag::err_analyzer_config_no_value) << configVal;
1124 if (val.contains(
'=')) {
1126 diag::err_analyzer_config_multiple_values)
1135 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1140 Opts.
Config[key] = std::string(val);
1150 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1153 os << Args.getArgString(i);
1160 StringRef OptionName, StringRef DefaultVal) {
1161 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1166 StringRef &OptionField, StringRef Name,
1167 StringRef DefaultVal) {
1176 bool &OptionField, StringRef Name,
bool DefaultVal) {
1177 auto PossiblyInvalidVal =
1178 llvm::StringSwitch<std::optional<bool>>(
1181 .Case(
"false",
false)
1182 .Default(std::nullopt);
1184 if (!PossiblyInvalidVal) {
1186 Diags->
Report(diag::err_analyzer_config_invalid_input)
1187 << Name <<
"a boolean";
1189 OptionField = DefaultVal;
1191 OptionField = *PossiblyInvalidVal;
1196 unsigned &OptionField, StringRef Name,
1197 unsigned DefaultVal) {
1199 OptionField = DefaultVal;
1200 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1201 .getAsInteger(0, OptionField);
1202 if (Diags && HasFailed)
1203 Diags->
Report(diag::err_analyzer_config_invalid_input)
1204 << Name <<
"an unsigned";
1210 unsigned DefaultVal) {
1213 if (Parsed.has_value()) {
1214 OptionField = Parsed.value();
1217 if (Diags && !Parsed.has_value())
1218 Diags->
Report(diag::err_analyzer_config_invalid_input)
1219 << Name <<
"a positive";
1221 OptionField = DefaultVal;
1229#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1230 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1231#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1232#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1234 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1235 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1237#define ANALYZER_OPTION(...)
1238#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1239 SHALLOW_VAL, DEEP_VAL) \
1240 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1241 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1242#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1249 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1250 std::vector<StringRef> Checkers =
1252 std::vector<StringRef> Packages =
1256 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1258 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1260 bool IsChecker = CheckerOrPackage.contains(
'.');
1261 bool IsValidName = IsChecker
1262 ? llvm::is_contained(Checkers, CheckerOrPackage)
1263 : llvm::is_contained(Packages, CheckerOrPackage);
1266 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1267 << CheckerOrPackage;
1277 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1278 Diags->
Report(diag::err_analyzer_config_invalid_input)
1279 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1287 if (
Remark.hasValidPattern()) {
1292 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1301 OptSpecifier OptEQ, StringRef Name) {
1304 auto InitializeResultPattern = [&Diags, &Args, &Result](
const Arg *A,
1305 StringRef Pattern) {
1306 Result.Pattern = Pattern.str();
1308 std::string RegexError;
1309 Result.Regex = std::make_shared<llvm::Regex>(Result.Pattern);
1310 if (!Result.Regex->isValid(RegexError)) {
1311 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1312 << RegexError << A->getAsString(Args);
1319 for (Arg *A : Args) {
1320 if (A->getOption().matches(OPT_R_Joined)) {
1321 StringRef
Value = A->getValue();
1325 else if (
Value ==
"everything")
1327 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1329 else if (
Value ==
"no-everything")
1336 Result.Pattern =
"";
1337 Result.Regex =
nullptr;
1339 InitializeResultPattern(A,
".*");
1341 }
else if (A->getOption().matches(OptEQ)) {
1343 if (!InitializeResultPattern(A, A->getValue()))
1352 const std::vector<std::string> &Levels,
1356 for (
const auto &Level : Levels) {
1358 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1366 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1374 const std::vector<std::string> &Sanitizers,
1376 for (
const auto &Sanitizer : Sanitizers) {
1379 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1393 const std::vector<std::string> &Sanitizers,
1396 for (
const auto &Sanitizer : Sanitizers) {
1398 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1407 llvm::SplitString(Bundle, BundleParts,
",");
1408 for (
const auto &B : BundleParts) {
1412 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1426 llvm::raw_string_ostream OS(Buffer);
1427 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1433 const llvm::Triple &Triple) {
1434 assert(Triple.getArch() == llvm::Triple::aarch64);
1441 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1442 : Discrimination::None);
1445 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1446 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1447 : Discrimination::None);
1449 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1464 if (
LangOpts.PointerAuthInitFini) {
1466 Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1476 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1495 if (
LangOpts.PointerAuthObjcClassROPointers)
1508 const llvm::Triple &Triple,
1510 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1511 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1512 !LangOpts.AArch64JumpTableHardening)
1518void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1520 const llvm::Triple &
T,
1521 const std::string &OutputFile,
1525 if (Opts.OptimizationLevel == 0)
1528 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1530#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1531 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1532#include "clang/Options/Options.inc"
1533#undef CODEGEN_OPTION_WITH_MARSHALLING
1535 if (Opts.OptimizationLevel > 0) {
1539 GenerateArg(Consumer, OPT_finline_hint_functions);
1544 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1545 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1546 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1547 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1549 std::optional<StringRef> DebugInfoVal;
1550 switch (Opts.DebugInfo) {
1551 case llvm::codegenoptions::DebugLineTablesOnly:
1552 DebugInfoVal =
"line-tables-only";
1554 case llvm::codegenoptions::DebugDirectivesOnly:
1555 DebugInfoVal =
"line-directives-only";
1557 case llvm::codegenoptions::DebugInfoConstructor:
1558 DebugInfoVal =
"constructor";
1560 case llvm::codegenoptions::LimitedDebugInfo:
1561 DebugInfoVal =
"limited";
1563 case llvm::codegenoptions::FullDebugInfo:
1564 DebugInfoVal =
"standalone";
1566 case llvm::codegenoptions::UnusedTypeInfo:
1567 DebugInfoVal =
"unused-types";
1569 case llvm::codegenoptions::NoDebugInfo:
1570 DebugInfoVal = std::nullopt;
1572 case llvm::codegenoptions::LocTrackingOnly:
1573 DebugInfoVal = std::nullopt;
1577 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1581 Prefix.first +
"=" + Prefix.second);
1584 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1585 Prefix.first +
"=" + Prefix.second);
1587 if (Opts.NewStructPathTBAA)
1590 if (Opts.OptimizeSize == 1)
1592 else if (Opts.OptimizeSize == 2)
1600 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1602 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1605 if (Opts.InterchangeLoops)
1611 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1616 if (Opts.DebugNameTable ==
1617 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1619 else if (Opts.DebugNameTable ==
1620 static_cast<unsigned>(
1621 llvm::DICompileUnit::DebugNameTableKind::Default))
1624 if (Opts.DebugTemplateAlias)
1627 auto TNK = Opts.getDebugSimpleTemplateNames();
1628 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1629 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1630 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1631 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1632 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1637 if (Opts.TimePasses) {
1638 if (Opts.TimePassesPerRun)
1639 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1643 if (Opts.TimePassesJson)
1647 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1650 if (Opts.PrepareForThinLTO)
1659 StringRef MemProfileBasename(
"memprof.profraw");
1680 std::string InstrBundle =
1682 if (!InstrBundle.empty())
1683 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1686 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1687 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1688 else if (Opts.CFProtectionReturn)
1689 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1690 else if (Opts.CFProtectionBranch)
1691 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1693 if (Opts.CFProtectionBranch) {
1694 switch (Opts.getCFBranchLabelScheme()) {
1697#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1698 case CFBranchLabelSchemeKind::Kind: \
1699 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1701#include "clang/Basic/CFProtectionOptions.def"
1705 if (Opts.FunctionReturnThunks)
1706 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1709 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1710 F.PropagateAttrs && F.Internalize;
1712 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1716 if (Opts.EmulatedTLS)
1724 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1729 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1733 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1737 if (Opts.EnableAIXExtendedAltivecABI)
1740 if (Opts.XCOFFReadOnlyPointers)
1758 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1763 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1767 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1770 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1772 for (StringRef Sanitizer :
1774 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1776 SmallVector<std::string, 4> Values;
1778 for (std::string Sanitizer : Values)
1779 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1782 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1786 for (StringRef Sanitizer :
1788 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1790 if (!Opts.EmitVersionIdentMetadata)
1793 switch (Opts.FiniteLoops) {
1804 if (Opts.StaticClosure)
1808bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1811 const llvm::Triple &
T,
1812 const std::string &OutputFile,
1823 const LangOptions *
LangOpts = &LangOptsRef;
1825#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1826 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1827#include "clang/Options/Options.inc"
1828#undef CODEGEN_OPTION_WITH_MARSHALLING
1832 if (Opts.OptimizationLevel == 0) {
1834 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1835 options::OPT_finline_hint_functions,
1836 options::OPT_fno_inline_functions,
1837 options::OPT_fno_inline)) {
1840 if (A->getOption().matches(options::OPT_finline_functions))
1842 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1852 Opts.DirectAccessExternalData =
1853 Args.hasArg(OPT_fdirect_access_external_data) ||
1854 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1857 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1859 llvm::StringSwitch<unsigned>(A->getValue())
1860 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1861 .Case(
"line-directives-only",
1862 llvm::codegenoptions::DebugDirectivesOnly)
1863 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1864 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1865 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1866 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1869 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1872 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1878 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1879 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1880 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1881 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1882 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1883 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1884 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1887 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1888 auto Split = StringRef(Arg).split(
'=');
1892 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1893 auto Split = StringRef(Arg).split(
'=');
1897 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1898 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1899 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1900 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el,
1901 llvm::Triple::riscv32, llvm::Triple::riscv64};
1904 llvm::is_contained(DebugEntryValueArchs,
T.getArch()))
1905 Opts.EmitCallSiteInfo =
true;
1908 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1913 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1914 Args.hasArg(OPT_new_struct_path_tbaa);
1916 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1917 if (Opts.SimplifyLibCalls)
1920 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1921 (Opts.OptimizationLevel > 1));
1922 Opts.InterchangeLoops =
1923 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
false);
1924 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1925 OPT_fno_experimental_loop_fusion,
false);
1927 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1929 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1931 Opts.DebugNameTable =
static_cast<unsigned>(
1932 Args.hasArg(OPT_ggnu_pubnames)
1933 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1934 : Args.hasArg(OPT_gpubnames)
1935 ? llvm::DICompileUnit::DebugNameTableKind::Default
1936 : llvm::DICompileUnit::DebugNameTableKind::None);
1937 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1938 StringRef
Value = A->getValue();
1940 Diags.
Report(diag::err_drv_unsupported_option_argument)
1941 << A->getSpelling() << A->getValue();
1942 Opts.setDebugSimpleTemplateNames(
1943 StringRef(A->getValue()) ==
"simple"
1944 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1945 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1948 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1949 OPT_stats_file_timers)) {
1950 Opts.TimePasses =
true;
1953 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1954 StringRef Val =
EQ->getValue();
1955 if (Val ==
"per-pass")
1956 Opts.TimePassesPerRun =
false;
1957 else if (Val ==
"per-pass-run")
1958 Opts.TimePassesPerRun =
true;
1960 Diags.
Report(diag::err_drv_invalid_value)
1961 <<
EQ->getAsString(Args) <<
EQ->getValue();
1964 if (Args.getLastArg(OPT_ftime_report_json))
1965 Opts.TimePassesJson =
true;
1968 Opts.PrepareForLTO =
false;
1969 Opts.PrepareForThinLTO =
false;
1970 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1971 Opts.PrepareForLTO =
true;
1972 StringRef S = A->getValue();
1974 Opts.PrepareForThinLTO =
true;
1975 else if (S !=
"full")
1976 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1977 if (Args.hasArg(OPT_funified_lto))
1978 Opts.PrepareForThinLTO =
true;
1980 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
1982 Diags.
Report(diag::err_drv_argument_only_allowed_with)
1983 << A->getAsString(Args) <<
"-x ir";
1985 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
1987 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
1989 llvm::StringSwitch<std::string>(A->getValue())
1990 .Case(
"obj", OutputFile)
1991 .Default(llvm::sys::path::filename(OutputFile).str());
1994 const char *MemProfileBasename =
"memprof.profraw";
1995 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
1996 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
1997 llvm::sys::path::append(Path, MemProfileBasename);
1999 }
else if (Args.hasArg(OPT_fmemory_profile))
2003 if (Args.hasArg(OPT_coverage_version_EQ)) {
2004 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2005 if (CoverageVersion.size() != 4) {
2006 Diags.
Report(diag::err_drv_invalid_value)
2007 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2017 for (
const auto &A : Args) {
2019 if (A->getOption().getID() == options::OPT_o ||
2020 A->getOption().getID() == options::OPT_INPUT ||
2021 A->getOption().getID() == options::OPT_x ||
2022 A->getOption().getID() == options::OPT_fembed_bitcode ||
2023 A->getOption().matches(options::OPT_W_Group))
2026 A->render(Args, ASL);
2027 for (
const auto &arg : ASL) {
2028 StringRef ArgStr(arg);
2029 llvm::append_range(Opts.
CmdArgs, ArgStr);
2035 auto XRayInstrBundles =
2036 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2037 if (XRayInstrBundles.empty())
2040 for (
const auto &A : XRayInstrBundles)
2044 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2045 StringRef Name = A->getValue();
2046 if (Name ==
"full") {
2047 Opts.CFProtectionReturn = 1;
2048 Opts.CFProtectionBranch = 1;
2049 }
else if (Name ==
"return")
2050 Opts.CFProtectionReturn = 1;
2051 else if (Name ==
"branch")
2052 Opts.CFProtectionBranch = 1;
2053 else if (Name !=
"none")
2054 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2057 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2058 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2060 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2061#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2062 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2063#include "clang/Basic/CFProtectionOptions.def"
2066 Opts.setCFBranchLabelScheme(Scheme);
2068 Diags.
Report(diag::err_drv_invalid_value)
2069 << A->getAsString(Args) << A->getValue();
2073 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2074 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2075 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2076 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2077 .Default(llvm::FunctionReturnThunksKind::Invalid);
2080 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2081 << A->getSpelling() <<
T.getTriple();
2082 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2083 Diags.
Report(diag::err_drv_invalid_value)
2084 << A->getAsString(Args) << A->getValue();
2085 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2086 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2087 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2088 << A->getAsString(Args)
2089 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2091 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2095 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2096 CodeGenOptions::BitcodeFileToLink F;
2098 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2099 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2108 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2109 StringRef Val = A->getValue();
2113 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2116 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2117 StringRef Val = A->getValue();
2120 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2126 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2127 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2131 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2132 << A->getSpelling() <<
T.str();
2134 const Option &O = A->getOption();
2135 if (O.matches(OPT_fpcc_struct_return) ||
2136 O.matches(OPT_maix_struct_return)) {
2139 assert(O.matches(OPT_freg_struct_return) ||
2140 O.matches(OPT_msvr4_struct_return));
2145 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2147 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2148 << A->getSpelling() <<
T.str();
2158 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2159 Diags.
Report(diag::err_roptr_requires_data_sections);
2161 Opts.XCOFFReadOnlyPointers =
true;
2164 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2165 if (!
T.isOSAIX() ||
T.isPPC32())
2166 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2167 << A->getSpelling() <<
T.str();
2170 bool NeedLocTracking =
false;
2173 NeedLocTracking =
true;
2175 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2177 NeedLocTracking =
true;
2180 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2182 NeedLocTracking =
true;
2192 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2202 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2205 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2206 <<
"-fdiagnostics-show-hotness";
2210 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2212 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2215 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2216 <<
"-fdiagnostics-hotness-threshold=";
2222 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2223 <<
"-fdiagnostics-hotness-threshold=";
2228 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2232 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2233 <<
"-fdiagnostics-misexpect-tolerance=";
2239 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2240 <<
"-fdiagnostics-misexpect-tolerance=";
2247 if (UsingSampleProfile)
2248 NeedLocTracking =
true;
2251 NeedLocTracking =
true;
2255 if (NeedLocTracking &&
2256 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2257 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2262 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2265 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2268 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2273 "-fsanitize-skip-hot-cutoff=",
2274 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2277 "-fsanitize-annotate-debug-info=",
2278 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2282 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2285 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2286 Diags.
Report(diag::err_drv_invalid_value)
2287 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2293 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2298 if (Args.hasArg(options::OPT_ffinite_loops))
2300 else if (Args.hasArg(options::OPT_fno_finite_loops))
2303 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2304 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2305 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2306 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2308 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2316#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2317 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2318#include "clang/Options/Options.inc"
2319#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2324 for (
const auto &Dep : Opts.
ExtraDeps) {
2325 switch (Dep.second) {
2338 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2347 bool ShowLineMarkers) {
2351#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2352 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2353#include "clang/Options/Options.inc"
2354#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2356 if (Args.hasArg(OPT_show_includes)) {
2371 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2372 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2373 StringRef Val = A->getValue();
2374 if (!Val.contains(
'='))
2378 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2379 StringRef Val = A->getValue();
2380 if (!Val.contains(
'='))
2387 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2391 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2395 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2396 StringRef Val = A->getValue();
2397 if (!Val.contains(
'='))
2405 if (Args.hasArg(OPT_header_include_format_EQ))
2406 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2410 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2414 if (Args.hasArg(OPT_header_include_filtering_EQ))
2415 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2419 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2435 } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2436 for (
auto *A : Args) {
2437 const Option &O = A->getOption();
2438 if (O.matches(options::OPT_fcolor_diagnostics)) {
2439 ShowColors = Colors_On;
2440 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2441 ShowColors = Colors_Off;
2442 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2443 StringRef
Value(A->getValue());
2444 if (
Value ==
"always")
2445 ShowColors = Colors_On;
2446 else if (
Value ==
"never")
2447 ShowColors = Colors_Off;
2448 else if (
Value ==
"auto")
2449 ShowColors = Colors_Auto;
2452 return ShowColors == Colors_On ||
2453 (ShowColors == Colors_Auto &&
2454 llvm::sys::Process::StandardErrHasColors());
2460 for (
const auto &Prefix : VerifyPrefixes) {
2463 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2466 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2468 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2469 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2479#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2480 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2481#include "clang/Options/Options.inc"
2482#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2491#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2492 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2493#include "clang/Options/Options.inc"
2494#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2502#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2503 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2504#include "clang/Options/Options.inc"
2505#undef MIGRATOR_OPTION_WITH_MARSHALLING
2514#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2515 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2516#include "clang/Options/Options.inc"
2517#undef MIGRATOR_OPTION_WITH_MARSHALLING
2522void CompilerInvocationBase::GenerateDiagnosticArgs(
2524 bool DefaultDiagColor) {
2526#define DIAG_OPTION_WITH_MARSHALLING(...) \
2527 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2528#include "clang/Options/Options.inc"
2529#undef DIAG_OPTION_WITH_MARSHALLING
2532 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2535 if (Opts.ShowColors)
2538 if (Opts.VerifyDiagnostics &&
2543 if (Prefix !=
"expected")
2550 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2553 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2555 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2557 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2559 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2564 if (
Warning ==
"undef-prefix")
2567 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2569 Consumer(StringRef(
"-W") +
Warning);
2575 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2576 "pass-analysis",
"no-pass-analysis",
2577 "pass-missed",
"no-pass-missed"};
2578 if (llvm::is_contained(IgnoredRemarks,
Remark))
2581 Consumer(StringRef(
"-R") +
Remark);
2585 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2590std::unique_ptr<DiagnosticOptions>
2592 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2593 unsigned MissingArgIndex, MissingArgCount;
2595 Argv.slice(1), MissingArgIndex, MissingArgCount);
2597 bool ShowColors =
true;
2598 if (std::optional<std::string> NoColor =
2599 llvm::sys::Process::GetEnv(
"NO_COLOR");
2600 NoColor && !NoColor->empty()) {
2615 bool DefaultDiagColor) {
2616 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2617 std::optional<DiagnosticsEngine> IgnoringDiags;
2619 IgnoringDiagOpts.emplace();
2622 Diags = &*IgnoringDiags;
2631#define DIAG_OPTION_WITH_MARSHALLING(...) \
2632 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2633#include "clang/Options/Options.inc"
2634#undef DIAG_OPTION_WITH_MARSHALLING
2636 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2639 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2643 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2645 if (Args.hasArg(OPT_verify))
2650 Opts.VerifyDiagnostics =
false;
2655 "-verify-ignore-unexpected=",
2656 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2657 if (Args.hasArg(OPT_verify_ignore_unexpected))
2659 Opts.setVerifyIgnoreUnexpected(DiagMask);
2661 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2666 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2677 unsigned DefaultOpt = 0;
2680 !Args.hasArg(OPT_cl_opt_disable))
2683 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2684 if (A->getOption().matches(options::OPT_O0))
2687 if (A->getOption().matches(options::OPT_Ofast))
2690 assert(A->getOption().matches(options::OPT_O));
2692 StringRef S(A->getValue());
2693 if (S ==
"s" || S ==
"z")
2702 unsigned MaxOptLevel = 3;
2703 if (DefaultOpt > MaxOptLevel) {
2706 Diags.
Report(diag::warn_drv_optimization_value)
2707 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2708 DefaultOpt = MaxOptLevel;
2715 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2716 if (A->getOption().matches(options::OPT_O)) {
2717 switch (A->getValue()[0]) {
2735 std::string &BlockName,
2736 unsigned &MajorVersion,
2737 unsigned &MinorVersion,
2739 std::string &UserInfo) {
2741 Arg.split(Args,
':', 5);
2742 if (Args.size() < 5)
2745 BlockName = std::string(Args[0]);
2746 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2747 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2748 if (Args[3].getAsInteger(2, Hashed))
return true;
2749 if (Args.size() > 4)
2750 UserInfo = std::string(Args[4]);
2759 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2790 OPT_emit_reduced_module_interface},
2807 OPT_print_dependency_directives_minimized_source},
2814static std::optional<frontend::ActionKind>
2817 if (ActionOpt.second == Opt.getID())
2818 return ActionOpt.first;
2820 return std::nullopt;
2824static std::optional<OptSpecifier>
2827 if (ActionOpt.first == ProgramAction)
2828 return OptSpecifier(ActionOpt.second);
2830 return std::nullopt;
2836#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2837 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2838#include "clang/Options/Options.inc"
2839#undef FRONTEND_OPTION_WITH_MARSHALLING
2841 std::optional<OptSpecifier> ProgramActionOpt =
2849 if (!ProgramActionOpt) {
2852 "Frontend action without option.");
2853 GenerateProgramAction = [&]() {
2860 GenerateProgramAction = [&]() {
2868 llvm_unreachable(
"Default AST dump format.");
2875 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2888 GenerateProgramAction = [&]() {
2893 GenerateProgramAction();
2895 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2897 for (
const auto &PluginArg : PluginArgs.second)
2899 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2900 Opt.getKind(), 0, PluginArg);
2904 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2905 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2911 for (
const auto &Plugin : Opts.
Plugins)
2917 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2930 StringRef HeaderUnit =
"";
2935 HeaderUnit =
"-user";
2938 HeaderUnit =
"-system";
2941 HeaderUnit =
"-header-unit";
2944 StringRef Header = IsHeader ?
"-header" :
"";
2967 Lang =
"objective-c";
2970 Lang =
"objective-c++";
2973 Lang =
"assembler-with-cpp";
2977 "Generating -x argument for unknown language (not precompiled).");
2992 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
2996 for (
const auto &Input : Opts.
Inputs)
2997 Consumer(Input.getFile());
3006#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3007 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3008#include "clang/Options/Options.inc"
3009#undef FRONTEND_OPTION_WITH_MARSHALLING
3012 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3013 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3015 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3018 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3019 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3022 .Default(std::numeric_limits<unsigned>::max());
3024 if (Val != std::numeric_limits<unsigned>::max())
3027 Diags.
Report(diag::err_drv_invalid_value)
3028 << A->getAsString(Args) << A->getValue();
3038 Args.hasArg(OPT_interface_stub_version_EQ)
3039 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3041 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3042 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3043 ArgStr ==
"experimental-tapi-elf-v1") {
3044 std::string ErrorMessage =
3045 "Invalid interface stub format: " + ArgStr.str() +
3047 Diags.
Report(diag::err_drv_invalid_value)
3048 <<
"Must specify a valid interface stub format type, ie: "
3049 "-interface-stub-version=ifs-v1"
3052 }
else if (!ArgStr.starts_with(
"ifs-")) {
3053 std::string ErrorMessage =
3054 "Invalid interface stub format: " + ArgStr.str() +
".";
3055 Diags.
Report(diag::err_drv_invalid_value)
3056 <<
"Must specify a valid interface stub format type, ie: "
3057 "-interface-stub-version=ifs-v1"
3072 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3073 const Arg *SavedAction =
nullptr;
3074 for (
const Arg *AA :
3075 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3076 if (AA->getOption().matches(OPT_main_file_name)) {
3077 SavedAction =
nullptr;
3078 }
else if (!SavedAction) {
3081 if (!A->getOption().matches(OPT_ast_dump_EQ))
3082 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3083 << SavedAction->getSpelling() << A->getSpelling();
3090 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3091 Opts.
Plugins.emplace_back(A->getValue(0));
3095 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3096 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3098 for (
const std::string &Arg :
3099 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3100 std::string BlockName;
3101 unsigned MajorVersion;
3102 unsigned MinorVersion;
3104 std::string UserInfo;
3106 MinorVersion, Hashed, UserInfo)) {
3107 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3114 std::make_shared<TestModuleFileExtension>(
3115 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3118 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3122 Diags.
Report(diag::err_drv_invalid_value)
3123 << A->getAsString(Args) << A->getValue();
3124 Diags.
Report(diag::note_command_line_code_loc_requirement);
3128 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3129 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3130 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3132 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3133 StringRef Val = A->getValue();
3134 if (!Val.contains(
'='))
3139 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3141 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3145 if (Args.hasArg(OPT_clangir_disable_passes))
3148 if (Args.hasArg(OPT_clangir_disable_verifier))
3152 if (Args.hasArg(OPT_aux_target_cpu))
3153 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3154 if (Args.hasArg(OPT_aux_target_feature))
3158 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3159 StringRef XValue = A->getValue();
3164 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3165 bool ModuleMap = XValue.consume_back(
"-module-map");
3168 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3174 if (IsHeader || Preprocessed) {
3175 if (XValue.consume_back(
"-header-unit"))
3177 else if (XValue.consume_back(
"-system"))
3179 else if (XValue.consume_back(
"-user"))
3185 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3189 DashX = llvm::StringSwitch<InputKind>(XValue)
3205 DashX = llvm::StringSwitch<InputKind>(XValue)
3213 DashX = llvm::StringSwitch<InputKind>(XValue)
3216 .Cases({
"ast",
"pcm",
"precompiled-header"},
3223 Diags.
Report(diag::err_drv_invalid_value)
3224 << A->getAsString(Args) << A->getValue();
3231 IsHeaderFile =
true;
3232 }
else if (IsHeaderFile)
3239 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3242 Inputs.push_back(
"-");
3246 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3248 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3252 StringRef(Inputs[i]).rsplit(
'.').second);
3261 bool IsSystem =
false;
3270 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3280 std::string ClangExecutable =
3281 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
3288#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3289 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3290#include "clang/Options/Options.inc"
3291#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3300 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3307 std::optional<bool> IsFramework,
3308 std::optional<bool> IgnoreSysRoot) {
3309 return llvm::is_contained(Groups, Entry.
Group) &&
3310 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3311 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3320 OptSpecifier Opt = [It, Matches]() {
3325 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3339 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3346 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3352 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3357 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3365 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3367 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3377 ? OPT_internal_isystem
3378 : OPT_internal_externc_isystem;
3382 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3384 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3388 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3389 : OPT_no_system_header_prefix;
3403#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3404 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3405#include "clang/Options/Options.inc"
3406#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3408 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3409 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3412 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3413 StringRef Val = A->getValue();
3414 if (Val.contains(
'=')) {
3415 auto Split = Val.split(
'=');
3417 std::string(Split.first), std::string(Split.second));
3420 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3423 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3424 StringRef MacroDef = A->getValue();
3426 llvm::CachedHashString(MacroDef.split(
'=').first));
3430 bool IsSysrootSpecified =
3431 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3435 auto PrefixHeaderPath = [IsSysrootSpecified,
3436 &Opts](
const llvm::opt::Arg *A,
3437 bool IsFramework =
false) -> std::string {
3438 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3439 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3441 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3442 llvm::StringRef(A->getValue()).substr(1));
3443 return std::string(Buffer);
3445 return A->getValue();
3448 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3449 bool IsFramework = A->getOption().matches(OPT_F);
3455 StringRef Prefix =
"";
3456 for (
const auto *A :
3457 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3458 if (A->getOption().matches(OPT_iprefix))
3459 Prefix = A->getValue();
3460 else if (A->getOption().matches(OPT_iwithprefix))
3466 for (
const auto *A : Args.filtered(OPT_idirafter))
3468 for (
const auto *A : Args.filtered(OPT_iquote))
3471 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3472 if (A->getOption().matches(OPT_iwithsysroot)) {
3479 for (
const auto *A : Args.filtered(OPT_iframework))
3481 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3486 for (
const auto *A : Args.filtered(OPT_c_isystem))
3488 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3490 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3492 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3496 for (
const auto *A :
3497 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3499 if (A->getOption().matches(OPT_internal_externc_isystem))
3501 Opts.
AddPath(A->getValue(), Group,
false,
true);
3503 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3507 for (
const auto *A :
3508 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3510 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3512 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3521 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3525 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3530 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3532 diags.
Report(diag::err_drv_invalid_value)
3533 << A->getAsString(Args) << A->getValue();
3535 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3541 if (Opts.PointerAuthIntrinsics)
3543 if (Opts.PointerAuthCalls)
3545 if (Opts.PointerAuthReturns)
3547 if (Opts.PointerAuthIndirectGotos)
3548 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3549 if (Opts.PointerAuthAuthTraps)
3551 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3552 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3553 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3554 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3555 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3556 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3557 if (Opts.PointerAuthFunctionTypeDiscrimination)
3558 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3559 if (Opts.PointerAuthInitFini)
3561 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3562 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3563 if (Opts.PointerAuthELFGOT)
3565 if (Opts.AArch64JumpTableHardening)
3566 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3567 if (Opts.PointerAuthObjcIsa)
3569 if (Opts.PointerAuthObjcInterfaceSel)
3570 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3571 if (Opts.PointerAuthObjcClassROPointers)
3572 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3573 if (Opts.PointerAuthBlockDescriptorPointers)
3574 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3579 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3580 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3581 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3582 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3583 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3584 Opts.PointerAuthVTPtrAddressDiscrimination =
3585 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3586 Opts.PointerAuthVTPtrTypeDiscrimination =
3587 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3588 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3589 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3590 Opts.PointerAuthFunctionTypeDiscrimination =
3591 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3592 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3593 Opts.PointerAuthInitFiniAddressDiscrimination =
3594 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3595 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3596 Opts.AArch64JumpTableHardening =
3597 Args.hasArg(OPT_faarch64_jump_table_hardening);
3598 Opts.PointerAuthBlockDescriptorPointers =
3599 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3600 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3601 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3602 Opts.PointerAuthObjcInterfaceSel =
3603 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3605 if (Opts.PointerAuthObjcInterfaceSel)
3606 Opts.PointerAuthObjcInterfaceSelKey =
3617 llvm_unreachable(
"should not parse language flags for this input");
3652 llvm_unreachable(
"unexpected input language");
3661 return "Objective-C";
3665 return "Objective-C++";
3669 return "C++ for OpenCL";
3688 llvm_unreachable(
"unknown input language");
3691void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3693 const llvm::Triple &
T,
3698 if (Opts.ObjCAutoRefCount)
3700 if (Opts.PICLevel != 0)
3701 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3705 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3710 OptSpecifier StdOpt;
3712 case LangStandard::lang_opencl10:
3713 case LangStandard::lang_opencl11:
3714 case LangStandard::lang_opencl12:
3715 case LangStandard::lang_opencl20:
3716 case LangStandard::lang_opencl30:
3717 case LangStandard::lang_openclcpp10:
3718 case LangStandard::lang_openclcpp2021:
3719 StdOpt = OPT_cl_std_EQ;
3722 StdOpt = OPT_std_EQ;
3727 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3729 if (Opts.IncludeDefaultHeader)
3730 GenerateArg(Consumer, OPT_finclude_default_header);
3731 if (Opts.DeclareOpenCLBuiltins)
3732 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3734 const LangOptions *
LangOpts = &Opts;
3736#define LANG_OPTION_WITH_MARSHALLING(...) \
3737 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3738#include "clang/Options/Options.inc"
3739#undef LANG_OPTION_WITH_MARSHALLING
3750 else if (Opts.ObjCAutoRefCount == 1)
3753 if (Opts.ObjCWeakRuntime)
3754 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3759 if (Opts.ObjCSubscriptingLegacyRuntime)
3760 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3763 if (Opts.GNUCVersion != 0) {
3764 unsigned Major = Opts.GNUCVersion / 100 / 100;
3765 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3766 unsigned Patch = Opts.GNUCVersion % 100;
3768 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3771 if (Opts.IgnoreXCOFFVisibility)
3772 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3780 if (Opts.PointerOverflowDefined)
3783 if (Opts.MSCompatibilityVersion != 0) {
3784 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3785 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3786 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3787 GenerateArg(Consumer, OPT_fms_compatibility_version,
3788 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3791 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3793 if (!Opts.Trigraphs)
3800 if (
T.isOSzOS() && !Opts.ZOSExt)
3802 else if (Opts.ZOSExt)
3805 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3808 if (Opts.ConvergentFunctions)
3811 GenerateArg(Consumer, OPT_fno_convergent_functions);
3813 if (Opts.NoBuiltin && !Opts.Freestanding)
3816 if (!Opts.NoBuiltin)
3820 if (Opts.LongDoubleSize == 128)
3822 else if (Opts.LongDoubleSize == 64)
3824 else if (Opts.LongDoubleSize == 80)
3831 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3834 if (Opts.OpenMP != 51)
3835 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3837 if (!Opts.OpenMPUseTLS)
3840 if (Opts.OpenMPIsTargetDevice)
3841 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3843 if (Opts.OpenMPIRBuilder)
3844 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3847 if (Opts.OpenMPSimd) {
3850 if (Opts.OpenMP != 51)
3851 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3854 if (Opts.OpenMPThreadSubscription)
3855 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3857 if (Opts.OpenMPTeamSubscription)
3858 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3860 if (Opts.OpenMPTargetDebug != 0)
3861 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3862 Twine(Opts.OpenMPTargetDebug));
3864 if (Opts.OpenMPCUDANumSMs != 0)
3865 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3866 Twine(Opts.OpenMPCUDANumSMs));
3868 if (Opts.OpenMPCUDABlocksPerSM != 0)
3869 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3870 Twine(Opts.OpenMPCUDABlocksPerSM));
3872 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3873 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3874 Twine(Opts.OpenMPCUDAReductionBufNum));
3877 std::string Targets;
3878 llvm::raw_string_ostream
OS(Targets);
3881 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3882 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3885 if (Opts.OpenMPCUDAMode)
3901 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3904 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3908 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3910 switch (Opts.getClangABICompat()) {
3911#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3912 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3913 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3915#define ABI_VER_MAJOR(Major) \
3916 case LangOptions::ClangABI::Ver##Major: \
3917 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3919#define ABI_VER_LATEST(Latest) \
3920 case LangOptions::ClangABI::Latest: \
3922#include "clang/Basic/ABIVersions.def"
3925 if (Opts.getSignReturnAddressScope() ==
3927 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3928 else if (Opts.getSignReturnAddressScope() ==
3930 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3932 if (Opts.getSignReturnAddressKey() ==
3934 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3940 if (Opts.RelativeCXXABIVTables)
3941 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3943 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3951 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3963 case llvm::AllocTokenMode::Increment:
3966 case llvm::AllocTokenMode::Random:
3969 case llvm::AllocTokenMode::TypeHash:
3972 case llvm::AllocTokenMode::TypeHashPointerSplit:
3973 S =
"typehashpointersplit";
3976 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
3980bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3982 std::vector<std::string> &Includes,
3992 if (Args.hasArg(OPT_fobjc_arc))
3993 Opts.ObjCAutoRefCount = 1;
3997 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4009 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4012 Diags.
Report(diag::err_drv_invalid_value)
4013 << A->getAsString(Args) << A->getValue();
4015 for (
unsigned KindValue = 0;
4021 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4023 unsigned NumAliases = 0;
4024#define LANGSTANDARD(id, name, lang, desc, features, version)
4025#define LANGSTANDARD_ALIAS(id, alias) \
4026 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4027#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4028#include "clang/Basic/LangStandards.def"
4030#define LANGSTANDARD(id, name, lang, desc, features, version)
4031#define LANGSTANDARD_ALIAS(id, alias) \
4032 if (KindValue == LangStandard::lang_##id) Diag << alias;
4033#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4034#include "clang/Basic/LangStandards.def"
4042 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4050 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4052 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4053 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4054 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4055 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4056 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4057 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4058 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4059 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4060 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4061 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4065 Diags.
Report(diag::err_drv_invalid_value)
4066 << A->getAsString(Args) << A->getValue();
4069 LangStd = OpenCLLangStd;
4073 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4074 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4082#define LANG_OPTION_WITH_MARSHALLING(...) \
4083 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4084#include "clang/Options/Options.inc"
4085#undef LANG_OPTION_WITH_MARSHALLING
4087 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4088 StringRef Name = A->getValue();
4089 if (Name ==
"full") {
4090 Opts.CFProtectionBranch = 1;
4091 Opts.CFProtectionReturn = 1;
4092 }
else if (Name ==
"branch") {
4093 Opts.CFProtectionBranch = 1;
4094 }
else if (Name ==
"return") {
4095 Opts.CFProtectionReturn = 1;
4099 if (Opts.CFProtectionBranch) {
4100 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4102 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4103#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4104 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4105#include "clang/Basic/CFProtectionOptions.def"
4107 Opts.setCFBranchLabelScheme(Scheme);
4111 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4112 !Args.hasArg(OPT_sycl_std_EQ)) {
4122 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4123 StringRef value =
arg->getValue();
4125 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4128 if (Args.hasArg(OPT_fobjc_gc_only))
4130 else if (Args.hasArg(OPT_fobjc_gc))
4132 else if (Args.hasArg(OPT_fobjc_arc)) {
4133 Opts.ObjCAutoRefCount = 1;
4135 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4142 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4143 Opts.ObjCWeakRuntime = 1;
4149 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4150 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4151 assert(!Opts.ObjCWeak);
4153 Diags.
Report(diag::err_objc_weak_with_gc);
4154 }
else if (!Opts.ObjCWeakRuntime) {
4155 Diags.
Report(diag::err_objc_weak_unsupported);
4159 }
else if (Opts.ObjCAutoRefCount) {
4160 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4163 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4164 Opts.ObjCSubscriptingLegacyRuntime =
4168 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4171 VersionTuple GNUCVer;
4172 bool Invalid = GNUCVer.tryParse(A->getValue());
4173 unsigned Major = GNUCVer.getMajor();
4174 unsigned Minor = GNUCVer.getMinor().value_or(0);
4175 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4176 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4177 Diags.
Report(diag::err_drv_invalid_value)
4178 << A->getAsString(Args) << A->getValue();
4180 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4183 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4184 Opts.IgnoreXCOFFVisibility = 1;
4186 if (Args.hasArg(OPT_ftrapv)) {
4190 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4192 else if (Args.hasArg(OPT_fwrapv))
4194 if (Args.hasArg(OPT_fwrapv_pointer))
4195 Opts.PointerOverflowDefined =
true;
4197 Opts.MSCompatibilityVersion = 0;
4198 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4200 if (VT.tryParse(A->getValue()))
4201 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4203 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4204 VT.getMinor().value_or(0) * 100000 +
4205 VT.getSubminor().value_or(0);
4213 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4216 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4219 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4221 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4222 && Opts.OpenCLVersion == 200);
4224 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4225 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4226 Opts.ConvergentFunctions =
4227 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4228 HasConvergentOperations);
4230 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4231 if (!Opts.NoBuiltin)
4233 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4234 if (A->getOption().matches(options::OPT_mlong_double_64))
4235 Opts.LongDoubleSize = 64;
4236 else if (A->getOption().matches(options::OPT_mlong_double_80))
4237 Opts.LongDoubleSize = 80;
4238 else if (A->getOption().matches(options::OPT_mlong_double_128))
4239 Opts.LongDoubleSize = 128;
4241 Opts.LongDoubleSize = 0;
4243 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4249 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4251 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4252 << A->getSpelling() <<
"-fdefault-calling-conv";
4254 switch (
T.getArch()) {
4255 case llvm::Triple::x86:
4258 case llvm::Triple::m68k:
4262 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4263 << A->getSpelling() <<
T.getTriple();
4269 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4271 bool IsSimdSpecified =
4272 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4274 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4276 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4277 Opts.OpenMPIsTargetDevice =
4278 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4279 Opts.OpenMPIRBuilder =
4280 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4281 bool IsTargetSpecified =
4282 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4284 if (Opts.OpenMP || Opts.OpenMPSimd) {
4286 Args, OPT_fopenmp_version_EQ,
4287 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4288 Opts.OpenMP = Version;
4291 if (!Opts.OpenMPIsTargetDevice) {
4292 switch (
T.getArch()) {
4296 case llvm::Triple::nvptx:
4297 case llvm::Triple::nvptx64:
4298 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4306 if ((Opts.OpenMPIsTargetDevice && (
T.isNVPTX() ||
T.isAMDGCN())) ||
4307 Opts.OpenCLCPlusPlus) {
4309 Opts.Exceptions = 0;
4310 Opts.CXXExceptions = 0;
4312 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4313 Opts.OpenMPCUDANumSMs =
4315 Opts.OpenMPCUDANumSMs, Diags);
4316 Opts.OpenMPCUDABlocksPerSM =
4318 Opts.OpenMPCUDABlocksPerSM, Diags);
4320 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4321 Opts.OpenMPCUDAReductionBufNum, Diags);
4326 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4327 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4329 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4330 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4331 Opts.OpenMPTargetDebug = 1;
4334 if (Opts.OpenMPIsTargetDevice) {
4335 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4336 Opts.OpenMPTeamSubscription =
true;
4337 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4338 Opts.OpenMPThreadSubscription =
true;
4342 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4343 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4344 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4345 if (
T.isArch16Bit())
4347 if (
T.isArch32Bit())
4349 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4353 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4354 llvm::Triple TT(A->getValue(i));
4356 if (TT.getArch() == llvm::Triple::UnknownArch ||
4357 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4358 TT.getArch() == llvm::Triple::spirv64 ||
4359 TT.getArch() == llvm::Triple::systemz ||
4360 TT.getArch() == llvm::Triple::loongarch64 ||
4361 TT.getArch() == llvm::Triple::nvptx ||
4362 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4363 TT.getArch() == llvm::Triple::x86 ||
4364 TT.getArch() == llvm::Triple::x86_64))
4365 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4366 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4367 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4368 << A->getValue(i) <<
T.str();
4375 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4376 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4377 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4380 if (Args.hasArg(options::OPT_fopenacc))
4381 Opts.OpenACC =
true;
4383 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4384 StringRef Val = A->getValue();
4387 else if (Val ==
"on")
4389 else if (Val ==
"off")
4391 else if (Val ==
"fast-honor-pragmas")
4394 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4398 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4399 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4401 llvm::StringSwitch<unsigned>(A->getValue(i))
4404 .Case(
"add-unsigned-overflow-test",
4406 .Case(
"add-signed-overflow-test",
4409 .Case(
"unsigned-post-decr-while",
4418 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4419 std::vector<std::string> systemIgnorelists =
4420 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4422 systemIgnorelists.begin(),
4423 systemIgnorelists.end());
4425 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4426 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4428 StringRef Ver = A->getValue();
4429 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4430 int Major, Minor = 0;
4434 if (!VerParts.first.starts_with(
"0") &&
4435 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4436 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4438 ? VerParts.second.size() == 1 &&
4439 !VerParts.second.getAsInteger(10, Minor)
4440 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4442#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4443 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4444 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4446#define ABI_VER_MAJOR(Major_) \
4447 if (Major <= Major_) \
4448 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4450#define ABI_VER_LATEST(Latest) \
4453#include "clang/Basic/ABIVersions.def"
4454 }
else if (Ver !=
"latest") {
4455 Diags.
Report(diag::err_drv_invalid_value)
4456 << A->getAsString(Args) << A->getValue();
4460 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4461 StringRef SignScope = A->getValue();
4463 if (SignScope.equals_insensitive(
"none"))
4464 Opts.setSignReturnAddressScope(
4466 else if (SignScope.equals_insensitive(
"all"))
4467 Opts.setSignReturnAddressScope(
4469 else if (SignScope.equals_insensitive(
"non-leaf"))
4470 Opts.setSignReturnAddressScope(
4473 Diags.
Report(diag::err_drv_invalid_value)
4474 << A->getAsString(Args) << SignScope;
4476 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4477 StringRef SignKey = A->getValue();
4478 if (!SignScope.empty() && !SignKey.empty()) {
4479 if (SignKey ==
"a_key")
4480 Opts.setSignReturnAddressKey(
4482 else if (SignKey ==
"b_key")
4483 Opts.setSignReturnAddressKey(
4486 Diags.
Report(diag::err_drv_invalid_value)
4487 << A->getAsString(Args) << SignKey;
4493 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4500 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4506 Opts.RelativeCXXABIVTables =
4507 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4508 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4512 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4513 Opts.OmitVTableRTTI =
4514 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4515 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4516 if (Opts.OmitVTableRTTI && HasRTTI)
4517 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4519 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4520 auto Split = StringRef(A).split(
'=');
4522 {std::string(
Split.first), std::string(
Split.second)});
4526 !Args.getLastArg(OPT_fno_file_reproducible) &&
4527 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4528 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4529 Args.getLastArg(OPT_ffile_reproducible));
4532 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4534 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4535 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4537 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4539 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4540 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4543 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4544 std::ifstream SeedFile(A->getValue(0));
4546 if (!SeedFile.is_open())
4547 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4553 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4556 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4557 StringRef S = Arg->getValue();
4559 if (S.getAsInteger(0,
Value))
4560 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4565 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4566 StringRef S = Arg->getValue();
4567 if (
auto Mode = getAllocTokenModeFromString(S))
4570 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4577 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4579 enum {
OS, Environment };
4581 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4583 if (
T.getOSName().empty()) {
4584 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4585 << ExpectedOS <<
OS <<
T.str();
4586 }
else if (
T.getEnvironmentName().empty()) {
4587 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4589 }
else if (!
T.isShaderStageEnvironment()) {
4590 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4595 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4596 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4597 << ShaderModel <<
T.getOSName() <<
T.str();
4602 if (Args.getLastArg(OPT_fnative_half_type) ||
4603 Args.getLastArg(OPT_fnative_int16_type)) {
4604 const LangStandard &Std =
4606 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4607 T.getOSVersion() >= VersionTuple(6, 2)))
4608 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4609 <<
"-enable-16bit-types" <<
true << Std.
getName()
4610 <<
T.getOSVersion().getAsString();
4612 }
else if (
T.isSPIRVLogical()) {
4613 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4614 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4615 << VulkanEnv <<
T.getOSName() <<
T.str();
4617 if (Args.getLastArg(OPT_fnative_half_type) ||
4618 Args.getLastArg(OPT_fnative_int16_type)) {
4619 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4620 ?
"-fnative-half-type"
4621 :
"-fnative-int16-type";
4622 const LangStandard &Std =
4624 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4625 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4626 << Str <<
false << Std.
getName();
4629 llvm_unreachable(
"expected DXIL or SPIR-V target");
4632 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4634 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4635 const LangStandard &Requested =
4637 const LangStandard &Recommended =
4639 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4690 llvm_unreachable(
"invalid frontend action");
4735 llvm_unreachable(
"invalid frontend action");
4745#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4746 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4747#include "clang/Options/Options.inc"
4748#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4751 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4754 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4761 for (
const auto &M : Opts.
Macros) {
4764 if (M.first ==
"__CET__=1" && !M.second &&
4765 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4767 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4768 !CodeGenOpts.CFProtectionBranch)
4770 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4771 CodeGenOpts.CFProtectionBranch)
4774 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4777 for (
const auto &I : Opts.
Includes) {
4780 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4781 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4786 if (LangOpts.HLSL && I ==
"hlsl.h")
4796 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4802 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4805 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4819#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4820 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4821#include "clang/Options/Options.inc"
4822#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4824 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4825 Args.hasArg(OPT_pch_through_hdrstop_use);
4827 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4830 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4831 StringRef
Value(A->getValue());
4832 size_t Comma =
Value.find(
',');
4834 unsigned EndOfLine = 0;
4836 if (Comma == StringRef::npos ||
4837 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4838 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4839 Diags.
Report(diag::err_drv_preamble_format);
4847 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4848 if (A->getOption().matches(OPT_D))
4855 for (
const auto *A : Args.filtered(OPT_include))
4856 Opts.
Includes.emplace_back(A->getValue());
4858 for (
const auto *A : Args.filtered(OPT_chain_include))
4861 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4862 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4864 if (Split.second.empty()) {
4865 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4872 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4873 StringRef Epoch = A->getValue();
4877 const uint64_t MaxTimestamp =
4878 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4880 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4881 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4882 << Epoch << MaxTimestamp;
4888 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4889 StringRef Val = A->getValue();
4900 Args.hasFlag(OPT_fdefine_target_os_macros,
4912#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4913 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4914#include "clang/Options/Options.inc"
4915#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4933#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4934 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4935#include "clang/Options/Options.inc"
4936#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4939 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4948#define TARGET_OPTION_WITH_MARSHALLING(...) \
4949 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4950#include "clang/Options/Options.inc"
4951#undef TARGET_OPTION_WITH_MARSHALLING
4957 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
4967#define TARGET_OPTION_WITH_MARSHALLING(...) \
4968 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4969#include "clang/Options/Options.inc"
4970#undef TARGET_OPTION_WITH_MARSHALLING
4972 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
4973 llvm::VersionTuple Version;
4974 if (Version.tryParse(A->getValue()))
4975 Diags.
Report(diag::err_drv_invalid_value)
4976 << A->getAsString(Args) << A->getValue();
4981 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
4982 llvm::VersionTuple Version;
4983 if (Version.tryParse(A->getValue()))
4984 Diags.
Report(diag::err_drv_invalid_value)
4985 << A->getAsString(Args) << A->getValue();
4993bool CompilerInvocation::CreateFromArgsImpl(
5001 unsigned MissingArgIndex, MissingArgCount;
5002 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5003 MissingArgCount, VisibilityMask);
5007 if (MissingArgCount)
5008 Diags.
Report(diag::err_drv_missing_argument)
5009 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5012 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5013 auto ArgString = A->getAsString(Args);
5014 std::string Nearest;
5015 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5016 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5018 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5019 << ArgString << Nearest;
5052 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5066 Diags.
Report(diag::warn_drv_openacc_without_cir);
5079 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5080 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5081 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5082 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5095 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5101 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5112 llvm::driver::ProfileInstrKind::ProfileNone)
5113 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5123 const char *Argv0) {
5129 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5133 Args.push_back(
"-cc1");
5136 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5141 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5156#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5157 if constexpr (CK::Compatibility != CK::Benign) \
5158 HBuilder.add(LangOpts->Name);
5159#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5160 if constexpr (CK::Compatibility != CK::Benign) \
5161 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5162#include "clang/Basic/LangOptions.def"
5167 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5184 StringRef MacroDef =
Macro.first;
5186 llvm::CachedHashString(MacroDef.split(
'=').first)))
5190 HBuilder.add(
Macro);
5206#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5207#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5208 HBuilder.add(diagOpts.get##Name());
5209#include "clang/Basic/DiagnosticOptions.def"
5219 ext->hashExtension(HBuilder);
5226 HBuilder.add(*Minor);
5227 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5228 HBuilder.add(*Subminor);
5230 HBuilder.add(*Build);
5236#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5237 if constexpr (CK::Compatibility != CK::Benign) \
5238 HBuilder.add(CodeGenOpts->Name);
5239#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5240 if constexpr (CK::Compatibility != CK::Benign) \
5241 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5242#define DEBUGOPT(Name, Bits, Default, Compatibility)
5243#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5244#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5245#include "clang/Basic/CodeGenOptions.def"
5257#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5258 if constexpr (CK::Compatibility != CK::Benign) \
5259 HBuilder.add(CodeGenOpts->Name);
5260#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5261 if constexpr (CK::Compatibility != CK::Benign) \
5262 HBuilder.add(CodeGenOpts->Name);
5263#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5264 if constexpr (CK::Compatibility != CK::Benign) \
5265 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5266#include "clang/Basic/DebugOptions.def"
5273 if (!SanHash.
empty())
5274 HBuilder.add(SanHash.
Mask);
5276 llvm::MD5::MD5Result
Result;
5277 HBuilder.getHasher().final(
Result);
5279 return toString(llvm::APInt(64, Hash), 36,
false);
5283 llvm::function_ref<
bool(std::string &)> Predicate) {
5284#define RETURN_IF(PATH) \
5286 if (Predicate(PATH)) \
5290#define RETURN_IF_MANY(PATHS) \
5292 if (llvm::any_of(PATHS, Predicate)) \
5296 auto &HeaderSearchOpts = *this->
HSOpts;
5299 for (
auto &Entry : HeaderSearchOpts.UserEntries)
5300 if (Entry.IgnoreSysRoot)
5302 RETURN_IF(HeaderSearchOpts.ResourceDir);
5303 RETURN_IF(HeaderSearchOpts.ModuleCachePath);
5304 RETURN_IF(HeaderSearchOpts.ModuleUserBuildPath);
5305 for (
auto &[Name,
File] : HeaderSearchOpts.PrebuiltModuleFiles)
5319 if (Input.isBuffer())
5334 auto &FileSystemOpts = *this->
FSOpts;
5356 llvm::function_ref<
bool(StringRef)> Callback)
const {
5360 [&Callback](std::string &Path) {
return Callback(StringRef(Path)); });
5388 std::vector<std::string> Args{
"-cc1"};
5390 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5416 llvm::vfs::getRealFileSystem());
5424 Diags, std::move(BaseFS));
5430 if (VFSOverlayFiles.empty())
5435 for (
const auto &
File : VFSOverlayFiles) {
5436 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5439 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5444 std::move(Buffer.get()),
nullptr,
File,
5447 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 std::string GetResourcesPath(const char *Argv0, void *MainAddr)
Get the directory where the compiler headers reside, relative to the compiler binary (found by the pa...
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.
Action - Represent an abstract compilation step to perform.
static std::string GetResourcesPath(StringRef BinaryPath)
Takes the path to a binary that's either in bin/ or lib/ and returns the path to clang's resource dir...
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)
unsigned getOptimizationLevel(llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
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.
unsigned getOptimizationLevelSize(llvm::opt::ArgList &Args)
@ 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.
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.
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)