29#include "clang/Config/config.h"
48#include "llvm/ADT/APInt.h"
49#include "llvm/ADT/ArrayRef.h"
50#include "llvm/ADT/CachedHashString.h"
51#include "llvm/ADT/FloatingPointMode.h"
52#include "llvm/ADT/Hashing.h"
53#include "llvm/ADT/STLExtras.h"
54#include "llvm/ADT/SmallString.h"
55#include "llvm/ADT/SmallVector.h"
56#include "llvm/ADT/StringRef.h"
57#include "llvm/ADT/StringSwitch.h"
58#include "llvm/ADT/Twine.h"
59#include "llvm/Config/llvm-config.h"
60#include "llvm/Frontend/Debug/Options.h"
61#include "llvm/IR/DebugInfoMetadata.h"
62#include "llvm/Linker/Linker.h"
63#include "llvm/MC/MCTargetOptions.h"
64#include "llvm/Option/Arg.h"
65#include "llvm/Option/ArgList.h"
66#include "llvm/Option/OptSpecifier.h"
67#include "llvm/Option/OptTable.h"
68#include "llvm/Option/Option.h"
69#include "llvm/ProfileData/InstrProfReader.h"
70#include "llvm/Remarks/HotnessThresholdParser.h"
71#include "llvm/Support/CodeGen.h"
72#include "llvm/Support/Compiler.h"
73#include "llvm/Support/Error.h"
74#include "llvm/Support/ErrorHandling.h"
75#include "llvm/Support/ErrorOr.h"
76#include "llvm/Support/FileSystem.h"
77#include "llvm/Support/HashBuilder.h"
78#include "llvm/Support/MathExtras.h"
79#include "llvm/Support/MemoryBuffer.h"
80#include "llvm/Support/Path.h"
81#include "llvm/Support/Process.h"
82#include "llvm/Support/Regex.h"
83#include "llvm/Support/VersionTuple.h"
84#include "llvm/Support/VirtualFileSystem.h"
85#include "llvm/Support/raw_ostream.h"
86#include "llvm/Target/TargetOptions.h"
87#include "llvm/TargetParser/Host.h"
88#include "llvm/TargetParser/Triple.h"
101#include <type_traits>
105using namespace clang;
106using namespace driver;
107using namespace options;
118 if (Arg.getAsInteger(10, Val))
119 return llvm::createStringError(llvm::inconvertibleErrorCode(),
120 "Not an integer: %s", Arg.data());
129template <
class T> std::shared_ptr<T> make_shared_copy(
const T &
X) {
130 return std::make_shared<T>(
X);
135 return llvm::makeIntrusiveRefCnt<T>(
X);
157 LangOpts = make_shared_copy(
X.getLangOpts());
160 HSOpts = make_shared_copy(
X.getHeaderSearchOpts());
161 PPOpts = make_shared_copy(
X.getPreprocessorOpts());
166 FSOpts = make_shared_copy(
X.getFileSystemOpts());
207T &ensureOwned(std::shared_ptr<T> &Storage) {
208 if (Storage.use_count() > 1)
209 Storage = std::make_shared<T>(*Storage);
215 if (Storage.useCount() > 1)
216 Storage = llvm::makeIntrusiveRefCnt<T>(*Storage);
234 return ensureOwned(
HSOpts);
238 return ensureOwned(
PPOpts);
258 return ensureOwned(
FSOpts);
280#define OPTTABLE_STR_TABLE_CODE
281#include "clang/Driver/Options.inc"
282#undef OPTTABLE_STR_TABLE_CODE
285 return &OptionStrTable[Offset];
288#define SIMPLE_ENUM_VALUE_TABLE
289#include "clang/Driver/Options.inc"
290#undef SIMPLE_ENUM_VALUE_TABLE
296 if (Args.hasArg(Opt))
305 if (Args.hasArg(Opt))
315 unsigned SpellingOffset, Option::OptionClass,
320 const Twine &Spelling, Option::OptionClass,
326 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
330 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
332 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
334 if (Args.hasArg(Opt))
341 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
347 OptSpecifier OtherOpt) {
348 return [
Value, OtherValue,
349 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
351 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
352 return A->getOption().matches(Opt) ?
Value : OtherValue;
360 Option::OptionClass,
unsigned,
bool KeyPath) {
361 if (KeyPath ==
Value)
367 const Twine &Spelling,
368 Option::OptionClass OptClass,
unsigned,
369 const Twine &
Value) {
371 case Option::SeparateClass:
372 case Option::JoinedOrSeparateClass:
373 case Option::JoinedAndSeparateClass:
377 case Option::JoinedClass:
378 case Option::CommaJoinedClass:
379 Consumer(Spelling +
Value);
382 llvm_unreachable(
"Cannot denormalize an option with option class "
383 "incompatible with string denormalization.");
390 Option::OptionClass OptClass,
unsigned TableIndex,
T Value) {
392 TableIndex, Twine(
Value));
397 Option::OptionClass OptClass,
unsigned TableIndex,
402static std::optional<SimpleEnumValue>
404 for (
int I = 0,
E = Table.Size; I !=
E; ++I)
405 if (Name == Table.Table[I].Name)
406 return Table.Table[I];
411static std::optional<SimpleEnumValue>
413 for (
int I = 0,
E = Table.Size; I !=
E; ++I)
415 return Table.Table[I];
424 assert(TableIndex < SimpleEnumValueTablesSize);
425 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
427 auto *Arg = Args.getLastArg(Opt);
431 StringRef ArgValue = Arg->getValue();
433 return MaybeEnumVal->Value;
435 Diags.
Report(diag::err_drv_invalid_value)
436 << Arg->getAsString(Args) << ArgValue;
441 unsigned SpellingOffset,
442 Option::OptionClass OptClass,
443 unsigned TableIndex,
unsigned Value) {
444 assert(TableIndex < SimpleEnumValueTablesSize);
445 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
448 TableIndex, MaybeEnumVal->Name);
450 llvm_unreachable(
"The simple enum value was not correctly defined in "
451 "the tablegen option description");
457 unsigned SpellingOffset,
458 Option::OptionClass OptClass,
459 unsigned TableIndex,
T Value) {
461 TableIndex,
static_cast<unsigned>(
Value));
468 auto *Arg = Args.getLastArg(Opt);
471 return std::string(Arg->getValue());
474template <
typename IntTy>
478 auto *Arg = Args.getLastArg(Opt);
482 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
483 Diags.
Report(diag::err_drv_invalid_int_value)
484 << Arg->getAsString(Args) << Arg->getValue();
490static std::optional<std::vector<std::string>>
493 return Args.getAllArgValues(Opt);
497 unsigned SpellingOffset,
498 Option::OptionClass OptClass,
500 const std::vector<std::string> &Values) {
502 case Option::CommaJoinedClass: {
503 std::string CommaJoinedValue;
504 if (!Values.empty()) {
505 CommaJoinedValue.append(Values.front());
506 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
507 CommaJoinedValue.append(
",");
508 CommaJoinedValue.append(
Value);
512 Option::OptionClass::JoinedClass, TableIndex,
516 case Option::JoinedClass:
517 case Option::SeparateClass:
518 case Option::JoinedOrSeparateClass:
519 for (
const std::string &
Value : Values)
523 llvm_unreachable(
"Cannot denormalize an option with option class "
524 "incompatible with string vector denormalization.");
532 auto *Arg = Args.getLastArg(Opt);
535 return llvm::Triple::normalize(Arg->getValue());
538template <
typename T,
typename U>
540 return static_cast<T>(
Value);
544 return KeyPath |
Value;
551template <
typename T,
typename U, U Value>
556#define PARSE_OPTION_WITH_MARSHALLING( \
557 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
558 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
559 METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
560 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
562 if ((VISIBILITY) & options::CC1Option) { \
563 KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
565 KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
567 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
569 MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
574#define GENERATE_OPTION_WITH_MARSHALLING( \
575 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
576 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
577 SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, \
578 IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
579 if ((VISIBILITY) & options::CC1Option) { \
580 [&](const auto &Extracted) { \
583 static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
584 : (DEFAULT_VALUE)))) \
585 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
586 TABLE_INDEX, Extracted); \
587 }(EXTRACTOR(KEYPATH)); \
601 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
602 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
603 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
604 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
607 CodeGenOpts.ClearASTBeforeBackend =
false;
609 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
610 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
613 llvm::Triple
T(TargetOpts.
Triple);
614 llvm::Triple::ArchType Arch =
T.getArch();
619 if (LangOpts.getExceptionHandling() !=
621 T.isWindowsMSVCEnvironment())
622 Diags.
Report(diag::err_fe_invalid_exception_model)
623 <<
static_cast<unsigned>(LangOpts.getExceptionHandling()) <<
T.str();
625 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
626 Diags.
Report(diag::warn_c_kext);
628 if (LangOpts.NewAlignOverride &&
629 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
630 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
631 Diags.
Report(diag::err_fe_invalid_alignment)
632 << A->getAsString(Args) << A->getValue();
633 LangOpts.NewAlignOverride = 0;
638 if (LangOpts.CPlusPlus11) {
639 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
640 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
641 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
642 <<
bool(LangOpts.RawStringLiterals);
646 LangOpts.RawStringLiterals =
true;
650 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
651 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
654 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
655 Diags.
Report(diag::err_drv_argument_not_allowed_with)
658 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
659 Diags.
Report(diag::err_drv_argument_not_allowed_with)
662 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
663 Diags.
Report(diag::warn_ignored_hip_only_option)
664 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
666 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
667 Diags.
Report(diag::warn_ignored_hip_only_option)
668 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
677 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
678 if (LangOpts.ApproxFunc)
679 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
680 if (LangOpts.AllowFPReassoc)
681 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
682 if (LangOpts.AllowRecip)
683 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
689 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
691 Diags.
Report(diag::warn_option_invalid_ocl_version)
693 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
695 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
696 auto DefaultCC = LangOpts.getDefaultCallingConv();
700 Arch != llvm::Triple::x86;
706 Diags.
Report(diag::err_drv_argument_not_allowed_with)
707 << A->getSpelling() <<
T.getTriple();
719 unsigned DefaultOpt = 0;
722 !Args.hasArg(OPT_cl_opt_disable))
725 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
726 if (A->getOption().matches(options::OPT_O0))
729 if (A->getOption().matches(options::OPT_Ofast))
732 assert(A->getOption().matches(options::OPT_O));
734 StringRef S(A->getValue());
735 if (S ==
"s" || S ==
"z")
748 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
749 if (A->getOption().matches(options::OPT_O)) {
750 switch (A->getValue()[0]) {
764 llvm::opt::OptSpecifier OptSpecifier) {
767 Option::OptionClass::FlagClass, 0);
771 llvm::opt::OptSpecifier OptSpecifier,
772 const Twine &
Value) {
810 bool CheckAgainstOriginalInvocation =
false,
811 bool ForceRoundTrip =
false) {
813 bool DoRoundTripDefault =
true;
815 bool DoRoundTripDefault =
false;
818 bool DoRoundTrip = DoRoundTripDefault;
819 if (ForceRoundTrip) {
822 for (
const auto *Arg : CommandLineArgs) {
823 if (Arg == StringRef(
"-round-trip-args"))
825 if (Arg == StringRef(
"-no-round-trip-args"))
833 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
838 llvm::raw_string_ostream OS(Buffer);
839 for (
const char *Arg : Args) {
840 llvm::sys::printArg(OS, Arg,
true);
852 if (!Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
859 auto Success = Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
865 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
866 Diags.
Report(diag::note_cc1_round_trip_original)
867 << SerializeArgs(CommandLineArgs);
872 llvm::BumpPtrAllocator Alloc;
873 llvm::StringSaver StringPool(Alloc);
874 auto SA = [&StringPool](
const Twine &Arg) {
875 return StringPool.save(Arg).data();
882 Generate(DummyInvocation, GeneratedArgs, SA);
888 bool Success2 = Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
893 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
894 Diags.
Report(diag::note_cc1_round_trip_generated)
895 << 1 << SerializeArgs(GeneratedArgs);
900 if (CheckAgainstOriginalInvocation)
902 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
906 Generate(RealInvocation, ComparisonArgs, SA);
911 return std::equal(A.begin(), A.end(), B.begin(), B.end(),
912 [](
const char *AElem,
const char *BElem) {
913 return StringRef(AElem) == StringRef(BElem);
920 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
921 Diags.
Report(diag::err_cc1_round_trip_mismatch);
922 Diags.
Report(diag::note_cc1_round_trip_generated)
923 << 1 << SerializeArgs(GeneratedArgs);
924 Diags.
Report(diag::note_cc1_round_trip_generated)
925 << 2 << SerializeArgs(ComparisonArgs);
929 Diags.
Report(diag::remark_cc1_round_trip_generated)
930 << 1 << SerializeArgs(GeneratedArgs);
931 Diags.
Report(diag::remark_cc1_round_trip_generated)
932 << 2 << SerializeArgs(ComparisonArgs);
944 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
948 Args.push_back(
"-cc1");
951 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
956 OptSpecifier GroupWithValue,
957 std::vector<std::string> &Diagnostics) {
958 for (
auto *A : Args.filtered(Group)) {
959 if (A->getOption().getKind() == Option::FlagClass) {
962 Diagnostics.push_back(
963 std::string(A->getOption().getName().drop_front(1)));
964 }
else if (A->getOption().matches(GroupWithValue)) {
967 Diagnostics.push_back(
968 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
971 Diagnostics.push_back(A->getValue());
982 std::vector<std::string> &Funcs) {
983 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
985 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
992#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
993 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
994#include "clang/Driver/Options.inc"
995#undef ANALYZER_OPTION_WITH_MARSHALLING
999#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1001 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
1003#include "clang/StaticAnalyzer/Core/Analyses.def"
1005 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
1011#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1013 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
1015#include "clang/StaticAnalyzer/Core/Analyses.def"
1017 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
1023#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1025 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
1027#include "clang/StaticAnalyzer/Core/Analyses.def"
1029 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
1035#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1037 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
1039#include "clang/StaticAnalyzer/Core/Analyses.def"
1041 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
1047 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1056 for (
const auto &
C : Opts.
Config)
1057 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1058 llvm::sort(SortedConfigOpts, llvm::less_first());
1060 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1063 auto Entry = ConfigOpts.
Config.find(Key);
1064 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1079#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1080 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1081#include "clang/Driver/Options.inc"
1082#undef ANALYZER_OPTION_WITH_MARSHALLING
1084 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1085 StringRef Name = A->getValue();
1087#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1088 .Case(CMDFLAG, NAME##Model)
1089#include "clang/StaticAnalyzer/Core/Analyses.def"
1092 Diags.
Report(diag::err_drv_invalid_value)
1093 << A->getAsString(Args) << Name;
1096 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1097 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1104 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1105 StringRef Name = A->getValue();
1107#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1108 .Case(CMDFLAG, PD_##NAME)
1109#include "clang/StaticAnalyzer/Core/Analyses.def"
1112 Diags.
Report(diag::err_drv_invalid_value)
1113 << A->getAsString(Args) << Name;
1119 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1120 StringRef Name = A->getValue();
1122#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1123 .Case(CMDFLAG, NAME)
1124#include "clang/StaticAnalyzer/Core/Analyses.def"
1127 Diags.
Report(diag::err_drv_invalid_value)
1128 << A->getAsString(Args) << Name;
1134 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1135 StringRef Name = A->getValue();
1137#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1138 .Case(CMDFLAG, NAME)
1139#include "clang/StaticAnalyzer/Core/Analyses.def"
1142 Diags.
Report(diag::err_drv_invalid_value)
1143 << A->getAsString(Args) << Name;
1151 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1153 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1156 StringRef CheckerAndPackageList = A->getValue();
1158 CheckerAndPackageList.split(CheckersAndPackages,
",");
1159 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1165 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1169 StringRef configList = A->getValue();
1171 configList.split(configVals,
",");
1172 for (
const auto &configVal : configVals) {
1174 std::tie(key, val) = configVal.split(
"=");
1177 diag::err_analyzer_config_no_value) << configVal;
1180 if (val.contains(
'=')) {
1182 diag::err_analyzer_config_multiple_values)
1191 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1196 Opts.
Config[key] = std::string(val);
1206 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1209 os << Args.getArgString(i);
1216 StringRef OptionName, StringRef DefaultVal) {
1217 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1222 StringRef &OptionField, StringRef Name,
1223 StringRef DefaultVal) {
1232 bool &OptionField, StringRef Name,
bool DefaultVal) {
1233 auto PossiblyInvalidVal =
1234 llvm::StringSwitch<std::optional<bool>>(
1237 .Case(
"false",
false)
1238 .Default(std::nullopt);
1240 if (!PossiblyInvalidVal) {
1242 Diags->
Report(diag::err_analyzer_config_invalid_input)
1243 << Name <<
"a boolean";
1245 OptionField = DefaultVal;
1247 OptionField = *PossiblyInvalidVal;
1252 unsigned &OptionField, StringRef Name,
1253 unsigned DefaultVal) {
1255 OptionField = DefaultVal;
1256 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1257 .getAsInteger(0, OptionField);
1258 if (Diags && HasFailed)
1259 Diags->
Report(diag::err_analyzer_config_invalid_input)
1260 << Name <<
"an unsigned";
1268#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1269 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1270#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1271#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1273 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1274 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1276#define ANALYZER_OPTION(...)
1277#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1278 SHALLOW_VAL, DEEP_VAL) \
1279 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1280 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1281#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1288 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1289 std::vector<StringRef> Checkers =
1291 std::vector<StringRef> Packages =
1295 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1297 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1299 bool IsChecker = CheckerOrPackage.contains(
'.');
1300 bool IsValidName = IsChecker
1301 ? llvm::is_contained(Checkers, CheckerOrPackage)
1302 : llvm::is_contained(Packages, CheckerOrPackage);
1305 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1306 << CheckerOrPackage;
1316 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1317 Diags->
Report(diag::err_analyzer_config_invalid_input)
1318 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1320 if (!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir))
1321 Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"ctu-dir"
1324 if (!AnOpts.ModelPath.empty() &&
1325 !llvm::sys::fs::is_directory(AnOpts.ModelPath))
1326 Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"model-path"
1335 if (
Remark.hasValidPattern()) {
1340 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1349 OptSpecifier OptEQ, StringRef Name) {
1352 auto InitializeResultPattern = [&Diags, &Args, &
Result](
const Arg *A,
1353 StringRef Pattern) {
1354 Result.Pattern = Pattern.str();
1356 std::string RegexError;
1357 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1358 if (!
Result.Regex->isValid(RegexError)) {
1359 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1360 << RegexError << A->getAsString(Args);
1367 for (Arg *A : Args) {
1368 if (A->getOption().matches(OPT_R_Joined)) {
1369 StringRef
Value = A->getValue();
1373 else if (
Value ==
"everything")
1375 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1377 else if (
Value ==
"no-everything")
1387 InitializeResultPattern(A,
".*");
1389 }
else if (A->getOption().matches(OptEQ)) {
1391 if (!InitializeResultPattern(A, A->getValue()))
1400 const std::vector<std::string> &Levels,
1404 for (
const auto &Level : Levels) {
1406 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1414 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1422 const std::vector<std::string> &Sanitizers,
1424 for (
const auto &Sanitizer : Sanitizers) {
1427 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1443 llvm::SplitString(Bundle, BundleParts,
",");
1444 for (
const auto &B : BundleParts) {
1448 D.Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1462 llvm::raw_string_ostream OS(Buffer);
1463 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1469 const Twine &ProfileName,
1470 llvm::vfs::FileSystem &FS,
1472 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(ProfileName, FS);
1473 if (
auto E = ReaderOrErr.takeError()) {
1475 "Error in reading profile %0: %1");
1476 llvm::handleAllErrors(std::move(
E), [&](
const llvm::ErrorInfoBase &EI) {
1477 Diags.
Report(DiagID) << ProfileName.str() << EI.message();
1481 std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader =
1482 std::move(ReaderOrErr.get());
1486 if (PGOReader->isIRLevelProfile() || PGOReader->hasMemoryProfile()) {
1487 if (PGOReader->hasCSIRLevelProfile())
1497 const llvm::Triple &Triple) {
1498 assert(Triple.getArch() == llvm::Triple::aarch64);
1505 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1506 : Discrimination::None);
1509 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1510 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1511 : Discrimination::None);
1513 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1528 if (
LangOpts.PointerAuthInitFini) {
1530 Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1542 const llvm::Triple &Triple,
1544 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1545 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1546 !LangOpts.AArch64JumpTableHardening)
1552void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1554 const llvm::Triple &
T,
1555 const std::string &OutputFile,
1559 if (Opts.OptimizationLevel == 0)
1562 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1564#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1565 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1566#include "clang/Driver/Options.inc"
1567#undef CODEGEN_OPTION_WITH_MARSHALLING
1569 if (Opts.OptimizationLevel > 0) {
1573 GenerateArg(Consumer, OPT_finline_hint_functions);
1578 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1579 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1580 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1581 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1583 std::optional<StringRef> DebugInfoVal;
1584 switch (Opts.DebugInfo) {
1585 case llvm::codegenoptions::DebugLineTablesOnly:
1586 DebugInfoVal =
"line-tables-only";
1588 case llvm::codegenoptions::DebugDirectivesOnly:
1589 DebugInfoVal =
"line-directives-only";
1591 case llvm::codegenoptions::DebugInfoConstructor:
1592 DebugInfoVal =
"constructor";
1594 case llvm::codegenoptions::LimitedDebugInfo:
1595 DebugInfoVal =
"limited";
1597 case llvm::codegenoptions::FullDebugInfo:
1598 DebugInfoVal =
"standalone";
1600 case llvm::codegenoptions::UnusedTypeInfo:
1601 DebugInfoVal =
"unused-types";
1603 case llvm::codegenoptions::NoDebugInfo:
1604 DebugInfoVal = std::nullopt;
1606 case llvm::codegenoptions::LocTrackingOnly:
1607 DebugInfoVal = std::nullopt;
1611 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1615 Prefix.first +
"=" + Prefix.second);
1618 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1619 Prefix.first +
"=" + Prefix.second);
1621 if (Opts.NewStructPathTBAA)
1624 if (Opts.OptimizeSize == 1)
1626 else if (Opts.OptimizeSize == 2)
1634 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1636 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1642 if (Opts.DebugNameTable ==
1643 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1645 else if (Opts.DebugNameTable ==
1646 static_cast<unsigned>(
1647 llvm::DICompileUnit::DebugNameTableKind::Default))
1650 if (Opts.DebugTemplateAlias)
1653 auto TNK = Opts.getDebugSimpleTemplateNames();
1654 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1655 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1656 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1657 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1658 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1663 if (Opts.TimePasses) {
1664 if (Opts.TimePassesPerRun)
1665 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1670 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1673 if (Opts.PrepareForThinLTO)
1682 StringRef MemProfileBasename(
"memprof.profraw");
1703 std::string InstrBundle =
1705 if (!InstrBundle.empty())
1706 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1709 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1710 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1711 else if (Opts.CFProtectionReturn)
1712 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1713 else if (Opts.CFProtectionBranch)
1714 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1716 if (Opts.CFProtectionBranch) {
1717 switch (Opts.getCFBranchLabelScheme()) {
1720#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1721 case CFBranchLabelSchemeKind::Kind: \
1722 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1724#include "clang/Basic/CFProtectionOptions.def"
1728 if (Opts.FunctionReturnThunks)
1729 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1732 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1733 F.PropagateAttrs && F.Internalize;
1735 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1739 if (Opts.EmulatedTLS)
1747 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1752 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1756 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1760 if (Opts.EnableAIXExtendedAltivecABI)
1763 if (Opts.XCOFFReadOnlyPointers)
1781 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1786 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1790 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1793 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1795 for (StringRef Sanitizer :
1797 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1799 if (!Opts.EmitVersionIdentMetadata)
1802 switch (Opts.FiniteLoops) {
1814bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1817 const llvm::Triple &
T,
1818 const std::string &OutputFile,
1824 unsigned MaxOptLevel = 3;
1825 if (OptimizationLevel > MaxOptLevel) {
1828 Diags.
Report(diag::warn_drv_optimization_value)
1829 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
1830 OptimizationLevel = MaxOptLevel;
1832 Opts.OptimizationLevel = OptimizationLevel;
1841#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1842 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1843#include "clang/Driver/Options.inc"
1844#undef CODEGEN_OPTION_WITH_MARSHALLING
1848 if (Opts.OptimizationLevel == 0) {
1850 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1851 options::OPT_finline_hint_functions,
1852 options::OPT_fno_inline_functions,
1853 options::OPT_fno_inline)) {
1856 if (A->getOption().matches(options::OPT_finline_functions))
1858 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1868 Opts.DirectAccessExternalData =
1869 Args.hasArg(OPT_fdirect_access_external_data) ||
1870 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1873 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1875 llvm::StringSwitch<unsigned>(A->getValue())
1876 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1877 .Case(
"line-directives-only",
1878 llvm::codegenoptions::DebugDirectivesOnly)
1879 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1880 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1881 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1882 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1885 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1888 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1894 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1895 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1896 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1897 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1898 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1899 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1900 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1903 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1904 auto Split = StringRef(Arg).split(
'=');
1908 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1909 auto Split = StringRef(Arg).split(
'=');
1913 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1914 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1915 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1916 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el};
1919 llvm::is_contained(DebugEntryValueArchs,
T.getArch()))
1920 Opts.EmitCallSiteInfo =
true;
1923 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1928 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1929 Args.hasArg(OPT_new_struct_path_tbaa);
1931 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1932 if (Opts.SimplifyLibCalls)
1935 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1936 (Opts.OptimizationLevel > 1));
1938 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1940 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1942 Opts.DebugNameTable =
static_cast<unsigned>(
1943 Args.hasArg(OPT_ggnu_pubnames)
1944 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1945 : Args.hasArg(OPT_gpubnames)
1946 ? llvm::DICompileUnit::DebugNameTableKind::Default
1947 : llvm::DICompileUnit::DebugNameTableKind::None);
1948 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1949 StringRef
Value = A->getValue();
1951 Diags.
Report(diag::err_drv_unsupported_option_argument)
1952 << A->getSpelling() << A->getValue();
1953 Opts.setDebugSimpleTemplateNames(
1954 StringRef(A->getValue()) ==
"simple"
1955 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1956 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1959 if (
const Arg *A = Args.getLastArg(OPT_ftime_report, OPT_ftime_report_EQ)) {
1960 Opts.TimePasses =
true;
1963 if (A->getOption().getID() == OPT_ftime_report_EQ) {
1964 StringRef Val = A->getValue();
1965 if (Val ==
"per-pass")
1966 Opts.TimePassesPerRun =
false;
1967 else if (Val ==
"per-pass-run")
1968 Opts.TimePassesPerRun =
true;
1970 Diags.
Report(diag::err_drv_invalid_value)
1971 << A->getAsString(Args) << A->getValue();
1975 Opts.PrepareForLTO =
false;
1976 Opts.PrepareForThinLTO =
false;
1977 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1978 Opts.PrepareForLTO =
true;
1979 StringRef S = A->getValue();
1981 Opts.PrepareForThinLTO =
true;
1982 else if (S !=
"full")
1983 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1984 if (Args.hasArg(OPT_funified_lto))
1985 Opts.PrepareForThinLTO =
true;
1987 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
1989 Diags.
Report(diag::err_drv_argument_only_allowed_with)
1990 << A->getAsString(Args) <<
"-x ir";
1992 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
1994 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
1996 llvm::StringSwitch<std::string>(A->getValue())
1997 .Case(
"obj", OutputFile)
1998 .Default(llvm::sys::path::filename(OutputFile).str());
2001 const char *MemProfileBasename =
"memprof.profraw";
2002 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2004 std::string(Args.getLastArgValue(OPT_fmemory_profile_EQ)));
2005 llvm::sys::path::append(
Path, MemProfileBasename);
2007 }
else if (Args.hasArg(OPT_fmemory_profile))
2011 if (Args.hasArg(OPT_coverage_version_EQ)) {
2012 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2013 if (CoverageVersion.size() != 4) {
2014 Diags.
Report(diag::err_drv_invalid_value)
2015 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2025 for (
const auto &A : Args) {
2027 if (A->getOption().getID() == options::OPT_o ||
2028 A->getOption().getID() == options::OPT_INPUT ||
2029 A->getOption().getID() == options::OPT_x ||
2030 A->getOption().getID() == options::OPT_fembed_bitcode ||
2031 A->getOption().matches(options::OPT_W_Group))
2034 A->render(Args, ASL);
2035 for (
const auto &arg : ASL) {
2036 StringRef ArgStr(arg);
2037 Opts.
CmdArgs.insert(Opts.
CmdArgs.end(), ArgStr.begin(), ArgStr.end());
2043 auto XRayInstrBundles =
2044 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2045 if (XRayInstrBundles.empty())
2048 for (
const auto &A : XRayInstrBundles)
2052 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2053 StringRef Name = A->getValue();
2054 if (Name ==
"full") {
2055 Opts.CFProtectionReturn = 1;
2056 Opts.CFProtectionBranch = 1;
2057 }
else if (Name ==
"return")
2058 Opts.CFProtectionReturn = 1;
2059 else if (Name ==
"branch")
2060 Opts.CFProtectionBranch = 1;
2061 else if (Name !=
"none")
2062 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2065 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2066 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2068 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2069#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2070 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2071#include "clang/Basic/CFProtectionOptions.def"
2074 Opts.setCFBranchLabelScheme(Scheme);
2076 Diags.
Report(diag::err_drv_invalid_value)
2077 << A->getAsString(Args) << A->getValue();
2081 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2082 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2083 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2084 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2085 .Default(llvm::FunctionReturnThunksKind::Invalid);
2088 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2089 << A->getSpelling() <<
T.getTriple();
2090 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2091 Diags.
Report(diag::err_drv_invalid_value)
2092 << A->getAsString(Args) << A->getValue();
2093 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2094 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2095 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2096 << A->getAsString(Args)
2097 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2099 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2103 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2106 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2107 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2116 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2117 StringRef Val = A->getValue();
2121 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2124 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2125 StringRef Val = A->getValue();
2128 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2134 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2135 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2139 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2140 << A->getSpelling() <<
T.str();
2142 const Option &O = A->getOption();
2143 if (O.matches(OPT_fpcc_struct_return) ||
2144 O.matches(OPT_maix_struct_return)) {
2147 assert(O.matches(OPT_freg_struct_return) ||
2148 O.matches(OPT_msvr4_struct_return));
2153 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2155 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2156 << A->getSpelling() <<
T.str();
2166 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2167 Diags.
Report(diag::err_roptr_requires_data_sections);
2169 Opts.XCOFFReadOnlyPointers =
true;
2172 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2173 if (!
T.isOSAIX() ||
T.isPPC32())
2174 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2175 << A->getSpelling() <<
T.str();
2178 bool NeedLocTracking =
false;
2181 NeedLocTracking =
true;
2183 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2185 NeedLocTracking =
true;
2188 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2190 NeedLocTracking =
true;
2200 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2210 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2213 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2214 <<
"-fdiagnostics-show-hotness";
2218 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2220 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2223 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2224 <<
"-fdiagnostics-hotness-threshold=";
2230 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2231 <<
"-fdiagnostics-hotness-threshold=";
2236 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2240 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2241 <<
"-fdiagnostics-misexpect-tolerance=";
2247 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2248 <<
"-fdiagnostics-misexpect-tolerance=";
2255 if (UsingSampleProfile)
2256 NeedLocTracking =
true;
2259 NeedLocTracking =
true;
2263 if (NeedLocTracking &&
2264 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2265 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2270 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2273 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2276 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2279 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2284 if (Args.hasArg(options::OPT_ffinite_loops))
2286 else if (Args.hasArg(options::OPT_fno_finite_loops))
2289 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2290 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2291 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2292 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2300#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2301 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2302#include "clang/Driver/Options.inc"
2303#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2308 for (
const auto &Dep : Opts.
ExtraDeps) {
2309 switch (Dep.second) {
2322 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2331 bool ShowLineMarkers) {
2335#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2336 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2337#include "clang/Driver/Options.inc"
2338#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2340 if (Args.hasArg(OPT_show_includes)) {
2355 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2356 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2357 StringRef Val = A->getValue();
2358 if (!Val.contains(
'='))
2362 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2363 StringRef Val = A->getValue();
2364 if (!Val.contains(
'='))
2371 for (
const auto &
Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2375 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2379 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2380 StringRef Val = A->getValue();
2381 if (!Val.contains(
'='))
2391 Diags.
Report(diag::err_drv_print_header_env_var_combination_cc1)
2392 << Args.getLastArg(OPT_header_include_format_EQ)->getValue()
2393 << Args.getLastArg(OPT_header_include_filtering_EQ)->getValue();
2407 }
ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2408 for (
auto *A : Args) {
2409 const Option &O = A->getOption();
2410 if (O.matches(options::OPT_fcolor_diagnostics)) {
2412 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2414 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2415 StringRef
Value(A->getValue());
2416 if (
Value ==
"always")
2418 else if (
Value ==
"never")
2420 else if (
Value ==
"auto")
2426 llvm::sys::Process::StandardErrHasColors());
2432 for (
const auto &Prefix : VerifyPrefixes) {
2435 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2438 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2440 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2441 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2451#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2452 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2453#include "clang/Driver/Options.inc"
2454#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2463#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2464 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2465#include "clang/Driver/Options.inc"
2466#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2474#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2475 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2476#include "clang/Driver/Options.inc"
2477#undef MIGRATOR_OPTION_WITH_MARSHALLING
2486#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2487 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2488#include "clang/Driver/Options.inc"
2489#undef MIGRATOR_OPTION_WITH_MARSHALLING
2494void CompilerInvocationBase::GenerateDiagnosticArgs(
2496 bool DefaultDiagColor) {
2498#define DIAG_OPTION_WITH_MARSHALLING(...) \
2499 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2500#include "clang/Driver/Options.inc"
2501#undef DIAG_OPTION_WITH_MARSHALLING
2504 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2507 if (Opts.ShowColors)
2510 if (Opts.VerifyDiagnostics &&
2515 if (Prefix !=
"expected")
2522 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2525 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2527 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2529 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2531 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2536 if (
Warning ==
"undef-prefix")
2539 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2541 Consumer(StringRef(
"-W") +
Warning);
2547 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2548 "pass-analysis",
"no-pass-analysis",
2549 "pass-missed",
"no-pass-missed"};
2550 if (llvm::is_contained(IgnoredRemarks,
Remark))
2553 Consumer(StringRef(
"-R") +
Remark);
2557 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2562std::unique_ptr<DiagnosticOptions>
2564 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2565 unsigned MissingArgIndex, MissingArgCount;
2567 Argv.slice(1), MissingArgIndex, MissingArgCount);
2570 if (std::optional<std::string> NoColor =
2571 llvm::sys::Process::GetEnv(
"NO_COLOR");
2572 NoColor && !NoColor->empty()) {
2587 bool DefaultDiagColor) {
2588 std::optional<DiagnosticsEngine> IgnoringDiags;
2592 Diags = &*IgnoringDiags;
2601#define DIAG_OPTION_WITH_MARSHALLING(...) \
2602 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2603#include "clang/Driver/Options.inc"
2604#undef DIAG_OPTION_WITH_MARSHALLING
2606 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2609 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2613 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2615 if (Args.hasArg(OPT_verify))
2620 Opts.VerifyDiagnostics =
false;
2625 "-verify-ignore-unexpected=",
2626 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2627 if (Args.hasArg(OPT_verify_ignore_unexpected))
2629 Opts.setVerifyIgnoreUnexpected(DiagMask);
2631 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2636 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2650 std::string &BlockName,
2651 unsigned &MajorVersion,
2652 unsigned &MinorVersion,
2654 std::string &UserInfo) {
2656 Arg.split(Args,
':', 5);
2657 if (Args.size() < 5)
2660 BlockName = std::string(Args[0]);
2661 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2662 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2663 if (Args[3].getAsInteger(2, Hashed))
return true;
2664 if (Args.size() > 4)
2665 UserInfo = std::string(Args[4]);
2674 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2705 OPT_emit_reduced_module_interface},
2723 OPT_print_dependency_directives_minimized_source},
2730static std::optional<frontend::ActionKind>
2733 if (ActionOpt.second == Opt.getID())
2734 return ActionOpt.first;
2736 return std::nullopt;
2740static std::optional<OptSpecifier>
2743 if (ActionOpt.first == ProgramAction)
2744 return OptSpecifier(ActionOpt.second);
2746 return std::nullopt;
2752#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2753 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2754#include "clang/Driver/Options.inc"
2755#undef FRONTEND_OPTION_WITH_MARSHALLING
2757 std::optional<OptSpecifier> ProgramActionOpt =
2761 std::function<void()> GenerateProgramAction = [&]() {
2765 if (!ProgramActionOpt) {
2768 "Frontend action without option.");
2769 GenerateProgramAction = [&]() {
2776 GenerateProgramAction = [&]() {
2784 llvm_unreachable(
"Default AST dump format.");
2791 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2804 GenerateProgramAction = [&]() {
2809 GenerateProgramAction();
2811 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2813 for (
const auto &PluginArg : PluginArgs.second)
2815 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2816 Opt.getKind(), 0, PluginArg);
2820 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2821 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2827 for (
const auto &Plugin : Opts.
Plugins)
2833 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2840 GenerateArg(Consumer, OPT_aux_target_feature, Feature);
2846 StringRef HeaderUnit =
"";
2851 HeaderUnit =
"-user";
2854 HeaderUnit =
"-system";
2857 HeaderUnit =
"-header-unit";
2860 StringRef Header = IsHeader ?
"-header" :
"";
2883 Lang =
"objective-c";
2886 Lang =
"objective-c++";
2889 Lang =
"assembler-with-cpp";
2893 "Generating -x argument for unknown language (not precompiled).");
2908 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
2912 for (
const auto &Input : Opts.
Inputs)
2913 Consumer(Input.getFile());
2922#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2923 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2924#include "clang/Driver/Options.inc"
2925#undef FRONTEND_OPTION_WITH_MARSHALLING
2928 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
2929 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
2931 assert(ProgramAction &&
"Option specifier not in Action_Group.");
2934 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
2935 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
2938 .Default(std::numeric_limits<unsigned>::max());
2940 if (Val != std::numeric_limits<unsigned>::max())
2943 Diags.
Report(diag::err_drv_invalid_value)
2944 << A->getAsString(Args) << A->getValue();
2954 Args.hasArg(OPT_interface_stub_version_EQ)
2955 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
2957 if (ArgStr ==
"experimental-yaml-elf-v1" ||
2958 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
2959 ArgStr ==
"experimental-tapi-elf-v1") {
2960 std::string ErrorMessage =
2961 "Invalid interface stub format: " + ArgStr.str() +
2963 Diags.
Report(diag::err_drv_invalid_value)
2964 <<
"Must specify a valid interface stub format type, ie: "
2965 "-interface-stub-version=ifs-v1"
2968 }
else if (!ArgStr.starts_with(
"ifs-")) {
2969 std::string ErrorMessage =
2970 "Invalid interface stub format: " + ArgStr.str() +
".";
2971 Diags.
Report(diag::err_drv_invalid_value)
2972 <<
"Must specify a valid interface stub format type, ie: "
2973 "-interface-stub-version=ifs-v1"
2988 if (!A->getSpelling().starts_with(
"-ast-dump")) {
2989 const Arg *SavedAction =
nullptr;
2990 for (
const Arg *AA :
2991 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
2992 if (AA->getOption().matches(OPT_main_file_name)) {
2993 SavedAction =
nullptr;
2994 }
else if (!SavedAction) {
2997 if (!A->getOption().matches(OPT_ast_dump_EQ))
2998 Diags.
Report(diag::err_fe_invalid_multiple_actions)
2999 << SavedAction->getSpelling() << A->getSpelling();
3006 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3007 Opts.
Plugins.emplace_back(A->getValue(0));
3011 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3012 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3014 for (
const std::string &Arg :
3015 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3016 std::string BlockName;
3017 unsigned MajorVersion;
3018 unsigned MinorVersion;
3020 std::string UserInfo;
3022 MinorVersion, Hashed, UserInfo)) {
3023 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3030 std::make_shared<TestModuleFileExtension>(
3031 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3034 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3038 Diags.
Report(diag::err_drv_invalid_value)
3039 << A->getAsString(Args) << A->getValue();
3042 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3043 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3044 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3046 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3047 StringRef Val = A->getValue();
3048 if (!Val.contains(
'='))
3053 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3055 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3058 if (Args.hasArg(OPT_aux_target_cpu))
3059 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3060 if (Args.hasArg(OPT_aux_target_feature))
3065 Diags.
Report(diag::err_drv_argument_not_allowed_with)
3066 <<
"ARC migration" <<
"ObjC migration";
3070 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3071 StringRef XValue = A->getValue();
3076 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3077 bool ModuleMap = XValue.consume_back(
"-module-map");
3080 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3086 if (IsHeader || Preprocessed) {
3087 if (XValue.consume_back(
"-header-unit"))
3089 else if (XValue.consume_back(
"-system"))
3091 else if (XValue.consume_back(
"-user"))
3097 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3101 DashX = llvm::StringSwitch<InputKind>(XValue)
3117 DashX = llvm::StringSwitch<InputKind>(XValue)
3125 DashX = llvm::StringSwitch<InputKind>(XValue)
3128 .Cases(
"ast",
"pcm",
"precompiled-header",
3135 Diags.
Report(diag::err_drv_invalid_value)
3136 << A->getAsString(Args) << A->getValue();
3143 IsHeaderFile =
true;
3144 }
else if (IsHeaderFile)
3151 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3154 Inputs.push_back(
"-");
3158 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3160 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3164 StringRef(Inputs[i]).rsplit(
'.').second);
3173 bool IsSystem =
false;
3182 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3192 std::string ClangExecutable =
3193 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
3200#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3201 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3202#include "clang/Driver/Options.inc"
3203#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3218 GenerateArg(Consumer, OPT_fmodules_ignore_macro, Macro.val());
3222 std::optional<bool> IsFramework,
3223 std::optional<bool> IgnoreSysRoot) {
3224 return llvm::is_contained(Groups, Entry.
Group) &&
3225 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3226 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3235 OptSpecifier Opt = [It, Matches]() {
3240 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3254 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3261 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3267 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3272 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3280 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3282 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3292 ? OPT_internal_isystem
3293 : OPT_internal_externc_isystem;
3297 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3301 OptSpecifier Opt =
P.IsSystemHeader ? OPT_system_header_prefix
3302 : OPT_no_system_header_prefix;
3312 const std::string &WorkingDir) {
3317#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3318 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3319#include "clang/Driver/Options.inc"
3320#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3322 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3323 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3327 if (!(
P.empty() || llvm::sys::path::is_absolute(
P))) {
3328 if (WorkingDir.empty())
3329 llvm::sys::fs::make_absolute(
P);
3331 llvm::sys::fs::make_absolute(WorkingDir,
P);
3333 llvm::sys::path::remove_dots(
P);
3337 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3338 StringRef Val = A->getValue();
3339 if (Val.contains(
'=')) {
3340 auto Split = Val.split(
'=');
3342 std::string(Split.first), std::string(Split.second));
3345 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3348 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3349 StringRef MacroDef = A->getValue();
3351 llvm::CachedHashString(MacroDef.split(
'=').first));
3355 bool IsSysrootSpecified =
3356 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3360 auto PrefixHeaderPath = [IsSysrootSpecified,
3361 &Opts](
const llvm::opt::Arg *A,
3362 bool IsFramework =
false) -> std::string {
3363 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3364 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3366 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3367 llvm::StringRef(A->getValue()).substr(1));
3368 return std::string(Buffer);
3370 return A->getValue();
3373 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3374 bool IsFramework = A->getOption().matches(OPT_F);
3380 StringRef Prefix =
"";
3381 for (
const auto *A :
3382 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3383 if (A->getOption().matches(OPT_iprefix))
3384 Prefix = A->getValue();
3385 else if (A->getOption().matches(OPT_iwithprefix))
3391 for (
const auto *A : Args.filtered(OPT_idirafter))
3393 for (
const auto *A : Args.filtered(OPT_iquote))
3396 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3397 if (A->getOption().matches(OPT_iwithsysroot)) {
3404 for (
const auto *A : Args.filtered(OPT_iframework))
3406 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3411 for (
const auto *A : Args.filtered(OPT_c_isystem))
3413 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3415 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3417 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3421 for (
const auto *A :
3422 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3424 if (A->getOption().matches(OPT_internal_externc_isystem))
3426 Opts.
AddPath(A->getValue(), Group,
false,
true);
3430 for (
const auto *A :
3431 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3433 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3435 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3444 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3453 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3455 diags.
Report(diag::err_drv_invalid_value)
3456 << A->getAsString(Args) << A->getValue();
3458 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3464 if (Opts.PointerAuthIntrinsics)
3466 if (Opts.PointerAuthCalls)
3468 if (Opts.PointerAuthReturns)
3470 if (Opts.PointerAuthIndirectGotos)
3471 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3472 if (Opts.PointerAuthAuthTraps)
3474 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3475 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3476 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3477 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3478 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3479 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3480 if (Opts.PointerAuthFunctionTypeDiscrimination)
3481 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3482 if (Opts.PointerAuthInitFini)
3484 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3485 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3486 if (Opts.PointerAuthELFGOT)
3488 if (Opts.AArch64JumpTableHardening)
3489 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3494 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3495 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3496 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3497 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3498 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3499 Opts.PointerAuthVTPtrAddressDiscrimination =
3500 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3501 Opts.PointerAuthVTPtrTypeDiscrimination =
3502 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3503 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3504 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3505 Opts.PointerAuthFunctionTypeDiscrimination =
3506 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3507 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3508 Opts.PointerAuthInitFiniAddressDiscrimination =
3509 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3510 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3511 Opts.AArch64JumpTableHardening =
3512 Args.hasArg(OPT_faarch64_jump_table_hardening);
3522 llvm_unreachable(
"should not parse language flags for this input");
3557 llvm_unreachable(
"unexpected input language");
3566 return "Objective-C";
3570 return "Objective-C++";
3574 return "C++ for OpenCL";
3593 llvm_unreachable(
"unknown input language");
3596void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3598 const llvm::Triple &
T,
3603 if (Opts.ObjCAutoRefCount)
3605 if (Opts.PICLevel != 0)
3606 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3610 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3615 OptSpecifier StdOpt;
3617 case LangStandard::lang_opencl10:
3618 case LangStandard::lang_opencl11:
3619 case LangStandard::lang_opencl12:
3620 case LangStandard::lang_opencl20:
3621 case LangStandard::lang_opencl30:
3622 case LangStandard::lang_openclcpp10:
3623 case LangStandard::lang_openclcpp2021:
3624 StdOpt = OPT_cl_std_EQ;
3627 StdOpt = OPT_std_EQ;
3634 if (Opts.IncludeDefaultHeader)
3635 GenerateArg(Consumer, OPT_finclude_default_header);
3636 if (Opts.DeclareOpenCLBuiltins)
3637 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3641#define LANG_OPTION_WITH_MARSHALLING(...) \
3642 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3643#include "clang/Driver/Options.inc"
3644#undef LANG_OPTION_WITH_MARSHALLING
3655 else if (Opts.ObjCAutoRefCount == 1)
3658 if (Opts.ObjCWeakRuntime)
3659 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3664 if (Opts.ObjCSubscriptingLegacyRuntime)
3665 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3668 if (Opts.GNUCVersion != 0) {
3669 unsigned Major = Opts.GNUCVersion / 100 / 100;
3670 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3671 unsigned Patch = Opts.GNUCVersion % 100;
3673 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3676 if (Opts.IgnoreXCOFFVisibility)
3677 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3686 if (Opts.MSCompatibilityVersion != 0) {
3687 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3688 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3689 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3690 GenerateArg(Consumer, OPT_fms_compatibility_version,
3691 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3694 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3696 if (!Opts.Trigraphs)
3703 if (
T.isOSzOS() && !Opts.ZOSExt)
3705 else if (Opts.ZOSExt)
3708 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3711 if (Opts.ConvergentFunctions)
3714 GenerateArg(Consumer, OPT_fno_convergent_functions);
3716 if (Opts.NoBuiltin && !Opts.Freestanding)
3719 if (!Opts.NoBuiltin)
3723 if (Opts.LongDoubleSize == 128)
3725 else if (Opts.LongDoubleSize == 64)
3727 else if (Opts.LongDoubleSize == 80)
3734 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3737 if (Opts.OpenMP != 51)
3738 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3740 if (!Opts.OpenMPUseTLS)
3743 if (Opts.OpenMPIsTargetDevice)
3744 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3746 if (Opts.OpenMPIRBuilder)
3747 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3750 if (Opts.OpenMPSimd) {
3753 if (Opts.OpenMP != 51)
3754 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3757 if (Opts.OpenMPThreadSubscription)
3758 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3760 if (Opts.OpenMPTeamSubscription)
3761 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3763 if (Opts.OpenMPTargetDebug != 0)
3764 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3765 Twine(Opts.OpenMPTargetDebug));
3767 if (Opts.OpenMPCUDANumSMs != 0)
3768 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3769 Twine(Opts.OpenMPCUDANumSMs));
3771 if (Opts.OpenMPCUDABlocksPerSM != 0)
3772 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3773 Twine(Opts.OpenMPCUDABlocksPerSM));
3775 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3776 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3777 Twine(Opts.OpenMPCUDAReductionBufNum));
3780 std::string Targets;
3781 llvm::raw_string_ostream OS(Targets);
3784 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3785 GenerateArg(Consumer, OPT_fopenmp_targets_EQ, Targets);
3791 if (Opts.OpenMPCUDAMode)
3811 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3814 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3818 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3820 switch (Opts.getClangABICompat()) {
3822 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"3.8");
3825 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"4.0");
3828 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"6.0");
3831 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"7.0");
3834 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"9.0");
3837 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"11.0");
3840 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"12.0");
3843 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"14.0");
3846 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"15.0");
3849 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"17.0");
3852 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"18.0");
3855 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"19.0");
3861 if (Opts.getSignReturnAddressScope() ==
3863 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3864 else if (Opts.getSignReturnAddressScope() ==
3866 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3868 if (Opts.getSignReturnAddressKey() ==
3870 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3876 if (Opts.RelativeCXXABIVTables)
3877 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3879 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3887 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3893bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3895 std::vector<std::string> &Includes,
3905 if (Args.hasArg(OPT_fobjc_arc))
3906 Opts.ObjCAutoRefCount = 1;
3910 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
3922 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
3925 Diags.
Report(diag::err_drv_invalid_value)
3926 << A->getAsString(Args) << A->getValue();
3928 for (
unsigned KindValue = 0;
3934 auto Diag = Diags.
Report(diag::note_drv_use_standard);
3935 Diag <<
Std.getName() <<
Std.getDescription();
3936 unsigned NumAliases = 0;
3937#define LANGSTANDARD(id, name, lang, desc, features)
3938#define LANGSTANDARD_ALIAS(id, alias) \
3939 if (KindValue == LangStandard::lang_##id) ++NumAliases;
3940#define LANGSTANDARD_ALIAS_DEPR(id, alias)
3941#include "clang/Basic/LangStandards.def"
3943#define LANGSTANDARD(id, name, lang, desc, features)
3944#define LANGSTANDARD_ALIAS(id, alias) \
3945 if (KindValue == LangStandard::lang_##id) Diag << alias;
3946#define LANGSTANDARD_ALIAS_DEPR(id, alias)
3947#include "clang/Basic/LangStandards.def"
3955 Diags.
Report(diag::err_drv_argument_not_allowed_with)
3963 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
3965 = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
3966 .Cases(
"cl",
"CL", LangStandard::lang_opencl10)
3967 .Cases(
"cl1.0",
"CL1.0", LangStandard::lang_opencl10)
3968 .Cases(
"cl1.1",
"CL1.1", LangStandard::lang_opencl11)
3969 .Cases(
"cl1.2",
"CL1.2", LangStandard::lang_opencl12)
3970 .Cases(
"cl2.0",
"CL2.0", LangStandard::lang_opencl20)
3971 .Cases(
"cl3.0",
"CL3.0", LangStandard::lang_opencl30)
3972 .Cases(
"clc++",
"CLC++", LangStandard::lang_openclcpp10)
3973 .Cases(
"clc++1.0",
"CLC++1.0", LangStandard::lang_openclcpp10)
3974 .Cases(
"clc++2021",
"CLC++2021", LangStandard::lang_openclcpp2021)
3978 Diags.
Report(diag::err_drv_invalid_value)
3979 << A->getAsString(Args) << A->getValue();
3982 LangStd = OpenCLLangStd;
3986 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
3987 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
3995#define LANG_OPTION_WITH_MARSHALLING(...) \
3996 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3997#include "clang/Driver/Options.inc"
3998#undef LANG_OPTION_WITH_MARSHALLING
4000 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4001 StringRef Name = A->getValue();
4002 if (Name ==
"full" || Name ==
"branch") {
4003 Opts.CFProtectionBranch = 1;
4007 if (Opts.CFProtectionBranch) {
4008 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4010 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4011#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4012 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4013#include "clang/Basic/CFProtectionOptions.def"
4015 Opts.setCFBranchLabelScheme(Scheme);
4019 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4020 !Args.hasArg(OPT_sycl_std_EQ)) {
4030 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4031 StringRef value =
arg->getValue();
4033 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4036 if (Args.hasArg(OPT_fobjc_gc_only))
4038 else if (Args.hasArg(OPT_fobjc_gc))
4040 else if (Args.hasArg(OPT_fobjc_arc)) {
4041 Opts.ObjCAutoRefCount = 1;
4043 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4050 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4051 Opts.ObjCWeakRuntime = 1;
4057 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4058 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4059 assert(!Opts.ObjCWeak);
4061 Diags.
Report(diag::err_objc_weak_with_gc);
4062 }
else if (!Opts.ObjCWeakRuntime) {
4063 Diags.
Report(diag::err_objc_weak_unsupported);
4067 }
else if (Opts.ObjCAutoRefCount) {
4068 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4071 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4072 Opts.ObjCSubscriptingLegacyRuntime =
4076 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4079 VersionTuple GNUCVer;
4080 bool Invalid = GNUCVer.tryParse(A->getValue());
4081 unsigned Major = GNUCVer.getMajor();
4082 unsigned Minor = GNUCVer.getMinor().value_or(0);
4083 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4084 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4085 Diags.
Report(diag::err_drv_invalid_value)
4086 << A->getAsString(Args) << A->getValue();
4088 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4091 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4092 Opts.IgnoreXCOFFVisibility = 1;
4094 if (Args.hasArg(OPT_ftrapv)) {
4098 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4100 else if (Args.hasArg(OPT_fwrapv))
4103 Opts.MSCompatibilityVersion = 0;
4104 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4106 if (VT.tryParse(A->getValue()))
4107 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4109 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4110 VT.getMinor().value_or(0) * 100000 +
4111 VT.getSubminor().value_or(0);
4119 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4122 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4125 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4127 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4128 && Opts.OpenCLVersion == 200);
4130 bool HasConvergentOperations = Opts.OpenMPIsTargetDevice || Opts.OpenCL ||
4131 Opts.CUDAIsDevice || Opts.SYCLIsDevice ||
4132 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4133 Opts.ConvergentFunctions =
4134 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4135 HasConvergentOperations);
4137 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4138 if (!Opts.NoBuiltin)
4140 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4141 if (A->getOption().matches(options::OPT_mlong_double_64))
4142 Opts.LongDoubleSize = 64;
4143 else if (A->getOption().matches(options::OPT_mlong_double_80))
4144 Opts.LongDoubleSize = 80;
4145 else if (A->getOption().matches(options::OPT_mlong_double_128))
4146 Opts.LongDoubleSize = 128;
4148 Opts.LongDoubleSize = 0;
4150 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4156 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4158 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4159 << A->getSpelling() <<
"-fdefault-calling-conv";
4161 switch (
T.getArch()) {
4162 case llvm::Triple::x86:
4165 case llvm::Triple::m68k:
4169 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4170 << A->getSpelling() <<
T.getTriple();
4176 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4178 bool IsSimdSpecified =
4179 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4181 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4183 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4184 Opts.OpenMPIsTargetDevice =
4185 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4186 Opts.OpenMPIRBuilder =
4187 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4188 bool IsTargetSpecified =
4189 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ);
4191 if (Opts.OpenMP || Opts.OpenMPSimd) {
4193 Args, OPT_fopenmp_version_EQ,
4194 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4195 Opts.OpenMP = Version;
4198 if (!Opts.OpenMPIsTargetDevice) {
4199 switch (
T.getArch()) {
4203 case llvm::Triple::nvptx:
4204 case llvm::Triple::nvptx64:
4205 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4213 if ((Opts.OpenMPIsTargetDevice && (
T.isNVPTX() ||
T.isAMDGCN())) ||
4214 Opts.OpenCLCPlusPlus) {
4216 Opts.Exceptions = 0;
4217 Opts.CXXExceptions = 0;
4219 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4220 Opts.OpenMPCUDANumSMs =
4222 Opts.OpenMPCUDANumSMs, Diags);
4223 Opts.OpenMPCUDABlocksPerSM =
4225 Opts.OpenMPCUDABlocksPerSM, Diags);
4227 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4228 Opts.OpenMPCUDAReductionBufNum, Diags);
4233 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4234 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4236 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4237 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4238 Opts.OpenMPTargetDebug = 1;
4241 if (Opts.OpenMPIsTargetDevice) {
4242 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4243 Opts.OpenMPTeamSubscription =
true;
4244 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4245 Opts.OpenMPThreadSubscription =
true;
4249 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
4250 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4251 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4252 if (
T.isArch16Bit())
4254 if (
T.isArch32Bit())
4256 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4260 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4261 llvm::Triple TT(A->getValue(i));
4263 if (TT.getArch() == llvm::Triple::UnknownArch ||
4264 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4265 TT.getArch() == llvm::Triple::spirv64 ||
4266 TT.getArch() == llvm::Triple::systemz ||
4267 TT.getArch() == llvm::Triple::loongarch64 ||
4268 TT.getArch() == llvm::Triple::nvptx ||
4269 TT.getArch() == llvm::Triple::nvptx64 ||
4270 TT.getArch() == llvm::Triple::amdgcn ||
4271 TT.getArch() == llvm::Triple::x86 ||
4272 TT.getArch() == llvm::Triple::x86_64))
4273 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4274 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4275 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4276 << A->getValue(i) <<
T.str();
4284 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) {
4287 Diags.
Report(diag::err_drv_omp_host_ir_file_not_found)
4292 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4293 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4294 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4297 if (Args.hasArg(options::OPT_fopenacc)) {
4298 Opts.OpenACC =
true;
4300 if (Arg *A = Args.getLastArg(options::OPT_openacc_macro_override))
4307 Opts.Optimize = Opt != 0;
4308 Opts.OptimizeSize = OptSize != 0;
4313 Opts.NoInlineDefine = !Opts.Optimize;
4314 if (Arg *InlineArg = Args.getLastArg(
4315 options::OPT_finline_functions, options::OPT_finline_hint_functions,
4316 options::OPT_fno_inline_functions, options::OPT_fno_inline))
4317 if (InlineArg->getOption().matches(options::OPT_fno_inline))
4318 Opts.NoInlineDefine =
true;
4320 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4321 StringRef Val = A->getValue();
4324 else if (Val ==
"on")
4326 else if (Val ==
"off")
4328 else if (Val ==
"fast-honor-pragmas")
4331 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4335 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4336 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4338 llvm::StringSwitch<unsigned>(A->getValue(i))
4341 .Case(
"add-unsigned-overflow-test",
4343 .Case(
"add-signed-overflow-test",
4346 .Case(
"unsigned-post-decr-while",
4355 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4356 std::vector<std::string> systemIgnorelists =
4357 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4359 systemIgnorelists.begin(),
4360 systemIgnorelists.end());
4362 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4365 StringRef Ver = A->getValue();
4366 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4367 unsigned Major, Minor = 0;
4371 if (!VerParts.first.starts_with(
"0") &&
4372 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4373 Major <= CLANG_VERSION_MAJOR &&
4375 ? VerParts.second.size() == 1 &&
4376 !VerParts.second.getAsInteger(10, Minor)
4377 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4379 if (Major == 3 && Minor <= 8)
4381 else if (Major <= 4)
4383 else if (Major <= 6)
4385 else if (Major <= 7)
4387 else if (Major <= 9)
4389 else if (Major <= 11)
4391 else if (Major <= 12)
4393 else if (Major <= 14)
4395 else if (Major <= 15)
4397 else if (Major <= 17)
4399 else if (Major <= 18)
4401 else if (Major <= 19)
4403 }
else if (Ver !=
"latest") {
4404 Diags.
Report(diag::err_drv_invalid_value)
4405 << A->getAsString(Args) << A->getValue();
4409 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4410 StringRef SignScope = A->getValue();
4412 if (SignScope.equals_insensitive(
"none"))
4413 Opts.setSignReturnAddressScope(
4415 else if (SignScope.equals_insensitive(
"all"))
4416 Opts.setSignReturnAddressScope(
4418 else if (SignScope.equals_insensitive(
"non-leaf"))
4419 Opts.setSignReturnAddressScope(
4422 Diags.
Report(diag::err_drv_invalid_value)
4423 << A->getAsString(Args) << SignScope;
4425 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4426 StringRef SignKey = A->getValue();
4427 if (!SignScope.empty() && !SignKey.empty()) {
4428 if (SignKey ==
"a_key")
4429 Opts.setSignReturnAddressKey(
4431 else if (SignKey ==
"b_key")
4432 Opts.setSignReturnAddressKey(
4435 Diags.
Report(diag::err_drv_invalid_value)
4436 << A->getAsString(Args) << SignKey;
4442 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4449 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4455 Opts.RelativeCXXABIVTables =
4456 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4457 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4461 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4462 Opts.OmitVTableRTTI =
4463 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4464 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4465 if (Opts.OmitVTableRTTI && HasRTTI)
4466 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4468 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4469 auto Split = StringRef(A).split(
'=');
4471 {std::string(
Split.first), std::string(
Split.second)});
4475 !Args.getLastArg(OPT_fno_file_reproducible) &&
4476 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4477 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4478 Args.getLastArg(OPT_ffile_reproducible));
4481 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4483 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4484 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4487 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4488 std::ifstream SeedFile(A->getValue(0));
4490 if (!SeedFile.is_open())
4491 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4497 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4504 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4506 enum { OS, Environment };
4508 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4510 if (
T.getOSName().empty()) {
4511 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4512 << ExpectedOS << OS <<
T.str();
4513 }
else if (
T.getEnvironmentName().empty()) {
4514 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4516 }
else if (!
T.isShaderStageEnvironment()) {
4517 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4522 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4523 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4524 << ShaderModel <<
T.getOSName() <<
T.str();
4529 if (Args.getLastArg(OPT_fnative_half_type)) {
4532 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4533 T.getOSVersion() >= VersionTuple(6, 2)))
4534 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4535 <<
"-enable-16bit-types" <<
true <<
Std.getName()
4536 <<
T.getOSVersion().getAsString();
4538 }
else if (
T.isSPIRVLogical()) {
4539 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4540 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4541 << VulkanEnv <<
T.getOSName() <<
T.str();
4543 if (Args.getLastArg(OPT_fnative_half_type)) {
4546 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4547 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4548 <<
"-fnative-half-type" <<
false <<
Std.getName();
4551 llvm_unreachable(
"expected DXIL or SPIR-V target");
4554 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4556 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4561 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4613 llvm_unreachable(
"invalid frontend action");
4623#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4624 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4625#include "clang/Driver/Options.inc"
4626#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4629 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4632 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl,
D);
4639 for (
const auto &M : Opts.
Macros) {
4642 if (M.first ==
"__CET__=1" && !M.second &&
4643 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4645 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4646 !CodeGenOpts.CFProtectionBranch)
4648 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4649 CodeGenOpts.CFProtectionBranch)
4652 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4655 for (
const auto &I : Opts.
Includes) {
4658 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4659 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4664 if (LangOpts.HLSL && I ==
"hlsl.h")
4674 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4680 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4683 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4697#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4698 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4699#include "clang/Driver/Options.inc"
4700#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4702 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4703 Args.hasArg(OPT_pch_through_hdrstop_use);
4705 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4708 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4709 StringRef
Value(A->getValue());
4710 size_t Comma =
Value.find(
',');
4712 unsigned EndOfLine = 0;
4714 if (Comma == StringRef::npos ||
4715 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4716 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4717 Diags.
Report(diag::err_drv_preamble_format);
4725 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4726 StringRef Name = A->getValue();
4727 if (Name ==
"branch")
4729 else if (Name ==
"return")
4731 else if (Name ==
"full")
4736 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4737 if (A->getOption().matches(OPT_D))
4744 for (
const auto *A : Args.filtered(OPT_include))
4745 Opts.
Includes.emplace_back(A->getValue());
4747 for (
const auto *A : Args.filtered(OPT_chain_include))
4750 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4751 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4753 if (Split.second.empty()) {
4754 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4761 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4762 StringRef Epoch = A->getValue();
4766 const uint64_t MaxTimestamp =
4767 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4769 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4770 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4771 << Epoch << MaxTimestamp;
4777 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4778 StringRef Val = A->getValue();
4789 Args.hasFlag(OPT_fdefine_target_os_macros,
4801#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4802 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4803#include "clang/Driver/Options.inc"
4804#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4822#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4823 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4824#include "clang/Driver/Options.inc"
4825#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4828 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4837#define TARGET_OPTION_WITH_MARSHALLING(...) \
4838 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4839#include "clang/Driver/Options.inc"
4840#undef TARGET_OPTION_WITH_MARSHALLING
4846 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
4856#define TARGET_OPTION_WITH_MARSHALLING(...) \
4857 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4858#include "clang/Driver/Options.inc"
4859#undef TARGET_OPTION_WITH_MARSHALLING
4861 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
4862 llvm::VersionTuple Version;
4863 if (Version.tryParse(A->getValue()))
4864 Diags.
Report(diag::err_drv_invalid_value)
4865 << A->getAsString(Args) << A->getValue();
4870 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
4871 llvm::VersionTuple Version;
4872 if (Version.tryParse(A->getValue()))
4873 Diags.
Report(diag::err_drv_invalid_value)
4874 << A->getAsString(Args) << A->getValue();
4882bool CompilerInvocation::CreateFromArgsImpl(
4890 unsigned MissingArgIndex, MissingArgCount;
4891 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
4892 MissingArgCount, VisibilityMask);
4896 if (MissingArgCount)
4897 Diags.
Report(diag::err_drv_missing_argument)
4898 << Args.getArgString(MissingArgIndex) << MissingArgCount;
4901 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
4902 auto ArgString = A->getAsString(Args);
4903 std::string Nearest;
4904 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
4905 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
4907 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
4908 << ArgString << Nearest;
4957 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
4958 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
4959 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
4960 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
4973 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
4979 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
4993 Diags, llvm::vfs::getRealFileSystem());
5007 const char *Argv0) {
5013 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5017 Args.push_back(
"-cc1");
5020 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5025 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5038#define LANGOPT(Name, Bits, Default, Description) HBuilder.add(LangOpts->Name);
5039#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5040 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5041#define BENIGN_LANGOPT(Name, Bits, Default, Description)
5042#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
5043#include "clang/Basic/LangOptions.def"
5048 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5065 StringRef MacroDef = Macro.first;
5067 llvm::CachedHashString(MacroDef.split(
'=').first)))
5071 HBuilder.add(Macro);
5087#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5088#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5089 HBuilder.add(diagOpts.get##Name());
5090#include "clang/Basic/DiagnosticOptions.def"
5100 ext->hashExtension(HBuilder);
5107 HBuilder.add(*Minor);
5108 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5109 HBuilder.add(*Subminor);
5111 HBuilder.add(*Build);
5121#define DEBUGOPT(Name, Bits, Default) HBuilder.add(CodeGenOpts->Name);
5122#define VALUE_DEBUGOPT(Name, Bits, Default) HBuilder.add(CodeGenOpts->Name);
5123#define ENUM_DEBUGOPT(Name, Type, Bits, Default) \
5124 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5125#define BENIGN_DEBUGOPT(Name, Bits, Default)
5126#define BENIGN_VALUE_DEBUGOPT(Name, Bits, Default)
5127#define BENIGN_ENUM_DEBUGOPT(Name, Type, Bits, Default)
5128#include "clang/Basic/DebugOptions.def"
5135 if (!SanHash.
empty())
5136 HBuilder.add(SanHash.
Mask);
5138 llvm::MD5::MD5Result
Result;
5139 HBuilder.getHasher().final(
Result);
5141 return toString(llvm::APInt(64, Hash), 36,
false);
5169 std::vector<std::string> Args{