29#include "clang/Config/config.h"
43#include "llvm/ADT/APInt.h"
44#include "llvm/ADT/ArrayRef.h"
45#include "llvm/ADT/CachedHashString.h"
46#include "llvm/ADT/FloatingPointMode.h"
47#include "llvm/ADT/STLExtras.h"
48#include "llvm/ADT/SmallVector.h"
49#include "llvm/ADT/StringRef.h"
50#include "llvm/ADT/StringSwitch.h"
51#include "llvm/ADT/Twine.h"
52#include "llvm/Config/llvm-config.h"
53#include "llvm/Frontend/Debug/Options.h"
54#include "llvm/IR/DebugInfoMetadata.h"
55#include "llvm/Linker/Linker.h"
56#include "llvm/MC/MCTargetOptions.h"
57#include "llvm/Option/Arg.h"
58#include "llvm/Option/ArgList.h"
59#include "llvm/Option/OptSpecifier.h"
60#include "llvm/Option/OptTable.h"
61#include "llvm/Option/Option.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/Remarks/HotnessThresholdParser.h"
64#include "llvm/Support/CodeGen.h"
65#include "llvm/Support/Compiler.h"
66#include "llvm/Support/Error.h"
67#include "llvm/Support/ErrorHandling.h"
68#include "llvm/Support/ErrorOr.h"
69#include "llvm/Support/FileSystem.h"
70#include "llvm/Support/HashBuilder.h"
71#include "llvm/Support/MathExtras.h"
72#include "llvm/Support/MemoryBuffer.h"
73#include "llvm/Support/Path.h"
74#include "llvm/Support/Process.h"
75#include "llvm/Support/Regex.h"
76#include "llvm/Support/VersionTuple.h"
77#include "llvm/Support/VirtualFileSystem.h"
78#include "llvm/Support/raw_ostream.h"
79#include "llvm/Target/TargetOptions.h"
80#include "llvm/TargetParser/Host.h"
81#include "llvm/TargetParser/Triple.h"
109 if (Arg.getAsInteger(10, Val))
110 return llvm::createStringError(llvm::inconvertibleErrorCode(),
111 "Not an integer: %s", Arg.data());
120 return std::make_shared<T>(
X);
191 if (Storage.use_count() > 1)
192 Storage = std::make_shared<T>(*Storage);
255#define OPTTABLE_STR_TABLE_CODE
256#include "clang/Options/Options.inc"
257#undef OPTTABLE_STR_TABLE_CODE
260 return OptionStrTable[Offset];
263#define SIMPLE_ENUM_VALUE_TABLE
264#include "clang/Options/Options.inc"
265#undef SIMPLE_ENUM_VALUE_TABLE
271 if (Args.hasArg(Opt))
280 if (Args.hasArg(Opt))
290 unsigned SpellingOffset, Option::OptionClass,
295 const Twine &Spelling, Option::OptionClass,
301 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
305 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
307 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
309 if (Args.hasArg(Opt))
316 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
322 OptSpecifier OtherOpt) {
323 return [
Value, OtherValue,
324 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
326 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
327 return A->getOption().matches(Opt) ?
Value : OtherValue;
335 Option::OptionClass,
unsigned,
bool KeyPath) {
336 if (KeyPath ==
Value)
342 const Twine &Spelling,
343 Option::OptionClass OptClass,
unsigned,
344 const Twine &
Value) {
346 case Option::SeparateClass:
347 case Option::JoinedOrSeparateClass:
348 case Option::JoinedAndSeparateClass:
352 case Option::JoinedClass:
353 case Option::CommaJoinedClass:
354 Consumer(Spelling +
Value);
357 llvm_unreachable(
"Cannot denormalize an option with option class "
358 "incompatible with string denormalization.");
365 Option::OptionClass OptClass,
unsigned TableIndex, T
Value) {
367 TableIndex, Twine(
Value));
372 Option::OptionClass OptClass,
unsigned TableIndex,
377static std::optional<SimpleEnumValue>
379 for (
int I = 0, E = Table.Size; I != E; ++I)
380 if (Name == Table.Table[I].Name)
381 return Table.Table[I];
386static std::optional<SimpleEnumValue>
388 for (
int I = 0, E = Table.Size; I != E; ++I)
390 return Table.Table[I];
399 assert(TableIndex < SimpleEnumValueTablesSize);
400 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
402 auto *Arg = Args.getLastArg(Opt);
406 StringRef ArgValue = Arg->getValue();
408 return MaybeEnumVal->Value;
410 Diags.
Report(diag::err_drv_invalid_value)
411 << Arg->getAsString(Args) << ArgValue;
416 unsigned SpellingOffset,
417 Option::OptionClass OptClass,
418 unsigned TableIndex,
unsigned Value) {
419 assert(TableIndex < SimpleEnumValueTablesSize);
420 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
423 TableIndex, MaybeEnumVal->Name);
425 llvm_unreachable(
"The simple enum value was not correctly defined in "
426 "the tablegen option description");
432 unsigned SpellingOffset,
433 Option::OptionClass OptClass,
434 unsigned TableIndex, T
Value) {
436 TableIndex,
static_cast<unsigned>(
Value));
443 auto *Arg = Args.getLastArg(Opt);
446 return std::string(Arg->getValue());
449template <
typename IntTy>
453 auto *Arg = Args.getLastArg(Opt);
457 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
458 Diags.
Report(diag::err_drv_invalid_int_value)
459 << Arg->getAsString(Args) << Arg->getValue();
465static std::optional<std::vector<std::string>>
468 return Args.getAllArgValues(Opt);
472 unsigned SpellingOffset,
473 Option::OptionClass OptClass,
475 const std::vector<std::string> &Values) {
477 case Option::CommaJoinedClass: {
478 std::string CommaJoinedValue;
479 if (!Values.empty()) {
480 CommaJoinedValue.append(Values.front());
481 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
482 CommaJoinedValue.append(
",");
483 CommaJoinedValue.append(
Value);
487 Option::OptionClass::JoinedClass, TableIndex,
491 case Option::JoinedClass:
492 case Option::SeparateClass:
493 case Option::JoinedOrSeparateClass:
494 for (
const std::string &
Value : Values)
498 llvm_unreachable(
"Cannot denormalize an option with option class "
499 "incompatible with string vector denormalization.");
507 auto *Arg = Args.getLastArg(Opt);
510 return llvm::Triple::normalize(Arg->getValue());
513template <
typename T,
typename U>
515 return static_cast<T
>(
Value);
518template <
typename T,
typename U>
520 return KeyPath |
Value;
527template <
typename T,
typename U, U Value>
532#define PARSE_OPTION_WITH_MARSHALLING( \
533 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
534 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
535 METAVAR, VALUES, SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
536 DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
537 MERGER, EXTRACTOR, TABLE_INDEX) \
538 if ((VISIBILITY) & options::CC1Option) { \
539 KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
541 KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
543 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
545 MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
550#define GENERATE_OPTION_WITH_MARSHALLING( \
551 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
552 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
553 SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
554 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
556 if ((VISIBILITY) & options::CC1Option) { \
557 [&](const auto &Extracted) { \
560 static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
561 : (DEFAULT_VALUE)))) \
562 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
563 TABLE_INDEX, Extracted); \
564 }(EXTRACTOR(KEYPATH)); \
578 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
579 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
580 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
581 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
584 CodeGenOpts.ClearASTBeforeBackend =
false;
586 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
587 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
590 llvm::Triple T(TargetOpts.
Triple);
591 llvm::Triple::ArchType
Arch = T.getArch();
596 if (CodeGenOpts.getExceptionHandling() !=
598 T.isWindowsMSVCEnvironment())
599 Diags.
Report(diag::err_fe_invalid_exception_model)
600 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) << T.str();
602 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
603 Diags.
Report(diag::warn_c_kext);
605 if (LangOpts.NewAlignOverride &&
606 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
607 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
608 Diags.
Report(diag::err_fe_invalid_alignment)
609 << A->getAsString(Args) << A->getValue();
610 LangOpts.NewAlignOverride = 0;
615 if (LangOpts.CPlusPlus11) {
616 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
617 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
618 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
619 <<
bool(LangOpts.RawStringLiterals);
623 LangOpts.RawStringLiterals =
true;
626 if (Args.hasArg(OPT_freflection) && !LangOpts.CPlusPlus26) {
627 Diags.
Report(diag::err_drv_reflection_requires_cxx26)
628 << Args.getLastArg(options::OPT_freflection)->getAsString(Args);
631 LangOpts.NamedLoops =
632 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
635 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
636 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
640 if ((LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) && !LangOpts.CPlusPlus)
641 Diags.
Report(diag::err_drv_argument_not_allowed_with)
644 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
645 Diags.
Report(diag::err_drv_argument_not_allowed_with)
648 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
649 Diags.
Report(diag::err_drv_argument_not_allowed_with)
652 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
653 Diags.
Report(diag::err_drv_argument_not_allowed_with)
656 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
657 Diags.
Report(diag::err_drv_argument_not_allowed_with)
660 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
661 Diags.
Report(diag::warn_ignored_hip_only_option)
662 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
664 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
665 Diags.
Report(diag::warn_ignored_hip_only_option)
666 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
672 if (!llvm::is_contained(Warnings,
"conversion"))
673 Warnings.insert(Warnings.begin(),
"conversion");
674 if (!llvm::is_contained(Warnings,
"vector-conversion"))
675 Warnings.insert(Warnings.begin(),
"vector-conversion");
676 if (!llvm::is_contained(Warnings,
"matrix-conversion"))
677 Warnings.insert(Warnings.begin(),
"matrix-conversion");
687 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
688 if (LangOpts.ApproxFunc)
689 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
690 if (LangOpts.AllowFPReassoc)
691 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
692 if (LangOpts.AllowRecip)
693 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
699 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
701 Diags.
Report(diag::warn_option_invalid_ocl_version)
703 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
705 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
706 auto DefaultCC = LangOpts.getDefaultCallingConv();
710 Arch != llvm::Triple::x86;
716 Diags.
Report(diag::err_drv_argument_not_allowed_with)
717 << A->getSpelling() << T.getTriple();
728 llvm::opt::OptSpecifier OptSpecifier) {
731 Option::OptionClass::FlagClass, 0);
735 llvm::opt::OptSpecifier OptSpecifier,
736 const Twine &
Value) {
774 bool CheckAgainstOriginalInvocation =
false,
775 bool ForceRoundTrip =
false) {
777 bool DoRoundTripDefault =
true;
779 bool DoRoundTripDefault =
false;
782 bool DoRoundTrip = DoRoundTripDefault;
783 if (ForceRoundTrip) {
786 for (
const auto *Arg : CommandLineArgs) {
787 if (Arg == StringRef(
"-round-trip-args"))
789 if (Arg == StringRef(
"-no-round-trip-args"))
797 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
802 llvm::raw_string_ostream OS(Buffer);
803 for (
const char *Arg : Args) {
804 llvm::sys::printArg(OS, Arg,
true);
817 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
824 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
830 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
831 Diags.
Report(diag::note_cc1_round_trip_original)
832 << SerializeArgs(CommandLineArgs);
837 llvm::BumpPtrAllocator Alloc;
838 llvm::StringSaver StringPool(Alloc);
839 auto SA = [&StringPool](
const Twine &Arg) {
840 return StringPool.save(Arg).data();
847 Generate(DummyInvocation, GeneratedArgs, SA);
853 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
858 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
859 Diags.
Report(diag::note_cc1_round_trip_generated)
860 << 1 << SerializeArgs(GeneratedArgs);
865 if (CheckAgainstOriginalInvocation)
867 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
871 Generate(RealInvocation, ComparisonArgs, SA);
876 return llvm::equal(A, B, [](
const char *AElem,
const char *BElem) {
877 return StringRef(AElem) == StringRef(BElem);
884 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
885 Diags.
Report(diag::err_cc1_round_trip_mismatch);
886 Diags.
Report(diag::note_cc1_round_trip_generated)
887 << 1 << SerializeArgs(GeneratedArgs);
888 Diags.
Report(diag::note_cc1_round_trip_generated)
889 << 2 << SerializeArgs(ComparisonArgs);
893 Diags.
Report(diag::remark_cc1_round_trip_generated)
894 << 1 << SerializeArgs(GeneratedArgs);
895 Diags.
Report(diag::remark_cc1_round_trip_generated)
896 << 2 << SerializeArgs(ComparisonArgs);
908 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
912 Args.push_back(
"-cc1");
915 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
920 OptSpecifier GroupWithValue,
921 std::vector<std::string> &Diagnostics) {
922 for (
auto *A : Args.filtered(Group)) {
923 if (A->getOption().getKind() == Option::FlagClass) {
926 Diagnostics.push_back(
927 std::string(A->getOption().getName().drop_front(1)));
928 }
else if (A->getOption().matches(GroupWithValue)) {
931 Diagnostics.push_back(
932 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
935 Diagnostics.push_back(A->getValue());
946 std::vector<std::string> &Funcs) {
947 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
949 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
956#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
957 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
958#include "clang/Options/Options.inc"
959#undef ANALYZER_OPTION_WITH_MARSHALLING
963#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
965 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
967#include "clang/StaticAnalyzer/Core/Analyses.def"
969 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
975#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
977 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
979#include "clang/StaticAnalyzer/Core/Analyses.def"
981 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
987#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
989 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
991#include "clang/StaticAnalyzer/Core/Analyses.def"
993 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
999#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1001 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
1003#include "clang/StaticAnalyzer/Core/Analyses.def"
1005 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
1011 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1020 for (
const auto &
C : Opts.
Config)
1021 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1022 llvm::sort(SortedConfigOpts, llvm::less_first());
1024 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1027 auto Entry = ConfigOpts.
Config.find(Key);
1028 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1043#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1044 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1045#include "clang/Options/Options.inc"
1046#undef ANALYZER_OPTION_WITH_MARSHALLING
1048 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1049 StringRef Name = A->getValue();
1051#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1052 .Case(CMDFLAG, NAME##Model)
1053#include "clang/StaticAnalyzer/Core/Analyses.def"
1056 Diags.
Report(diag::err_drv_invalid_value)
1057 << A->getAsString(Args) << Name;
1060 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1061 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1068 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1069 StringRef Name = A->getValue();
1071#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1072 .Case(CMDFLAG, PD_##NAME)
1073#include "clang/StaticAnalyzer/Core/Analyses.def"
1076 Diags.
Report(diag::err_drv_invalid_value)
1077 << A->getAsString(Args) << Name;
1083 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1084 StringRef Name = A->getValue();
1086#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1087 .Case(CMDFLAG, NAME)
1088#include "clang/StaticAnalyzer/Core/Analyses.def"
1091 Diags.
Report(diag::err_drv_invalid_value)
1092 << A->getAsString(Args) << Name;
1098 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1099 StringRef Name = A->getValue();
1101#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1102 .Case(CMDFLAG, NAME)
1103#include "clang/StaticAnalyzer/Core/Analyses.def"
1106 Diags.
Report(diag::err_drv_invalid_value)
1107 << A->getAsString(Args) << Name;
1115 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1117 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1120 StringRef CheckerAndPackageList = A->getValue();
1122 CheckerAndPackageList.split(CheckersAndPackages,
",");
1123 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1129 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1133 StringRef configList = A->getValue();
1135 configList.split(configVals,
",");
1136 for (
const auto &configVal : configVals) {
1138 std::tie(key, val) = configVal.split(
"=");
1141 diag::err_analyzer_config_no_value) << configVal;
1144 if (val.contains(
'=')) {
1146 diag::err_analyzer_config_multiple_values)
1155 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1160 Opts.
Config[key] = std::string(val);
1170 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1173 os << Args.getArgString(i);
1180 StringRef OptionName, StringRef DefaultVal) {
1181 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1186 StringRef &OptionField, StringRef Name,
1187 StringRef DefaultVal) {
1196 bool &OptionField, StringRef Name,
bool DefaultVal) {
1197 auto PossiblyInvalidVal =
1198 llvm::StringSwitch<std::optional<bool>>(
1201 .Case(
"false",
false)
1202 .Default(std::nullopt);
1204 if (!PossiblyInvalidVal) {
1206 Diags->
Report(diag::err_analyzer_config_invalid_input)
1207 << Name <<
"a boolean";
1209 OptionField = DefaultVal;
1211 OptionField = *PossiblyInvalidVal;
1216 unsigned &OptionField, StringRef Name,
1217 unsigned DefaultVal) {
1219 OptionField = DefaultVal;
1220 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1221 .getAsInteger(0, OptionField);
1222 if (Diags && HasFailed)
1223 Diags->
Report(diag::err_analyzer_config_invalid_input)
1224 << Name <<
"an unsigned";
1230 unsigned DefaultVal) {
1233 if (Parsed.has_value()) {
1234 OptionField = Parsed.value();
1237 if (Diags && !Parsed.has_value())
1238 Diags->
Report(diag::err_analyzer_config_invalid_input)
1239 << Name <<
"a positive";
1241 OptionField = DefaultVal;
1249#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1250 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1251#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1252#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1254 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1255 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1257#define ANALYZER_OPTION(...)
1258#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1259 SHALLOW_VAL, DEEP_VAL) \
1260 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1261 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1262#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1269 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1270 std::vector<StringRef> Checkers =
1272 std::vector<StringRef> Packages =
1276 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1278 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1280 bool IsChecker = CheckerOrPackage.contains(
'.');
1281 bool IsValidName = IsChecker
1282 ? llvm::is_contained(Checkers, CheckerOrPackage)
1283 : llvm::is_contained(Packages, CheckerOrPackage);
1286 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1287 << CheckerOrPackage;
1297 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1298 Diags->
Report(diag::err_analyzer_config_invalid_input)
1299 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1307 if (
Remark.hasValidPattern()) {
1312 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1321 OptSpecifier OptEQ, StringRef Name) {
1324 auto InitializeResultPattern = [&Diags, &Args, &
Result](
const Arg *A,
1325 StringRef Pattern) {
1326 Result.Pattern = Pattern.str();
1328 std::string RegexError;
1329 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1330 if (!
Result.Regex->isValid(RegexError)) {
1331 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1332 << RegexError << A->getAsString(Args);
1339 for (Arg *A : Args) {
1340 if (A->getOption().matches(OPT_R_Joined)) {
1341 StringRef
Value = A->getValue();
1345 else if (
Value ==
"everything")
1347 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1349 else if (
Value ==
"no-everything")
1359 InitializeResultPattern(A,
".*");
1361 }
else if (A->getOption().matches(OptEQ)) {
1363 if (!InitializeResultPattern(A, A->getValue()))
1372 const std::vector<std::string> &Levels,
1376 for (
const auto &Level : Levels) {
1378 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1386 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1394 const std::vector<std::string> &Sanitizers,
1396 for (
const auto &Sanitizer : Sanitizers) {
1399 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1413 const std::vector<std::string> &Sanitizers,
1416 for (
const auto &Sanitizer : Sanitizers) {
1418 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1427 llvm::SplitString(Bundle, BundleParts,
",");
1428 for (
const auto &B : BundleParts) {
1432 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1446 llvm::raw_string_ostream OS(Buffer);
1447 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1453 const llvm::Triple &Triple) {
1454 assert(Triple.getArch() == llvm::Triple::aarch64);
1461 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1462 : Discrimination::None);
1465 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1466 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1467 : Discrimination::None);
1469 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1484 if (
LangOpts.PointerAuthInitFini) {
1486 Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1496 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1515 if (
LangOpts.PointerAuthObjcClassROPointers)
1528 const llvm::Triple &Triple,
1530 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1531 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1532 !LangOpts.AArch64JumpTableHardening)
1538void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1540 const llvm::Triple &T,
1541 const std::string &OutputFile,
1545 if (Opts.OptimizationLevel == 0)
1548 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1550#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1551 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1552#include "clang/Options/Options.inc"
1553#undef CODEGEN_OPTION_WITH_MARSHALLING
1555 if (Opts.OptimizationLevel > 0) {
1559 GenerateArg(Consumer, OPT_finline_hint_functions);
1564 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1565 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1566 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1567 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1569 std::optional<StringRef> DebugInfoVal;
1570 switch (Opts.DebugInfo) {
1571 case llvm::codegenoptions::DebugLineTablesOnly:
1572 DebugInfoVal =
"line-tables-only";
1574 case llvm::codegenoptions::DebugDirectivesOnly:
1575 DebugInfoVal =
"line-directives-only";
1577 case llvm::codegenoptions::DebugInfoConstructor:
1578 DebugInfoVal =
"constructor";
1580 case llvm::codegenoptions::LimitedDebugInfo:
1581 DebugInfoVal =
"limited";
1583 case llvm::codegenoptions::FullDebugInfo:
1584 DebugInfoVal =
"standalone";
1586 case llvm::codegenoptions::UnusedTypeInfo:
1587 DebugInfoVal =
"unused-types";
1589 case llvm::codegenoptions::NoDebugInfo:
1590 DebugInfoVal = std::nullopt;
1592 case llvm::codegenoptions::LocTrackingOnly:
1593 DebugInfoVal = std::nullopt;
1597 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1601 Prefix.first +
"=" + Prefix.second);
1604 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1605 Prefix.first +
"=" + Prefix.second);
1607 if (Opts.NewStructPathTBAA)
1610 if (Opts.OptimizeSize == 1)
1612 else if (Opts.OptimizeSize == 2)
1620 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1622 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1625 if (Opts.InterchangeLoops)
1631 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1636 if (Opts.DebugNameTable ==
1637 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1639 else if (Opts.DebugNameTable ==
1640 static_cast<unsigned>(
1641 llvm::DICompileUnit::DebugNameTableKind::Default))
1644 if (Opts.DebugTemplateAlias)
1647 auto TNK = Opts.getDebugSimpleTemplateNames();
1648 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1649 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1650 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1651 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1652 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1657 if (Opts.TimePasses) {
1658 if (Opts.TimePassesPerRun)
1659 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1663 if (Opts.TimePassesJson)
1667 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1670 if (Opts.PrepareForThinLTO)
1679 StringRef MemProfileBasename(
"memprof.profraw");
1700 std::string InstrBundle =
1702 if (!InstrBundle.empty())
1703 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1706 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1707 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1708 else if (Opts.CFProtectionReturn)
1709 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1710 else if (Opts.CFProtectionBranch)
1711 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1713 if (Opts.CFProtectionBranch) {
1714 switch (Opts.getCFBranchLabelScheme()) {
1717#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1718 case CFBranchLabelSchemeKind::Kind: \
1719 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1721#include "clang/Basic/CFProtectionOptions.def"
1725 if (Opts.FunctionReturnThunks)
1726 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1729 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1730 F.PropagateAttrs && F.Internalize;
1732 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1736 if (Opts.EmulatedTLS)
1744 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1749 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1753 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1757 if (Opts.EnableAIXExtendedAltivecABI)
1760 if (Opts.XCOFFReadOnlyPointers)
1778 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1783 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1787 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1790 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1792 for (StringRef Sanitizer :
1794 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1796 SmallVector<std::string, 4> Values;
1798 for (std::string Sanitizer : Values)
1799 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1802 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1806 for (StringRef Sanitizer :
1808 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1810 if (!Opts.EmitVersionIdentMetadata)
1813 switch (Opts.FiniteLoops) {
1824 if (Opts.StaticClosure)
1828bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1831 const llvm::Triple &T,
1832 const std::string &OutputFile,
1843 const LangOptions *
LangOpts = &LangOptsRef;
1845#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1846 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1847#include "clang/Options/Options.inc"
1848#undef CODEGEN_OPTION_WITH_MARSHALLING
1852 if (Opts.OptimizationLevel == 0) {
1854 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1855 options::OPT_finline_hint_functions,
1856 options::OPT_fno_inline_functions,
1857 options::OPT_fno_inline)) {
1860 if (A->getOption().matches(options::OPT_finline_functions))
1862 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1872 Opts.DirectAccessExternalData =
1873 Args.hasArg(OPT_fdirect_access_external_data) ||
1874 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1877 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1879 llvm::StringSwitch<unsigned>(A->getValue())
1880 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1881 .Case(
"line-directives-only",
1882 llvm::codegenoptions::DebugDirectivesOnly)
1883 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1884 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1885 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1886 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1889 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1892 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1898 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1899 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1900 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1901 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1902 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1903 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1904 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1907 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1908 auto Split = StringRef(Arg).split(
'=');
1912 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1913 auto Split = StringRef(Arg).split(
'=');
1917 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1918 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1919 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1920 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el,
1921 llvm::Triple::riscv32, llvm::Triple::riscv64};
1924 llvm::is_contained(DebugEntryValueArchs, T.getArch()))
1925 Opts.EmitCallSiteInfo =
true;
1928 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1933 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1934 Args.hasArg(OPT_new_struct_path_tbaa);
1936 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1937 if (Opts.SimplifyLibCalls)
1940 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1941 (Opts.OptimizationLevel > 1));
1942 Opts.InterchangeLoops =
1943 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
false);
1944 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1945 OPT_fno_experimental_loop_fusion,
false);
1947 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1949 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1951 Opts.DebugNameTable =
static_cast<unsigned>(
1952 Args.hasArg(OPT_ggnu_pubnames)
1953 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1954 : Args.hasArg(OPT_gpubnames)
1955 ? llvm::DICompileUnit::DebugNameTableKind::Default
1956 : llvm::DICompileUnit::DebugNameTableKind::None);
1957 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1958 StringRef
Value = A->getValue();
1960 Diags.
Report(diag::err_drv_unsupported_option_argument)
1961 << A->getSpelling() << A->getValue();
1962 Opts.setDebugSimpleTemplateNames(
1963 StringRef(A->getValue()) ==
"simple"
1964 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1965 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1968 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1969 OPT_stats_file_timers)) {
1970 Opts.TimePasses =
true;
1973 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1974 StringRef Val =
EQ->getValue();
1975 if (Val ==
"per-pass")
1976 Opts.TimePassesPerRun =
false;
1977 else if (Val ==
"per-pass-run")
1978 Opts.TimePassesPerRun =
true;
1980 Diags.
Report(diag::err_drv_invalid_value)
1981 <<
EQ->getAsString(Args) <<
EQ->getValue();
1984 if (Args.getLastArg(OPT_ftime_report_json))
1985 Opts.TimePassesJson =
true;
1988 Opts.PrepareForLTO =
false;
1989 Opts.PrepareForThinLTO =
false;
1990 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1991 Opts.PrepareForLTO =
true;
1992 StringRef S = A->getValue();
1994 Opts.PrepareForThinLTO =
true;
1995 else if (S !=
"full")
1996 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1997 if (Args.hasArg(OPT_funified_lto))
1998 Opts.PrepareForThinLTO =
true;
2000 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2002 Diags.
Report(diag::err_drv_argument_only_allowed_with)
2003 << A->getAsString(Args) <<
"-x ir";
2005 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2007 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2009 llvm::StringSwitch<std::string>(A->getValue())
2010 .Case(
"obj", OutputFile)
2011 .Default(llvm::sys::path::filename(OutputFile).str());
2014 const char *MemProfileBasename =
"memprof.profraw";
2015 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2016 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2017 llvm::sys::path::append(Path, MemProfileBasename);
2019 }
else if (Args.hasArg(OPT_fmemory_profile))
2023 if (Args.hasArg(OPT_coverage_version_EQ)) {
2024 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2025 if (CoverageVersion.size() != 4) {
2026 Diags.
Report(diag::err_drv_invalid_value)
2027 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2037 for (
const auto &A : Args) {
2039 if (A->getOption().getID() == options::OPT_o ||
2040 A->getOption().getID() == options::OPT_INPUT ||
2041 A->getOption().getID() == options::OPT_x ||
2042 A->getOption().getID() == options::OPT_fembed_bitcode ||
2043 A->getOption().matches(options::OPT_W_Group))
2046 A->render(Args, ASL);
2047 for (
const auto &arg : ASL) {
2048 StringRef ArgStr(arg);
2049 llvm::append_range(Opts.
CmdArgs, ArgStr);
2055 auto XRayInstrBundles =
2056 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2057 if (XRayInstrBundles.empty())
2060 for (
const auto &A : XRayInstrBundles)
2064 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2065 StringRef Name = A->getValue();
2066 if (Name ==
"full") {
2067 Opts.CFProtectionReturn = 1;
2068 Opts.CFProtectionBranch = 1;
2069 }
else if (Name ==
"return")
2070 Opts.CFProtectionReturn = 1;
2071 else if (Name ==
"branch")
2072 Opts.CFProtectionBranch = 1;
2073 else if (Name !=
"none")
2074 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2077 if (Opts.CFProtectionBranch && T.isRISCV()) {
2078 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2080 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2081#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2082 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2083#include "clang/Basic/CFProtectionOptions.def"
2086 Opts.setCFBranchLabelScheme(Scheme);
2088 Diags.
Report(diag::err_drv_invalid_value)
2089 << A->getAsString(Args) << A->getValue();
2093 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2094 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2095 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2096 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2097 .Default(llvm::FunctionReturnThunksKind::Invalid);
2100 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2101 << A->getSpelling() << T.getTriple();
2102 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2103 Diags.
Report(diag::err_drv_invalid_value)
2104 << A->getAsString(Args) << A->getValue();
2105 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2106 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2107 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2108 << A->getAsString(Args)
2109 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2111 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2115 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2116 CodeGenOptions::BitcodeFileToLink F;
2118 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2119 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2128 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2129 StringRef Val = A->getValue();
2133 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2136 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2137 StringRef Val = A->getValue();
2140 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2146 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2147 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2151 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2152 << A->getSpelling() << T.str();
2154 const Option &O = A->getOption();
2155 if (O.matches(OPT_fpcc_struct_return) ||
2156 O.matches(OPT_maix_struct_return)) {
2159 assert(O.matches(OPT_freg_struct_return) ||
2160 O.matches(OPT_msvr4_struct_return));
2165 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2167 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2168 << A->getSpelling() << T.str();
2178 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2179 Diags.
Report(diag::err_roptr_requires_data_sections);
2181 Opts.XCOFFReadOnlyPointers =
true;
2184 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2185 if (!T.isOSAIX() || T.isPPC32())
2186 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2187 << A->getSpelling() << T.str();
2190 bool NeedLocTracking =
false;
2193 NeedLocTracking =
true;
2195 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2197 NeedLocTracking =
true;
2200 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2202 NeedLocTracking =
true;
2212 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2222 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2225 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2226 <<
"-fdiagnostics-show-hotness";
2230 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2232 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2235 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2236 <<
"-fdiagnostics-hotness-threshold=";
2242 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2243 <<
"-fdiagnostics-hotness-threshold=";
2248 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2252 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2253 <<
"-fdiagnostics-misexpect-tolerance=";
2259 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2260 <<
"-fdiagnostics-misexpect-tolerance=";
2267 if (UsingSampleProfile)
2268 NeedLocTracking =
true;
2271 NeedLocTracking =
true;
2275 if (NeedLocTracking &&
2276 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2277 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2282 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2285 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2288 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2293 "-fsanitize-skip-hot-cutoff=",
2294 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2297 "-fsanitize-annotate-debug-info=",
2298 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2302 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2305 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2306 Diags.
Report(diag::err_drv_invalid_value)
2307 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2313 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2318 if (Args.hasArg(options::OPT_ffinite_loops))
2320 else if (Args.hasArg(options::OPT_fno_finite_loops))
2323 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2324 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2325 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2326 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2328 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2334 Diags.
Report(diag::err_drv_invalid_escaped_command_line)
2335 << llvm::toString(ParsedArgs.takeError());
2346#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2347 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2348#include "clang/Options/Options.inc"
2349#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2354 for (
const auto &Dep : Opts.
ExtraDeps) {
2355 switch (Dep.second) {
2368 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2377 bool ShowLineMarkers) {
2381#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2382 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2383#include "clang/Options/Options.inc"
2384#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2386 if (Args.hasArg(OPT_show_includes)) {
2401 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2402 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2403 StringRef Val = A->getValue();
2404 if (!Val.contains(
'='))
2408 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2409 StringRef Val = A->getValue();
2410 if (!Val.contains(
'='))
2417 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2421 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2425 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2426 StringRef Val = A->getValue();
2427 if (!Val.contains(
'='))
2435 if (Args.hasArg(OPT_header_include_format_EQ))
2436 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2440 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2444 if (Args.hasArg(OPT_header_include_filtering_EQ))
2445 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2449 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2465 } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2466 for (
auto *A : Args) {
2467 const Option &O = A->getOption();
2468 if (O.matches(options::OPT_fcolor_diagnostics)) {
2469 ShowColors = Colors_On;
2470 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2471 ShowColors = Colors_Off;
2472 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2473 StringRef
Value(A->getValue());
2474 if (
Value ==
"always")
2475 ShowColors = Colors_On;
2476 else if (
Value ==
"never")
2477 ShowColors = Colors_Off;
2478 else if (
Value ==
"auto")
2479 ShowColors = Colors_Auto;
2482 return ShowColors == Colors_On ||
2483 (ShowColors == Colors_Auto &&
2484 llvm::sys::Process::StandardErrHasColors());
2490 for (
const auto &Prefix : VerifyPrefixes) {
2493 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2496 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2498 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2499 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2509#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2510 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2511#include "clang/Options/Options.inc"
2512#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2521#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2522 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2523#include "clang/Options/Options.inc"
2524#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2532#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2533 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2534#include "clang/Options/Options.inc"
2535#undef MIGRATOR_OPTION_WITH_MARSHALLING
2544#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2545 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2546#include "clang/Options/Options.inc"
2547#undef MIGRATOR_OPTION_WITH_MARSHALLING
2552void CompilerInvocationBase::GenerateDiagnosticArgs(
2554 bool DefaultDiagColor) {
2556#define DIAG_OPTION_WITH_MARSHALLING(...) \
2557 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2558#include "clang/Options/Options.inc"
2559#undef DIAG_OPTION_WITH_MARSHALLING
2562 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2565 if (Opts.ShowColors)
2568 if (Opts.VerifyDiagnostics &&
2573 if (Prefix !=
"expected")
2576 if (Opts.VerifyDirectives) {
2584 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2587 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2589 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2591 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2593 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2598 if (
Warning ==
"undef-prefix")
2601 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2603 Consumer(StringRef(
"-W") +
Warning);
2609 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2610 "pass-analysis",
"no-pass-analysis",
2611 "pass-missed",
"no-pass-missed"};
2612 if (llvm::is_contained(IgnoredRemarks,
Remark))
2615 Consumer(StringRef(
"-R") +
Remark);
2619 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2624std::unique_ptr<DiagnosticOptions>
2626 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2627 unsigned MissingArgIndex, MissingArgCount;
2629 Argv.slice(1), MissingArgIndex, MissingArgCount);
2631 bool ShowColors =
true;
2632 if (std::optional<std::string> NoColor =
2633 llvm::sys::Process::GetEnv(
"NO_COLOR");
2634 NoColor && !NoColor->empty()) {
2649 bool DefaultDiagColor) {
2650 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2651 std::optional<DiagnosticsEngine> IgnoringDiags;
2653 IgnoringDiagOpts.emplace();
2656 Diags = &*IgnoringDiags;
2665#define DIAG_OPTION_WITH_MARSHALLING(...) \
2666 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2667#include "clang/Options/Options.inc"
2668#undef DIAG_OPTION_WITH_MARSHALLING
2670 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2673 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2677 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2678 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2680 if (Args.hasArg(OPT_verify))
2685 Opts.VerifyDiagnostics =
false;
2690 "-verify-ignore-unexpected=",
2691 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2692 if (Args.hasArg(OPT_verify_ignore_unexpected))
2694 Opts.setVerifyIgnoreUnexpected(DiagMask);
2696 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2701 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2712 unsigned DefaultOpt = 0;
2715 !Args.hasArg(OPT_cl_opt_disable))
2718 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2719 if (A->getOption().matches(options::OPT_O0))
2722 if (A->getOption().matches(options::OPT_Ofast))
2725 assert(A->getOption().matches(options::OPT_O));
2727 StringRef S(A->getValue());
2728 if (S ==
"s" || S ==
"z")
2737 unsigned MaxOptLevel = 3;
2738 if (DefaultOpt > MaxOptLevel) {
2741 Diags.
Report(diag::warn_drv_optimization_value)
2742 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2743 DefaultOpt = MaxOptLevel;
2750 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2751 if (A->getOption().matches(options::OPT_O)) {
2752 switch (A->getValue()[0]) {
2770 std::string &BlockName,
2771 unsigned &MajorVersion,
2772 unsigned &MinorVersion,
2774 std::string &UserInfo) {
2776 Arg.split(Args,
':', 5);
2777 if (Args.size() < 5)
2780 BlockName = std::string(Args[0]);
2781 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2782 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2783 if (Args[3].getAsInteger(2, Hashed))
return true;
2784 if (Args.size() > 4)
2785 UserInfo = std::string(Args[4]);
2794 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2825 OPT_emit_reduced_module_interface},
2842 OPT_print_dependency_directives_minimized_source},
2849static std::optional<frontend::ActionKind>
2852 if (ActionOpt.second == Opt.getID())
2853 return ActionOpt.first;
2855 return std::nullopt;
2859static std::optional<OptSpecifier>
2862 if (ActionOpt.first == ProgramAction)
2863 return OptSpecifier(ActionOpt.second);
2865 return std::nullopt;
2871#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2872 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2873#include "clang/Options/Options.inc"
2874#undef FRONTEND_OPTION_WITH_MARSHALLING
2876 std::optional<OptSpecifier> ProgramActionOpt =
2884 if (!ProgramActionOpt) {
2887 "Frontend action without option.");
2888 GenerateProgramAction = [&]() {
2895 GenerateProgramAction = [&]() {
2903 llvm_unreachable(
"Default AST dump format.");
2910 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2923 GenerateProgramAction = [&]() {
2928 GenerateProgramAction();
2930 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2932 for (
const auto &PluginArg : PluginArgs.second)
2934 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2935 Opt.getKind(), 0, PluginArg);
2939 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2940 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2946 for (
const auto &Plugin : Opts.
Plugins)
2952 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2965 StringRef HeaderUnit =
"";
2970 HeaderUnit =
"-user";
2973 HeaderUnit =
"-system";
2976 HeaderUnit =
"-header-unit";
2979 StringRef Header = IsHeader ?
"-header" :
"";
3002 Lang =
"objective-c";
3005 Lang =
"objective-c++";
3008 Lang =
"assembler-with-cpp";
3012 "Generating -x argument for unknown language (not precompiled).");
3027 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3031 for (
const auto &Input : Opts.
Inputs)
3032 Consumer(Input.getFile());
3041#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3042 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3043#include "clang/Options/Options.inc"
3044#undef FRONTEND_OPTION_WITH_MARSHALLING
3047 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3048 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3050 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3053 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3054 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3057 .Default(std::numeric_limits<unsigned>::max());
3059 if (Val != std::numeric_limits<unsigned>::max())
3062 Diags.
Report(diag::err_drv_invalid_value)
3063 << A->getAsString(Args) << A->getValue();
3073 Args.hasArg(OPT_interface_stub_version_EQ)
3074 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3076 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3077 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3078 ArgStr ==
"experimental-tapi-elf-v1") {
3079 std::string ErrorMessage =
3080 "Invalid interface stub format: " + ArgStr.str() +
3082 Diags.
Report(diag::err_drv_invalid_value)
3083 <<
"Must specify a valid interface stub format type, ie: "
3084 "-interface-stub-version=ifs-v1"
3087 }
else if (!ArgStr.starts_with(
"ifs-")) {
3088 std::string ErrorMessage =
3089 "Invalid interface stub format: " + ArgStr.str() +
".";
3090 Diags.
Report(diag::err_drv_invalid_value)
3091 <<
"Must specify a valid interface stub format type, ie: "
3092 "-interface-stub-version=ifs-v1"
3107 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3108 const Arg *SavedAction =
nullptr;
3109 for (
const Arg *AA :
3110 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3111 if (AA->getOption().matches(OPT_main_file_name)) {
3112 SavedAction =
nullptr;
3113 }
else if (!SavedAction) {
3116 if (!A->getOption().matches(OPT_ast_dump_EQ))
3117 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3118 << SavedAction->getSpelling() << A->getSpelling();
3125 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3126 Opts.
Plugins.emplace_back(A->getValue(0));
3130 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3131 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3133 for (
const std::string &Arg :
3134 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3135 std::string BlockName;
3136 unsigned MajorVersion;
3137 unsigned MinorVersion;
3139 std::string UserInfo;
3141 MinorVersion, Hashed, UserInfo)) {
3142 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3149 std::make_shared<TestModuleFileExtension>(
3150 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3153 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3157 Diags.
Report(diag::err_drv_invalid_value)
3158 << A->getAsString(Args) << A->getValue();
3159 Diags.
Report(diag::note_command_line_code_loc_requirement);
3163 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3164 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3165 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3167 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3168 StringRef Val = A->getValue();
3169 if (!Val.contains(
'='))
3174 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3176 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3180 if (Args.hasArg(OPT_clangir_disable_passes))
3183 if (Args.hasArg(OPT_clangir_disable_verifier))
3187 if (Args.hasArg(OPT_aux_target_cpu))
3188 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3189 if (Args.hasArg(OPT_aux_target_feature))
3193 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3194 StringRef XValue = A->getValue();
3199 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3200 bool ModuleMap = XValue.consume_back(
"-module-map");
3203 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3209 if (IsHeader || Preprocessed) {
3210 if (XValue.consume_back(
"-header-unit"))
3212 else if (XValue.consume_back(
"-system"))
3214 else if (XValue.consume_back(
"-user"))
3220 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3224 DashX = llvm::StringSwitch<InputKind>(XValue)
3240 DashX = llvm::StringSwitch<InputKind>(XValue)
3248 DashX = llvm::StringSwitch<InputKind>(XValue)
3251 .Cases({
"ast",
"pcm",
"precompiled-header"},
3258 Diags.
Report(diag::err_drv_invalid_value)
3259 << A->getAsString(Args) << A->getValue();
3266 IsHeaderFile =
true;
3267 }
else if (IsHeaderFile)
3274 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3277 Inputs.push_back(
"-");
3281 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3283 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3287 StringRef(Inputs[i]).rsplit(
'.').second);
3296 bool IsSystem =
false;
3305 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3322#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3323 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3324#include "clang/Options/Options.inc"
3325#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3334 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3341 std::optional<bool> IsFramework,
3342 std::optional<bool> IgnoreSysRoot) {
3343 return llvm::is_contained(Groups, Entry.
Group) &&
3344 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3345 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3354 OptSpecifier Opt = [It, Matches]() {
3359 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3373 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3380 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3386 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3391 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3399 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3401 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3411 ? OPT_internal_isystem
3412 : OPT_internal_externc_isystem;
3416 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3418 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3422 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3423 : OPT_no_system_header_prefix;
3437#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3438 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3439#include "clang/Options/Options.inc"
3440#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3442 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3443 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3446 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3447 StringRef Val = A->getValue();
3448 if (Val.contains(
'=')) {
3449 auto Split = Val.split(
'=');
3451 std::string(Split.first), std::string(Split.second));
3454 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3457 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3458 StringRef MacroDef = A->getValue();
3460 llvm::CachedHashString(MacroDef.split(
'=').first));
3464 bool IsSysrootSpecified =
3465 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3469 auto PrefixHeaderPath = [IsSysrootSpecified,
3470 &Opts](
const llvm::opt::Arg *A,
3471 bool IsFramework =
false) -> std::string {
3472 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3473 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3475 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3476 llvm::StringRef(A->getValue()).substr(1));
3477 return std::string(Buffer);
3479 return A->getValue();
3482 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3483 bool IsFramework = A->getOption().matches(OPT_F);
3489 StringRef Prefix =
"";
3490 for (
const auto *A :
3491 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3492 if (A->getOption().matches(OPT_iprefix))
3493 Prefix = A->getValue();
3494 else if (A->getOption().matches(OPT_iwithprefix))
3500 for (
const auto *A : Args.filtered(OPT_idirafter))
3502 for (
const auto *A : Args.filtered(OPT_iquote))
3505 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3506 if (A->getOption().matches(OPT_iwithsysroot)) {
3513 for (
const auto *A : Args.filtered(OPT_iframework))
3515 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3520 for (
const auto *A : Args.filtered(OPT_c_isystem))
3522 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3524 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3526 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3530 for (
const auto *A :
3531 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3533 if (A->getOption().matches(OPT_internal_externc_isystem))
3535 Opts.
AddPath(A->getValue(), Group,
false,
true);
3537 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3541 for (
const auto *A :
3542 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3544 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3546 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3555 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3559 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3564 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3566 diags.
Report(diag::err_drv_invalid_value)
3567 << A->getAsString(Args) << A->getValue();
3569 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3575 if (Opts.PointerAuthIntrinsics)
3577 if (Opts.PointerAuthCalls)
3579 if (Opts.PointerAuthReturns)
3581 if (Opts.PointerAuthIndirectGotos)
3582 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3583 if (Opts.PointerAuthAuthTraps)
3585 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3586 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3587 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3588 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3589 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3590 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3591 if (Opts.PointerAuthFunctionTypeDiscrimination)
3592 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3593 if (Opts.PointerAuthInitFini)
3595 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3596 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3597 if (Opts.PointerAuthELFGOT)
3599 if (Opts.AArch64JumpTableHardening)
3600 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3601 if (Opts.PointerAuthObjcIsa)
3603 if (Opts.PointerAuthObjcInterfaceSel)
3604 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3605 if (Opts.PointerAuthObjcClassROPointers)
3606 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3607 if (Opts.PointerAuthBlockDescriptorPointers)
3608 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3613 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3614 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3615 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3616 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3617 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3618 Opts.PointerAuthVTPtrAddressDiscrimination =
3619 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3620 Opts.PointerAuthVTPtrTypeDiscrimination =
3621 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3622 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3623 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3624 Opts.PointerAuthFunctionTypeDiscrimination =
3625 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3626 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3627 Opts.PointerAuthInitFiniAddressDiscrimination =
3628 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3629 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3630 Opts.AArch64JumpTableHardening =
3631 Args.hasArg(OPT_faarch64_jump_table_hardening);
3632 Opts.PointerAuthBlockDescriptorPointers =
3633 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3634 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3635 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3636 Opts.PointerAuthObjcInterfaceSel =
3637 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3639 if (Opts.PointerAuthObjcInterfaceSel)
3640 Opts.PointerAuthObjcInterfaceSelKey =
3651 llvm_unreachable(
"should not parse language flags for this input");
3686 llvm_unreachable(
"unexpected input language");
3695 return "Objective-C";
3699 return "Objective-C++";
3703 return "C++ for OpenCL";
3722 llvm_unreachable(
"unknown input language");
3725void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3727 const llvm::Triple &T,
3732 if (Opts.ObjCAutoRefCount)
3734 if (Opts.PICLevel != 0)
3735 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3739 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3740 for (StringRef Sanitizer :
3742 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3748 OptSpecifier StdOpt;
3750 case LangStandard::lang_opencl10:
3751 case LangStandard::lang_opencl11:
3752 case LangStandard::lang_opencl12:
3753 case LangStandard::lang_opencl20:
3754 case LangStandard::lang_opencl30:
3755 case LangStandard::lang_openclcpp10:
3756 case LangStandard::lang_openclcpp2021:
3757 StdOpt = OPT_cl_std_EQ;
3760 StdOpt = OPT_std_EQ;
3765 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3767 if (Opts.IncludeDefaultHeader)
3768 GenerateArg(Consumer, OPT_finclude_default_header);
3769 if (Opts.DeclareOpenCLBuiltins)
3770 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3772 const LangOptions *
LangOpts = &Opts;
3774#define LANG_OPTION_WITH_MARSHALLING(...) \
3775 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3776#include "clang/Options/Options.inc"
3777#undef LANG_OPTION_WITH_MARSHALLING
3788 else if (Opts.ObjCAutoRefCount == 1)
3791 if (Opts.ObjCWeakRuntime)
3792 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3797 if (Opts.ObjCSubscriptingLegacyRuntime)
3798 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3801 if (Opts.GNUCVersion != 0) {
3802 unsigned Major = Opts.GNUCVersion / 100 / 100;
3803 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3804 unsigned Patch = Opts.GNUCVersion % 100;
3806 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3809 if (Opts.IgnoreXCOFFVisibility)
3810 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3816 if (!Opts.MSVCCompat)
3818 }
else if (Opts.MSVCCompat) {
3821 if (Opts.PointerOverflowDefined)
3824 if (Opts.MSCompatibilityVersion != 0) {
3825 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3826 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3827 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3828 GenerateArg(Consumer, OPT_fms_compatibility_version,
3829 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3832 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3834 if (!Opts.Trigraphs)
3841 if (T.isOSzOS() && !Opts.ZOSExt)
3843 else if (Opts.ZOSExt)
3846 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3849 if (Opts.ConvergentFunctions)
3852 GenerateArg(Consumer, OPT_fno_convergent_functions);
3854 if (Opts.NoBuiltin && !Opts.Freestanding)
3857 if (!Opts.NoBuiltin)
3861 if (Opts.LongDoubleSize == 128)
3863 else if (Opts.LongDoubleSize == 64)
3865 else if (Opts.LongDoubleSize == 80)
3872 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3875 if (Opts.OpenMP != 51)
3876 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3878 if (!Opts.OpenMPUseTLS)
3881 if (Opts.OpenMPIsTargetDevice)
3882 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3884 if (Opts.OpenMPIRBuilder)
3885 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3888 if (Opts.OpenMPSimd) {
3891 if (Opts.OpenMP != 51)
3892 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3895 if (Opts.OpenMPThreadSubscription)
3896 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3898 if (Opts.OpenMPTeamSubscription)
3899 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3901 if (Opts.OpenMPTargetDebug != 0)
3902 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3903 Twine(Opts.OpenMPTargetDebug));
3905 if (Opts.OpenMPCUDANumSMs != 0)
3906 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3907 Twine(Opts.OpenMPCUDANumSMs));
3909 if (Opts.OpenMPCUDABlocksPerSM != 0)
3910 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3911 Twine(Opts.OpenMPCUDABlocksPerSM));
3913 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3914 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3915 Twine(Opts.OpenMPCUDAReductionBufNum));
3918 std::string Targets;
3919 llvm::raw_string_ostream
OS(Targets);
3922 [&OS](
const llvm::Triple &T) { OS << T.str(); },
",");
3923 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3926 if (Opts.OpenMPCUDAMode)
3942 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3945 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3946 for (StringRef Sanitizer :
3948 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3952 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3954 switch (Opts.getClangABICompat()) {
3955#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3956 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3957 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3959#define ABI_VER_MAJOR(Major) \
3960 case LangOptions::ClangABI::Ver##Major: \
3961 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3963#define ABI_VER_LATEST(Latest) \
3964 case LangOptions::ClangABI::Latest: \
3966#include "clang/Basic/ABIVersions.def"
3969 if (Opts.getSignReturnAddressScope() ==
3971 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3972 else if (Opts.getSignReturnAddressScope() ==
3974 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3976 if (Opts.getSignReturnAddressKey() ==
3978 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3984 if (Opts.RelativeCXXABIVTables)
3985 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3987 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3995 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
4005 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
4006 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
4009 if (Opts.MatrixTypes) {
4010 if (Opts.getDefaultMatrixMemoryLayout() ==
4012 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
4013 if (Opts.getDefaultMatrixMemoryLayout() ==
4015 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4019bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4021 std::vector<std::string> &Includes,
4031 if (Args.hasArg(OPT_fobjc_arc))
4032 Opts.ObjCAutoRefCount = 1;
4036 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4040 "-fsanitize-ignore-for-ubsan-feature=",
4041 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4052 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4055 Diags.
Report(diag::err_drv_invalid_value)
4056 << A->getAsString(Args) << A->getValue();
4058 for (
unsigned KindValue = 0;
4064 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4066 unsigned NumAliases = 0;
4067#define LANGSTANDARD(id, name, lang, desc, features, version)
4068#define LANGSTANDARD_ALIAS(id, alias) \
4069 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4070#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4071#include "clang/Basic/LangStandards.def"
4073#define LANGSTANDARD(id, name, lang, desc, features, version)
4074#define LANGSTANDARD_ALIAS(id, alias) \
4075 if (KindValue == LangStandard::lang_##id) Diag << alias;
4076#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4077#include "clang/Basic/LangStandards.def"
4085 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4093 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4095 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4096 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4097 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4098 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4099 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4100 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4101 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4102 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4103 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4104 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4108 Diags.
Report(diag::err_drv_invalid_value)
4109 << A->getAsString(Args) << A->getValue();
4112 LangStd = OpenCLLangStd;
4116 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4117 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4125#define LANG_OPTION_WITH_MARSHALLING(...) \
4126 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4127#include "clang/Options/Options.inc"
4128#undef LANG_OPTION_WITH_MARSHALLING
4130 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4131 StringRef Name = A->getValue();
4132 if (Name ==
"full") {
4133 Opts.CFProtectionBranch = 1;
4134 Opts.CFProtectionReturn = 1;
4135 }
else if (Name ==
"branch") {
4136 Opts.CFProtectionBranch = 1;
4137 }
else if (Name ==
"return") {
4138 Opts.CFProtectionReturn = 1;
4142 if (Opts.CFProtectionBranch) {
4143 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4145 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4146#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4147 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4148#include "clang/Basic/CFProtectionOptions.def"
4150 Opts.setCFBranchLabelScheme(Scheme);
4154 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4155 !Args.hasArg(OPT_sycl_std_EQ)) {
4165 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4166 StringRef value =
arg->getValue();
4168 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4171 if (Args.hasArg(OPT_fobjc_gc_only))
4173 else if (Args.hasArg(OPT_fobjc_gc))
4175 else if (Args.hasArg(OPT_fobjc_arc)) {
4176 Opts.ObjCAutoRefCount = 1;
4178 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4185 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4186 Opts.ObjCWeakRuntime = 1;
4192 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4193 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4194 assert(!Opts.ObjCWeak);
4196 Diags.
Report(diag::err_objc_weak_with_gc);
4197 }
else if (!Opts.ObjCWeakRuntime) {
4198 Diags.
Report(diag::err_objc_weak_unsupported);
4202 }
else if (Opts.ObjCAutoRefCount) {
4203 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4206 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4207 Opts.ObjCSubscriptingLegacyRuntime =
4211 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4214 VersionTuple GNUCVer;
4215 bool Invalid = GNUCVer.tryParse(A->getValue());
4216 unsigned Major = GNUCVer.getMajor();
4217 unsigned Minor = GNUCVer.getMinor().value_or(0);
4218 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4219 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4220 Diags.
Report(diag::err_drv_invalid_value)
4221 << A->getAsString(Args) << A->getValue();
4223 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4226 if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4227 Opts.IgnoreXCOFFVisibility = 1;
4229 if (Args.hasArg(OPT_ftrapv)) {
4233 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4234 }
else if (Args.hasFlag(OPT_fwrapv, OPT_fno_wrapv, Opts.MSVCCompat)) {
4237 if (Args.hasArg(OPT_fwrapv_pointer))
4238 Opts.PointerOverflowDefined =
true;
4240 Opts.MSCompatibilityVersion = 0;
4241 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4243 if (VT.tryParse(A->getValue()))
4244 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4246 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4247 VT.getMinor().value_or(0) * 100000 +
4248 VT.getSubminor().value_or(0);
4256 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4259 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4262 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions, T.isOSzOS());
4264 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4265 && Opts.OpenCLVersion == 200);
4267 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4268 Opts.HLSL || T.isAMDGPU() || T.isNVPTX();
4269 Opts.ConvergentFunctions =
4270 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4271 HasConvergentOperations);
4273 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4274 if (!Opts.NoBuiltin)
4276 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4277 if (A->getOption().matches(options::OPT_mlong_double_64))
4278 Opts.LongDoubleSize = 64;
4279 else if (A->getOption().matches(options::OPT_mlong_double_80))
4280 Opts.LongDoubleSize = 80;
4281 else if (A->getOption().matches(options::OPT_mlong_double_128))
4282 Opts.LongDoubleSize = 128;
4284 Opts.LongDoubleSize = 0;
4286 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4292 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4294 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4295 << A->getSpelling() <<
"-fdefault-calling-conv";
4297 switch (T.getArch()) {
4298 case llvm::Triple::x86:
4301 case llvm::Triple::m68k:
4305 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4306 << A->getSpelling() << T.getTriple();
4312 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4314 bool IsSimdSpecified =
4315 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4317 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4319 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4320 Opts.OpenMPIsTargetDevice =
4321 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4322 Opts.OpenMPIRBuilder =
4323 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4324 bool IsTargetSpecified =
4325 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4327 if (Opts.OpenMP || Opts.OpenMPSimd) {
4329 Args, OPT_fopenmp_version_EQ,
4330 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4331 Opts.OpenMP = Version;
4334 if (!Opts.OpenMPIsTargetDevice) {
4335 switch (T.getArch()) {
4339 case llvm::Triple::nvptx:
4340 case llvm::Triple::nvptx64:
4341 Diags.
Report(diag::err_drv_omp_host_target_not_supported) << T.str();
4349 if ((Opts.OpenMPIsTargetDevice && T.isGPU()) || Opts.OpenCLCPlusPlus) {
4351 Opts.Exceptions = 0;
4352 Opts.CXXExceptions = 0;
4354 if (Opts.OpenMPIsTargetDevice && T.isNVPTX()) {
4355 Opts.OpenMPCUDANumSMs =
4357 Opts.OpenMPCUDANumSMs, Diags);
4358 Opts.OpenMPCUDABlocksPerSM =
4360 Opts.OpenMPCUDABlocksPerSM, Diags);
4362 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4363 Opts.OpenMPCUDAReductionBufNum, Diags);
4368 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4369 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4371 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4372 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4373 Opts.OpenMPTargetDebug = 1;
4376 if (Opts.OpenMPIsTargetDevice) {
4377 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4378 Opts.OpenMPTeamSubscription =
true;
4379 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4380 Opts.OpenMPThreadSubscription =
true;
4384 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4385 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4386 auto getArchPtrSize = [](
const llvm::Triple &T) {
4387 if (T.isArch16Bit())
4389 if (T.isArch32Bit())
4391 assert(T.isArch64Bit() &&
"Expected 64-bit architecture");
4395 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4396 llvm::Triple TT(A->getValue(i));
4398 if (TT.getArch() == llvm::Triple::UnknownArch ||
4399 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4400 TT.getArch() == llvm::Triple::spirv64 ||
4401 TT.getArch() == llvm::Triple::systemz ||
4402 TT.getArch() == llvm::Triple::loongarch64 ||
4403 TT.getArch() == llvm::Triple::nvptx ||
4404 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4405 TT.getArch() == llvm::Triple::x86 ||
4406 TT.getArch() == llvm::Triple::x86_64))
4407 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4408 else if (getArchPtrSize(T) != getArchPtrSize(TT))
4409 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4410 << A->getValue(i) << T.str();
4417 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4418 (T.isNVPTX() || T.isAMDGCN()) &&
4419 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4422 if (Args.hasArg(options::OPT_fopenacc))
4423 Opts.OpenACC =
true;
4425 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4426 StringRef Val = A->getValue();
4429 else if (Val ==
"on")
4431 else if (Val ==
"off")
4433 else if (Val ==
"fast-honor-pragmas")
4436 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4440 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4441 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4443 llvm::StringSwitch<unsigned>(A->getValue(i))
4446 .Case(
"add-unsigned-overflow-test",
4448 .Case(
"add-signed-overflow-test",
4451 .Case(
"unsigned-post-decr-while",
4461 "-fsanitize-ignore-for-ubsan-feature=",
4462 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4464 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4465 std::vector<std::string> systemIgnorelists =
4466 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4468 systemIgnorelists.begin(),
4469 systemIgnorelists.end());
4471 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4472 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4474 StringRef Ver = A->getValue();
4475 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4476 int Major, Minor = 0;
4480 if (!VerParts.first.starts_with(
"0") &&
4481 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4482 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4484 ? VerParts.second.size() == 1 &&
4485 !VerParts.second.getAsInteger(10, Minor)
4486 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4488#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4489 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4490 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4492#define ABI_VER_MAJOR(Major_) \
4493 if (Major <= Major_) \
4494 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4496#define ABI_VER_LATEST(Latest) \
4499#include "clang/Basic/ABIVersions.def"
4500 }
else if (Ver !=
"latest") {
4501 Diags.
Report(diag::err_drv_invalid_value)
4502 << A->getAsString(Args) << A->getValue();
4506 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4507 StringRef SignScope = A->getValue();
4509 if (SignScope.equals_insensitive(
"none"))
4510 Opts.setSignReturnAddressScope(
4512 else if (SignScope.equals_insensitive(
"all"))
4513 Opts.setSignReturnAddressScope(
4515 else if (SignScope.equals_insensitive(
"non-leaf"))
4516 Opts.setSignReturnAddressScope(
4519 Diags.
Report(diag::err_drv_invalid_value)
4520 << A->getAsString(Args) << SignScope;
4522 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4523 StringRef SignKey = A->getValue();
4524 if (!SignScope.empty() && !SignKey.empty()) {
4525 if (SignKey ==
"a_key")
4526 Opts.setSignReturnAddressKey(
4528 else if (SignKey ==
"b_key")
4529 Opts.setSignReturnAddressKey(
4532 Diags.
Report(diag::err_drv_invalid_value)
4533 << A->getAsString(Args) << SignKey;
4539 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4546 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI << T.str();
4552 Opts.RelativeCXXABIVTables =
4553 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4554 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4558 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4559 Opts.OmitVTableRTTI =
4560 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4561 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4562 if (Opts.OmitVTableRTTI && HasRTTI)
4563 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4565 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4566 auto Split = StringRef(A).split(
'=');
4568 {std::string(
Split.first), std::string(
Split.second)});
4572 !Args.getLastArg(OPT_fno_file_reproducible) &&
4573 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4574 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4575 Args.getLastArg(OPT_ffile_reproducible));
4578 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4580 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4581 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4583 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4585 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4586 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4589 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4590 std::ifstream SeedFile(A->getValue(0));
4592 if (!SeedFile.is_open())
4593 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4599 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4602 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4603 StringRef S = Arg->getValue();
4605 if (S.getAsInteger(0,
Value))
4606 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4611 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4612 StringRef S = Arg->getValue();
4613 if (
auto Mode = getAllocTokenModeFromString(S))
4616 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4620 if (Opts.MatrixTypes) {
4621 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4622 StringRef ClangValue = A->getValue();
4623 if (ClangValue ==
"row-major")
4624 Opts.setDefaultMatrixMemoryLayout(
4627 Opts.setDefaultMatrixMemoryLayout(
4630 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4631 StringRef OptValue = A->getValue();
4632 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4633 ClangValue != OptValue)
4634 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4635 << ClangValue << OptValue;
4644 if (T.isDXIL() || T.isSPIRVLogical()) {
4646 enum {
OS, Environment };
4648 int ExpectedOS = T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4650 if (T.getOSName().empty()) {
4651 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4652 << ExpectedOS <<
OS << T.str();
4653 }
else if (T.getEnvironmentName().empty()) {
4654 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4656 }
else if (!T.isShaderStageEnvironment()) {
4657 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4658 <<
ShaderStage << T.getEnvironmentName() << T.str();
4662 if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
4663 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4664 << ShaderModel << T.getOSName() << T.str();
4669 if (Args.getLastArg(OPT_fnative_half_type) ||
4670 Args.getLastArg(OPT_fnative_int16_type)) {
4671 const LangStandard &Std =
4673 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4674 T.getOSVersion() >= VersionTuple(6, 2)))
4675 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4676 <<
"-enable-16bit-types" <<
true << Std.
getName()
4677 << T.getOSVersion().getAsString();
4679 }
else if (T.isSPIRVLogical()) {
4680 if (!T.isVulkanOS() || T.getVulkanVersion() == VersionTuple(0)) {
4681 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4682 << VulkanEnv << T.getOSName() << T.str();
4684 if (Args.getLastArg(OPT_fnative_half_type) ||
4685 Args.getLastArg(OPT_fnative_int16_type)) {
4686 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4687 ?
"-fnative-half-type"
4688 :
"-fnative-int16-type";
4689 const LangStandard &Std =
4691 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4692 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4693 << Str <<
false << Std.
getName();
4696 llvm_unreachable(
"expected DXIL or SPIR-V target");
4699 Diags.
Report(diag::err_drv_hlsl_unsupported_target) << T.str();
4701 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4702 const LangStandard &Requested =
4704 const LangStandard &Recommended =
4706 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4757 llvm_unreachable(
"invalid frontend action");
4802 llvm_unreachable(
"invalid frontend action");
4812#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4813 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4814#include "clang/Options/Options.inc"
4815#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4818 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4821 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4828 for (
const auto &M : Opts.
Macros) {
4831 if (M.first ==
"__CET__=1" && !M.second &&
4832 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4834 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4835 !CodeGenOpts.CFProtectionBranch)
4837 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4838 CodeGenOpts.CFProtectionBranch)
4841 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4844 for (
const auto &I : Opts.
Includes) {
4847 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4848 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4853 if (LangOpts.HLSL && I ==
"hlsl.h")
4863 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4869 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4872 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4886#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4887 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4888#include "clang/Options/Options.inc"
4889#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4891 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4892 Args.hasArg(OPT_pch_through_hdrstop_use);
4894 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4897 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4898 StringRef
Value(A->getValue());
4899 size_t Comma =
Value.find(
',');
4901 unsigned EndOfLine = 0;
4903 if (Comma == StringRef::npos ||
4904 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4905 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4906 Diags.
Report(diag::err_drv_preamble_format);
4914 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4915 if (A->getOption().matches(OPT_D))
4922 for (
const auto *A : Args.filtered(OPT_include))
4923 Opts.
Includes.emplace_back(A->getValue());
4925 for (
const auto *A : Args.filtered(OPT_chain_include))
4928 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4929 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4931 if (Split.second.empty()) {
4932 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4939 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4940 StringRef Epoch = A->getValue();
4944 const uint64_t MaxTimestamp =
4945 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4947 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4948 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4949 << Epoch << MaxTimestamp;
4955 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4956 StringRef Val = A->getValue();
4967 Args.hasFlag(OPT_fdefine_target_os_macros,
4979#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4980 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4981#include "clang/Options/Options.inc"
4982#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5000#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5001 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5002#include "clang/Options/Options.inc"
5003#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5006 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
5015#define TARGET_OPTION_WITH_MARSHALLING(...) \
5016 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5017#include "clang/Options/Options.inc"
5018#undef TARGET_OPTION_WITH_MARSHALLING
5024 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5034#define TARGET_OPTION_WITH_MARSHALLING(...) \
5035 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5036#include "clang/Options/Options.inc"
5037#undef TARGET_OPTION_WITH_MARSHALLING
5039 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5040 llvm::VersionTuple Version;
5041 if (Version.tryParse(A->getValue()))
5042 Diags.
Report(diag::err_drv_invalid_value)
5043 << A->getAsString(Args) << A->getValue();
5048 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5049 llvm::VersionTuple Version;
5050 if (Version.tryParse(A->getValue()))
5051 Diags.
Report(diag::err_drv_invalid_value)
5052 << A->getAsString(Args) << A->getValue();
5060bool CompilerInvocation::CreateFromArgsImpl(
5068 unsigned MissingArgIndex, MissingArgCount;
5069 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5070 MissingArgCount, VisibilityMask);
5074 if (MissingArgCount)
5075 Diags.
Report(diag::err_drv_missing_argument)
5076 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5079 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5080 auto ArgString = A->getAsString(Args);
5081 std::string Nearest;
5082 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5083 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5085 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5086 << ArgString << Nearest;
5119 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5133 Diags.
Report(diag::warn_drv_openacc_without_cir);
5141 if (!Args.hasArg(options::OPT_triple))
5153 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5154 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5155 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5156 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5169 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5175 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5186 llvm::driver::ProfileInstrKind::ProfileNone)
5187 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5197 const char *Argv0) {
5203 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5207 Args.push_back(
"-cc1");
5210 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5215 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5230#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5231 if constexpr (CK::Compatibility != CK::Benign) \
5232 HBuilder.add(LangOpts->Name);
5233#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5234 if constexpr (CK::Compatibility != CK::Benign) \
5235 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5236#include "clang/Basic/LangOptions.def"
5241 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5258 StringRef MacroDef =
Macro.first;
5260 llvm::CachedHashString(MacroDef.split(
'=').first)))
5264 HBuilder.add(
Macro);
5280#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5281#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5282 HBuilder.add(diagOpts.get##Name());
5283#include "clang/Basic/DiagnosticOptions.def"
5293 ext->hashExtension(HBuilder);
5300 HBuilder.add(*Minor);
5301 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5302 HBuilder.add(*Subminor);
5304 HBuilder.add(*Build);
5310#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5311 if constexpr (CK::Compatibility != CK::Benign) \
5312 HBuilder.add(CodeGenOpts->Name);
5313#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5314 if constexpr (CK::Compatibility != CK::Benign) \
5315 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5316#define DEBUGOPT(Name, Bits, Default, Compatibility)
5317#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5318#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5319#include "clang/Basic/CodeGenOptions.def"
5331#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5332 if constexpr (CK::Compatibility != CK::Benign) \
5333 HBuilder.add(CodeGenOpts->Name);
5334#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5335 if constexpr (CK::Compatibility != CK::Benign) \
5336 HBuilder.add(CodeGenOpts->Name);
5337#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5338 if constexpr (CK::Compatibility != CK::Benign) \
5339 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5340#include "clang/Basic/DebugOptions.def"
5347 if (!SanHash.
empty())
5348 HBuilder.add(SanHash.
Mask);
5350 llvm::MD5::MD5Result
Result;
5351 HBuilder.getHasher().final(
Result);
5353 return toString(llvm::APInt(64, Hash), 36,
false);
5357 llvm::function_ref<
bool(std::string &)> Predicate) {
5358#define RETURN_IF(PATH) \
5360 if (Predicate(PATH)) \
5364#define RETURN_IF_MANY(PATHS) \
5366 if (llvm::any_of(PATHS, Predicate)) \
5370 auto &HeaderSearchOpts = *this->
HSOpts;
5373 for (
auto &Entry : HeaderSearchOpts.UserEntries)
5374 if (Entry.IgnoreSysRoot)
5376 RETURN_IF(HeaderSearchOpts.ResourceDir);
5377 RETURN_IF(HeaderSearchOpts.ModuleCachePath);
5378 RETURN_IF(HeaderSearchOpts.ModuleUserBuildPath);
5379 for (
auto &[Name,
File] : HeaderSearchOpts.PrebuiltModuleFiles)
5393 if (Input.isBuffer())
5408 auto &FileSystemOpts = *this->
FSOpts;
5430 llvm::function_ref<
bool(StringRef)> Callback)
const {
5434 [&Callback](std::string &Path) {
return Callback(StringRef(Path)); });
5462 std::vector<std::string> Args{
"-cc1"};
5464 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5490 llvm::vfs::getRealFileSystem());
5498 Diags, std::move(BaseFS));
5504 if (VFSOverlayFiles.empty())
5509 for (
const auto &
File : VFSOverlayFiles) {
5510 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5513 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5518 std::move(Buffer.get()),
nullptr,
File,
5521 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.
Result
Implement __builtin_bit_cast and related operations.
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).
std::string StackUsageFile
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
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.
std::string HLSLRecordCommandLine
The string containing the commandline for the dx.source.args metadata, if non-empty.
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 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.
llvm::SmallVector< llvm::SmallString< 8 > > HLSLParsedCommandLine
The vector contains parsed commandline for the dx.source.args metadata, if parsing was successful.
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
OptRemark OptimizationRemarkAnalysis
Selected optimizations for which we should enable optimization analyses.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
The base class of CompilerInvocation.
std::shared_ptr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::shared_ptr< AnalyzerOptions > AnalyzerOpts
Options controlling the static analyzer.
std::shared_ptr< MigratorOptions > MigratorOpts
std::shared_ptr< PreprocessorOutputOptions > PreprocessorOutputOpts
Options controlling preprocessed output.
std::shared_ptr< APINotesOptions > APINotesOpts
Options controlling API notes.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
const FrontendOptions & getFrontendOpts() const
const CodeGenOptions & getCodeGenOpts() const
void visitPathsImpl(llvm::function_ref< bool(std::string &)> Predicate)
Visits paths stored in the invocation.
llvm::function_ref< const char *(const Twine &)> StringAllocator
Command line generation.
const FileSystemOptions & getFileSystemOpts() const
std::shared_ptr< PreprocessorOptions > PPOpts
Options controlling the preprocessor (aside from #include handling).
const PreprocessorOutputOptions & getPreprocessorOutputOpts() const
void visitPaths(llvm::function_ref< bool(StringRef)> Callback) const
Visitation.
std::vector< std::string > getCC1CommandLine() const
Generate cc1-compatible command line arguments from this instance, wrapping the result as a std::vect...
std::shared_ptr< FileSystemOptions > FSOpts
Options controlling file system operations.
const AnalyzerOptions & getAnalyzerOpts() const
const MigratorOptions & getMigratorOpts() const
void generateCC1CommandLine(llvm::SmallVectorImpl< const char * > &Args, StringAllocator SA) const
Generate cc1-compatible command line arguments from this instance.
CompilerInvocationBase & deep_copy_assign(const CompilerInvocationBase &X)
const DependencyOutputOptions & getDependencyOutputOpts() const
CompilerInvocationBase & shallow_copy_assign(const CompilerInvocationBase &X)
const TargetOptions & getTargetOpts() const
std::shared_ptr< CodeGenOptions > CodeGenOpts
Options controlling IRgen and the backend.
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
const APINotesOptions & getAPINotesOpts() const
const HeaderSearchOptions & getHeaderSearchOpts() const
std::shared_ptr< HeaderSearchOptions > HSOpts
Options controlling the #include directive.
const PreprocessorOptions & getPreprocessorOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
const LangOptions & getLangOpts() const
Const getters.
std::shared_ptr< FrontendOptions > FrontendOpts
Options controlling the frontend itself.
llvm::function_ref< void(const Twine &)> ArgumentConsumer
std::shared_ptr< DependencyOutputOptions > DependencyOutputOpts
Options controlling dependency output.
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
MigratorOptions & getMigratorOpts()
AnalyzerOptions & getAnalyzerOpts()
APINotesOptions & getAPINotesOpts()
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
LangOptions & getLangOpts()
Mutable getters.
static bool checkCC1RoundTrip(ArrayRef< const char * > Args, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Check that Args can be parsed and re-serialized without change, emiting diagnostics for any differenc...
DependencyOutputOptions & getDependencyOutputOpts()
CompilerInvocation()=default
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
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()
std::string computeContextHash() const
Compute the context hash - a string that uniquely identifies compiler settings.
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/SYCL 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...
SanitizerSet UBSanFeatureIgnoredSanitize
Set of (UBSan) sanitizers that when enabled do not cause __has_feature(undefined_behavior_sanitizer) ...
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
clang::ObjCRuntime ObjCRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
SanitizerSet Sanitize
Set of enabled sanitizers.
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
bool UseTargetPathSeparator
Indicates whether to use target's platform-specific file separator when FILE macro is used and when c...
static void setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, std::vector< std::string > &Includes, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
std::string RandstructSeed
The seed used by the randomize structure layout feature.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint64_t > AllocTokenMax
Maximum number of allocation tokens (0 = target SIZE_MAX), nullopt if none set (use target SIZE_MAX).
LangStandard::Kind LangStd
The used language standard.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
bool SanitizeCoverage
Is at least one coverage instrumentation type enabled.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
The basic abstraction for the target Objective-C runtime.
bool allowsWeak() const
Does this runtime allow the use of __weak?
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
std::string getAsString() const
bool allowsARC() const
Does this runtime allow ARC at all?
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
Discrimination
Forms of extra discrimination.
ARM8_3Key
Hardware pointer-signing keys in ARM8.3.
static constexpr std::optional< PositiveAnalyzerOption > create(unsigned Val)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a pragma hdrstop to separ...
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
void resetNonModularOptions()
Reset any options that are not considered when building a module.
void addMacroUndef(StringRef Name)
std::set< std::string > DeserializedPCHDeclsToErrorOn
This is a set of names for decls that we do not want to be deserialized, and we emit an error if they...
std::vector< std::string > EmbedEntries
User specified embed entries.
void addMacroDef(StringRef Name)
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a pragma hdrstop is expected to indicate the beginnin...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
std::vector< std::pair< std::string, bool > > Macros
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
unsigned ShowMacros
Print macro definitions.
unsigned ShowCPP
Print normal preprocessed output.
unsigned ShowLineMarkers
Show #line markers.
unsigned DirectivesOnly
Process directives but do not expand macros.
Encodes a location in the source.
static bool isSupportedCXXABI(const llvm::Triple &T, Kind Kind)
static const auto & getSpelling(Kind ABIKind)
static bool usesRelativeVTables(const llvm::Triple &T)
static bool isABI(StringRef Name)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
uint64_t LargeDataThreshold
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
constexpr XRayInstrMask None
constexpr XRayInstrMask All
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
@ CXXSystem
Like System, but only used for C++.
@ Angled
Paths for '#include <>' added by '-I'.
@ CSystem
Like System, but only used for C.
@ System
Like Angled, but marks system directories.
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
@ ExternCSystem
Like System, but headers are implicitly wrapped in extern "C".
@ ObjCSystem
Like System, but only used for ObjC.
@ ObjCXXSystem
Like System, but only used for ObjC++.
@ After
Like System, but searched after the system directories.
@ GenerateHeaderUnit
Generate a C++20 header unit module from a header file.
@ VerifyPCH
Load and verify that a PCH file is usable.
@ PrintPreprocessedInput
-E mode.
@ RewriteTest
Rewriter playground.
@ ParseSyntaxOnly
Parse and perform semantic analysis.
@ TemplightDump
Dump template instantiations.
@ GenerateModuleInterface
Generate pre-compiled module from a standard C++ module interface unit.
@ EmitLLVM
Emit a .ll file.
@ PrintPreamble
Print the "preamble" of the input file.
@ InitOnly
Only execute frontend initialization.
@ ASTView
Parse ASTs and view them in Graphviz.
@ PluginAction
Run a plugin action,.
@ DumpRawTokens
Dump out raw tokens.
@ PrintDependencyDirectivesSourceMinimizerOutput
Print the output of the dependency directives source minimizer.
@ RewriteObjC
ObjC->C Rewriter.
@ RunPreprocessorOnly
Just lex, no output.
@ ModuleFileInfo
Dump information about a module file.
@ EmitCIR
Emit a .cir file.
@ DumpCompilerOptions
Dump the compiler configuration.
@ RunAnalysis
Run one or more source code analyses.
@ ASTPrint
Parse ASTs and print them.
@ GenerateReducedModuleInterface
Generate reduced module interface for a standard C++ module interface unit.
@ GenerateInterfaceStubs
Generate Interface Stub Files.
@ ASTDump
Parse ASTs and dump them.
@ DumpTokens
Dump out preprocessed tokens.
@ FixIt
Parse and apply any fixits to the source.
@ EmitAssembly
Emit a .s file.
@ EmitCodeGenOnly
Generate machine code, but don't emit anything.
@ RewriteMacros
Expand macros but not #includes.
@ EmitHTML
Translate input source into HTML.
@ GeneratePCH
Generate pre-compiled header.
@ EmitLLVMOnly
Generate LLVM IR, but do not emit anything.
@ GenerateModule
Generate pre-compiled module from a module map.
@ ASTDeclList
Parse ASTs and list Decl nodes.
bool EQ(InterpState &S, CodePtr OpPC)
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
The JSON file list parser is used to communicate input to InstallAPI.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromOverlayFiles(ArrayRef< std::string > VFSOverlayFiles, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS)
DiagnosticLevelMask
A bitmask representing the diagnostic levels used by VerifyDiagnosticConsumer.
const char * headerIncludeFormatKindToString(HeaderIncludeFormatKind K)
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
constexpr uint16_t BlockDescriptorConstantDiscriminator
Constant discriminator to be used with block descriptor pointers.
constexpr uint16_t IsaPointerConstantDiscriminator
Constant discriminator to be used with objective-c isa pointers.
const char * headerIncludeFilteringKindToString(HeaderIncludeFilteringKind K)
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ Success
Annotation was successful.
@ Parse
Parse the block; this code is always used.
constexpr uint16_t SuperPointerConstantDiscriminator
Constant discriminator to be used with objective-c superclass pointers.
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
constexpr uint16_t MethodListPointerConstantDiscriminator
Constant discriminator to be used with method list pointers.
constexpr uint16_t ClassROConstantDiscriminator
Constant discriminator to be used with objective-c class_ro_t pointers.
constexpr uint16_t InitFiniPointerConstantDiscriminator
Constant discriminator to be used with function pointers in .init_array and .fini_array.
@ C
Languages that the frontend can parse and compile.
@ CIR
LLVM IR & CIR: we accept these so that we can run the optimizer on them, and compile them to assembly...
@ Asm
Assembly: we accept this only so that we can preprocess it.
bool parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskCutoffs &Cutoffs)
Parse a single weighted value (e.g., 'undefined=0.05') from a -fsanitize= or -fno-sanitize= value lis...
@ Result
The result type of a method or function.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
XRayInstrMask parseXRayInstrValue(StringRef Value)
Parses a command line argument into a mask.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void serializeXRayInstrValue(XRayInstrSet Set, SmallVectorImpl< StringRef > &Values)
Serializes a set into a list of command line arguments.
unsigned getOptimizationLevelSize(const llvm::opt::ArgList &Args)
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
llvm::Expected< llvm::SmallVector< llvm::SmallString< 8 > > > parseEscapedCommandLine(const char *CommandLine)
Parse a space-separated command line with escaped spaces and backslashes.
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)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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)