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))
2012 if (Args.hasArg(OPT_coverage_version_EQ)) {
2013 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2014 if (CoverageVersion.size() != 4) {
2015 Diags.
Report(diag::err_drv_invalid_value)
2016 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2026 for (
const auto &A : Args) {
2028 if (A->getOption().getID() == options::OPT_o ||
2029 A->getOption().getID() == options::OPT_INPUT ||
2030 A->getOption().getID() == options::OPT_x ||
2031 A->getOption().getID() == options::OPT_fembed_bitcode ||
2032 A->getOption().matches(options::OPT_W_Group))
2035 A->render(Args, ASL);
2036 for (
const auto &arg : ASL) {
2037 StringRef ArgStr(arg);
2038 Opts.
CmdArgs.insert(Opts.
CmdArgs.end(), ArgStr.begin(), ArgStr.end());
2044 auto XRayInstrBundles =
2045 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2046 if (XRayInstrBundles.empty())
2049 for (
const auto &A : XRayInstrBundles)
2053 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2054 StringRef Name = A->getValue();
2055 if (Name ==
"full") {
2056 Opts.CFProtectionReturn = 1;
2057 Opts.CFProtectionBranch = 1;
2058 }
else if (Name ==
"return")
2059 Opts.CFProtectionReturn = 1;
2060 else if (Name ==
"branch")
2061 Opts.CFProtectionBranch = 1;
2062 else if (Name !=
"none")
2063 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2066 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2067 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2069 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2070#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2071 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2072#include "clang/Basic/CFProtectionOptions.def"
2075 Opts.setCFBranchLabelScheme(Scheme);
2077 Diags.
Report(diag::err_drv_invalid_value)
2078 << A->getAsString(Args) << A->getValue();
2082 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2083 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2084 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2085 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2086 .Default(llvm::FunctionReturnThunksKind::Invalid);
2089 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2090 << A->getSpelling() <<
T.getTriple();
2091 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2092 Diags.
Report(diag::err_drv_invalid_value)
2093 << A->getAsString(Args) << A->getValue();
2094 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2095 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2096 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2097 << A->getAsString(Args)
2098 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2100 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2104 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2107 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2108 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2117 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2118 StringRef Val = A->getValue();
2122 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2125 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2126 StringRef Val = A->getValue();
2129 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2135 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2136 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2140 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2141 << A->getSpelling() <<
T.str();
2143 const Option &O = A->getOption();
2144 if (O.matches(OPT_fpcc_struct_return) ||
2145 O.matches(OPT_maix_struct_return)) {
2148 assert(O.matches(OPT_freg_struct_return) ||
2149 O.matches(OPT_msvr4_struct_return));
2154 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2156 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2157 << A->getSpelling() <<
T.str();
2167 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2168 Diags.
Report(diag::err_roptr_requires_data_sections);
2170 Opts.XCOFFReadOnlyPointers =
true;
2173 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2174 if (!
T.isOSAIX() ||
T.isPPC32())
2175 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2176 << A->getSpelling() <<
T.str();
2179 bool NeedLocTracking =
false;
2182 NeedLocTracking =
true;
2184 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2186 NeedLocTracking =
true;
2189 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2191 NeedLocTracking =
true;
2201 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2211 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2214 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2215 <<
"-fdiagnostics-show-hotness";
2219 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2221 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2224 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2225 <<
"-fdiagnostics-hotness-threshold=";
2231 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2232 <<
"-fdiagnostics-hotness-threshold=";
2237 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2241 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2242 <<
"-fdiagnostics-misexpect-tolerance=";
2248 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2249 <<
"-fdiagnostics-misexpect-tolerance=";
2256 if (UsingSampleProfile)
2257 NeedLocTracking =
true;
2260 NeedLocTracking =
true;
2264 if (NeedLocTracking &&
2265 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2266 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2271 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2274 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2277 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2280 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2285 if (Args.hasArg(options::OPT_ffinite_loops))
2287 else if (Args.hasArg(options::OPT_fno_finite_loops))
2290 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2291 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2292 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2293 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2301#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2302 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2303#include "clang/Driver/Options.inc"
2304#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2309 for (
const auto &Dep : Opts.
ExtraDeps) {
2310 switch (Dep.second) {
2323 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2332 bool ShowLineMarkers) {
2336#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2337 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2338#include "clang/Driver/Options.inc"
2339#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2341 if (Args.hasArg(OPT_show_includes)) {
2356 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2357 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2358 StringRef Val = A->getValue();
2359 if (!Val.contains(
'='))
2363 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2364 StringRef Val = A->getValue();
2365 if (!Val.contains(
'='))
2372 for (
const auto &
Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2376 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2380 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2381 StringRef Val = A->getValue();
2382 if (!Val.contains(
'='))
2392 Diags.
Report(diag::err_drv_print_header_env_var_combination_cc1)
2393 << Args.getLastArg(OPT_header_include_format_EQ)->getValue()
2394 << Args.getLastArg(OPT_header_include_filtering_EQ)->getValue();
2408 }
ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2409 for (
auto *A : Args) {
2410 const Option &O = A->getOption();
2411 if (O.matches(options::OPT_fcolor_diagnostics)) {
2413 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2415 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2416 StringRef
Value(A->getValue());
2417 if (
Value ==
"always")
2419 else if (
Value ==
"never")
2421 else if (
Value ==
"auto")
2427 llvm::sys::Process::StandardErrHasColors());
2433 for (
const auto &Prefix : VerifyPrefixes) {
2436 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2439 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2441 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2442 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2452#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2453 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2454#include "clang/Driver/Options.inc"
2455#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2464#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2465 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2466#include "clang/Driver/Options.inc"
2467#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2475#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2476 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2477#include "clang/Driver/Options.inc"
2478#undef MIGRATOR_OPTION_WITH_MARSHALLING
2487#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2488 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2489#include "clang/Driver/Options.inc"
2490#undef MIGRATOR_OPTION_WITH_MARSHALLING
2495void CompilerInvocationBase::GenerateDiagnosticArgs(
2497 bool DefaultDiagColor) {
2499#define DIAG_OPTION_WITH_MARSHALLING(...) \
2500 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2501#include "clang/Driver/Options.inc"
2502#undef DIAG_OPTION_WITH_MARSHALLING
2505 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2508 if (Opts.ShowColors)
2511 if (Opts.VerifyDiagnostics &&
2516 if (Prefix !=
"expected")
2523 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2526 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2528 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2530 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2532 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2537 if (
Warning ==
"undef-prefix")
2540 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2542 Consumer(StringRef(
"-W") +
Warning);
2548 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2549 "pass-analysis",
"no-pass-analysis",
2550 "pass-missed",
"no-pass-missed"};
2551 if (llvm::is_contained(IgnoredRemarks,
Remark))
2554 Consumer(StringRef(
"-R") +
Remark);
2558 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2563std::unique_ptr<DiagnosticOptions>
2565 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2566 unsigned MissingArgIndex, MissingArgCount;
2568 Argv.slice(1), MissingArgIndex, MissingArgCount);
2571 if (std::optional<std::string> NoColor =
2572 llvm::sys::Process::GetEnv(
"NO_COLOR");
2573 NoColor && !NoColor->empty()) {
2588 bool DefaultDiagColor) {
2589 std::optional<DiagnosticsEngine> IgnoringDiags;
2593 Diags = &*IgnoringDiags;
2602#define DIAG_OPTION_WITH_MARSHALLING(...) \
2603 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2604#include "clang/Driver/Options.inc"
2605#undef DIAG_OPTION_WITH_MARSHALLING
2607 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2610 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2614 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2616 if (Args.hasArg(OPT_verify))
2621 Opts.VerifyDiagnostics =
false;
2626 "-verify-ignore-unexpected=",
2627 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2628 if (Args.hasArg(OPT_verify_ignore_unexpected))
2630 Opts.setVerifyIgnoreUnexpected(DiagMask);
2632 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2637 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2651 std::string &BlockName,
2652 unsigned &MajorVersion,
2653 unsigned &MinorVersion,
2655 std::string &UserInfo) {
2657 Arg.split(Args,
':', 5);
2658 if (Args.size() < 5)
2661 BlockName = std::string(Args[0]);
2662 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2663 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2664 if (Args[3].getAsInteger(2, Hashed))
return true;
2665 if (Args.size() > 4)
2666 UserInfo = std::string(Args[4]);
2675 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2706 OPT_emit_reduced_module_interface},
2724 OPT_print_dependency_directives_minimized_source},
2731static std::optional<frontend::ActionKind>
2734 if (ActionOpt.second == Opt.getID())
2735 return ActionOpt.first;
2737 return std::nullopt;
2741static std::optional<OptSpecifier>
2744 if (ActionOpt.first == ProgramAction)
2745 return OptSpecifier(ActionOpt.second);
2747 return std::nullopt;
2753#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2754 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2755#include "clang/Driver/Options.inc"
2756#undef FRONTEND_OPTION_WITH_MARSHALLING
2758 std::optional<OptSpecifier> ProgramActionOpt =
2762 std::function<void()> GenerateProgramAction = [&]() {
2766 if (!ProgramActionOpt) {
2769 "Frontend action without option.");
2770 GenerateProgramAction = [&]() {
2777 GenerateProgramAction = [&]() {
2785 llvm_unreachable(
"Default AST dump format.");
2792 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2805 GenerateProgramAction = [&]() {
2810 GenerateProgramAction();
2812 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2814 for (
const auto &PluginArg : PluginArgs.second)
2816 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2817 Opt.getKind(), 0, PluginArg);
2821 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2822 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2828 for (
const auto &Plugin : Opts.
Plugins)
2834 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2841 GenerateArg(Consumer, OPT_aux_target_feature, Feature);
2847 StringRef HeaderUnit =
"";
2852 HeaderUnit =
"-user";
2855 HeaderUnit =
"-system";
2858 HeaderUnit =
"-header-unit";
2861 StringRef Header = IsHeader ?
"-header" :
"";
2884 Lang =
"objective-c";
2887 Lang =
"objective-c++";
2890 Lang =
"assembler-with-cpp";
2894 "Generating -x argument for unknown language (not precompiled).");
2909 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
2913 for (
const auto &Input : Opts.
Inputs)
2914 Consumer(Input.getFile());
2923#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2924 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2925#include "clang/Driver/Options.inc"
2926#undef FRONTEND_OPTION_WITH_MARSHALLING
2929 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
2930 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
2932 assert(ProgramAction &&
"Option specifier not in Action_Group.");
2935 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
2936 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
2939 .Default(std::numeric_limits<unsigned>::max());
2941 if (Val != std::numeric_limits<unsigned>::max())
2944 Diags.
Report(diag::err_drv_invalid_value)
2945 << A->getAsString(Args) << A->getValue();
2955 Args.hasArg(OPT_interface_stub_version_EQ)
2956 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
2958 if (ArgStr ==
"experimental-yaml-elf-v1" ||
2959 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
2960 ArgStr ==
"experimental-tapi-elf-v1") {
2961 std::string ErrorMessage =
2962 "Invalid interface stub format: " + ArgStr.str() +
2964 Diags.
Report(diag::err_drv_invalid_value)
2965 <<
"Must specify a valid interface stub format type, ie: "
2966 "-interface-stub-version=ifs-v1"
2969 }
else if (!ArgStr.starts_with(
"ifs-")) {
2970 std::string ErrorMessage =
2971 "Invalid interface stub format: " + ArgStr.str() +
".";
2972 Diags.
Report(diag::err_drv_invalid_value)
2973 <<
"Must specify a valid interface stub format type, ie: "
2974 "-interface-stub-version=ifs-v1"
2989 if (!A->getSpelling().starts_with(
"-ast-dump")) {
2990 const Arg *SavedAction =
nullptr;
2991 for (
const Arg *AA :
2992 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
2993 if (AA->getOption().matches(OPT_main_file_name)) {
2994 SavedAction =
nullptr;
2995 }
else if (!SavedAction) {
2998 if (!A->getOption().matches(OPT_ast_dump_EQ))
2999 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3000 << SavedAction->getSpelling() << A->getSpelling();
3007 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3008 Opts.
Plugins.emplace_back(A->getValue(0));
3012 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3013 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3015 for (
const std::string &Arg :
3016 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3017 std::string BlockName;
3018 unsigned MajorVersion;
3019 unsigned MinorVersion;
3021 std::string UserInfo;
3023 MinorVersion, Hashed, UserInfo)) {
3024 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3031 std::make_shared<TestModuleFileExtension>(
3032 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3035 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3039 Diags.
Report(diag::err_drv_invalid_value)
3040 << A->getAsString(Args) << A->getValue();
3043 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3044 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3045 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3047 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3048 StringRef Val = A->getValue();
3049 if (!Val.contains(
'='))
3054 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3056 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3059 if (Args.hasArg(OPT_aux_target_cpu))
3060 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3061 if (Args.hasArg(OPT_aux_target_feature))
3066 Diags.
Report(diag::err_drv_argument_not_allowed_with)
3067 <<
"ARC migration" <<
"ObjC migration";
3071 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3072 StringRef XValue = A->getValue();
3077 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3078 bool ModuleMap = XValue.consume_back(
"-module-map");
3081 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3087 if (IsHeader || Preprocessed) {
3088 if (XValue.consume_back(
"-header-unit"))
3090 else if (XValue.consume_back(
"-system"))
3092 else if (XValue.consume_back(
"-user"))
3098 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3102 DashX = llvm::StringSwitch<InputKind>(XValue)
3118 DashX = llvm::StringSwitch<InputKind>(XValue)
3126 DashX = llvm::StringSwitch<InputKind>(XValue)
3129 .Cases(
"ast",
"pcm",
"precompiled-header",
3136 Diags.
Report(diag::err_drv_invalid_value)
3137 << A->getAsString(Args) << A->getValue();
3144 IsHeaderFile =
true;
3145 }
else if (IsHeaderFile)
3152 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3155 Inputs.push_back(
"-");
3159 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3161 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3165 StringRef(Inputs[i]).rsplit(
'.').second);
3174 bool IsSystem =
false;
3183 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3193 std::string ClangExecutable =
3194 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
3201#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3202 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3203#include "clang/Driver/Options.inc"
3204#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3219 GenerateArg(Consumer, OPT_fmodules_ignore_macro, Macro.val());
3223 std::optional<bool> IsFramework,
3224 std::optional<bool> IgnoreSysRoot) {
3225 return llvm::is_contained(Groups, Entry.
Group) &&
3226 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3227 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3236 OptSpecifier Opt = [It, Matches]() {
3241 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3255 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3262 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3268 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3273 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3281 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3283 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3293 ? OPT_internal_isystem
3294 : OPT_internal_externc_isystem;
3298 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3302 OptSpecifier Opt =
P.IsSystemHeader ? OPT_system_header_prefix
3303 : OPT_no_system_header_prefix;
3313 const std::string &WorkingDir) {
3318#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3319 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3320#include "clang/Driver/Options.inc"
3321#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3323 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3324 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3328 if (!(
P.empty() || llvm::sys::path::is_absolute(
P))) {
3329 if (WorkingDir.empty())
3330 llvm::sys::fs::make_absolute(
P);
3332 llvm::sys::fs::make_absolute(WorkingDir,
P);
3334 llvm::sys::path::remove_dots(
P);
3338 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3339 StringRef Val = A->getValue();
3340 if (Val.contains(
'=')) {
3341 auto Split = Val.split(
'=');
3343 std::string(Split.first), std::string(Split.second));
3346 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3349 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3350 StringRef MacroDef = A->getValue();
3352 llvm::CachedHashString(MacroDef.split(
'=').first));
3356 bool IsSysrootSpecified =
3357 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3361 auto PrefixHeaderPath = [IsSysrootSpecified,
3362 &Opts](
const llvm::opt::Arg *A,
3363 bool IsFramework =
false) -> std::string {
3364 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3365 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3367 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3368 llvm::StringRef(A->getValue()).substr(1));
3369 return std::string(Buffer);
3371 return A->getValue();
3374 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3375 bool IsFramework = A->getOption().matches(OPT_F);
3381 StringRef Prefix =
"";
3382 for (
const auto *A :
3383 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3384 if (A->getOption().matches(OPT_iprefix))
3385 Prefix = A->getValue();
3386 else if (A->getOption().matches(OPT_iwithprefix))
3392 for (
const auto *A : Args.filtered(OPT_idirafter))
3394 for (
const auto *A : Args.filtered(OPT_iquote))
3397 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3398 if (A->getOption().matches(OPT_iwithsysroot)) {
3405 for (
const auto *A : Args.filtered(OPT_iframework))
3407 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3412 for (
const auto *A : Args.filtered(OPT_c_isystem))
3414 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3416 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3418 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3422 for (
const auto *A :
3423 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3425 if (A->getOption().matches(OPT_internal_externc_isystem))
3427 Opts.
AddPath(A->getValue(), Group,
false,
true);
3431 for (
const auto *A :
3432 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3434 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3436 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3445 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3454 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3456 diags.
Report(diag::err_drv_invalid_value)
3457 << A->getAsString(Args) << A->getValue();
3459 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3465 if (Opts.PointerAuthIntrinsics)
3467 if (Opts.PointerAuthCalls)
3469 if (Opts.PointerAuthReturns)
3471 if (Opts.PointerAuthIndirectGotos)
3472 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3473 if (Opts.PointerAuthAuthTraps)
3475 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3476 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3477 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3478 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3479 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3480 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3481 if (Opts.PointerAuthFunctionTypeDiscrimination)
3482 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3483 if (Opts.PointerAuthInitFini)
3485 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3486 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3487 if (Opts.PointerAuthELFGOT)
3489 if (Opts.AArch64JumpTableHardening)
3490 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3495 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3496 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3497 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3498 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3499 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3500 Opts.PointerAuthVTPtrAddressDiscrimination =
3501 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3502 Opts.PointerAuthVTPtrTypeDiscrimination =
3503 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3504 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3505 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3506 Opts.PointerAuthFunctionTypeDiscrimination =
3507 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3508 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3509 Opts.PointerAuthInitFiniAddressDiscrimination =
3510 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3511 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3512 Opts.AArch64JumpTableHardening =
3513 Args.hasArg(OPT_faarch64_jump_table_hardening);
3523 llvm_unreachable(
"should not parse language flags for this input");
3558 llvm_unreachable(
"unexpected input language");
3567 return "Objective-C";
3571 return "Objective-C++";
3575 return "C++ for OpenCL";
3594 llvm_unreachable(
"unknown input language");
3597void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3599 const llvm::Triple &
T,
3604 if (Opts.ObjCAutoRefCount)
3606 if (Opts.PICLevel != 0)
3607 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3611 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3616 OptSpecifier StdOpt;
3618 case LangStandard::lang_opencl10:
3619 case LangStandard::lang_opencl11:
3620 case LangStandard::lang_opencl12:
3621 case LangStandard::lang_opencl20:
3622 case LangStandard::lang_opencl30:
3623 case LangStandard::lang_openclcpp10:
3624 case LangStandard::lang_openclcpp2021:
3625 StdOpt = OPT_cl_std_EQ;
3628 StdOpt = OPT_std_EQ;
3635 if (Opts.IncludeDefaultHeader)
3636 GenerateArg(Consumer, OPT_finclude_default_header);
3637 if (Opts.DeclareOpenCLBuiltins)
3638 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3642#define LANG_OPTION_WITH_MARSHALLING(...) \
3643 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3644#include "clang/Driver/Options.inc"
3645#undef LANG_OPTION_WITH_MARSHALLING
3656 else if (Opts.ObjCAutoRefCount == 1)
3659 if (Opts.ObjCWeakRuntime)
3660 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3665 if (Opts.ObjCSubscriptingLegacyRuntime)
3666 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3669 if (Opts.GNUCVersion != 0) {
3670 unsigned Major = Opts.GNUCVersion / 100 / 100;
3671 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3672 unsigned Patch = Opts.GNUCVersion % 100;
3674 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3677 if (Opts.IgnoreXCOFFVisibility)
3678 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3687 if (Opts.MSCompatibilityVersion != 0) {
3688 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3689 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3690 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3691 GenerateArg(Consumer, OPT_fms_compatibility_version,
3692 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3695 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3697 if (!Opts.Trigraphs)
3704 if (
T.isOSzOS() && !Opts.ZOSExt)
3706 else if (Opts.ZOSExt)
3709 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3712 if (Opts.ConvergentFunctions)
3715 GenerateArg(Consumer, OPT_fno_convergent_functions);
3717 if (Opts.NoBuiltin && !Opts.Freestanding)
3720 if (!Opts.NoBuiltin)
3724 if (Opts.LongDoubleSize == 128)
3726 else if (Opts.LongDoubleSize == 64)
3728 else if (Opts.LongDoubleSize == 80)
3735 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3738 if (Opts.OpenMP != 51)
3739 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3741 if (!Opts.OpenMPUseTLS)
3744 if (Opts.OpenMPIsTargetDevice)
3745 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3747 if (Opts.OpenMPIRBuilder)
3748 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3751 if (Opts.OpenMPSimd) {
3754 if (Opts.OpenMP != 51)
3755 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3758 if (Opts.OpenMPThreadSubscription)
3759 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3761 if (Opts.OpenMPTeamSubscription)
3762 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3764 if (Opts.OpenMPTargetDebug != 0)
3765 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3766 Twine(Opts.OpenMPTargetDebug));
3768 if (Opts.OpenMPCUDANumSMs != 0)
3769 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3770 Twine(Opts.OpenMPCUDANumSMs));
3772 if (Opts.OpenMPCUDABlocksPerSM != 0)
3773 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3774 Twine(Opts.OpenMPCUDABlocksPerSM));
3776 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3777 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3778 Twine(Opts.OpenMPCUDAReductionBufNum));
3781 std::string Targets;
3782 llvm::raw_string_ostream OS(Targets);
3785 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3786 GenerateArg(Consumer, OPT_fopenmp_targets_EQ, Targets);
3792 if (Opts.OpenMPCUDAMode)
3812 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3815 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3819 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3821 switch (Opts.getClangABICompat()) {
3823 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"3.8");
3826 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"4.0");
3829 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"6.0");
3832 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"7.0");
3835 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"9.0");
3838 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"11.0");
3841 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"12.0");
3844 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"14.0");
3847 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"15.0");
3850 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"17.0");
3853 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"18.0");
3856 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"19.0");
3862 if (Opts.getSignReturnAddressScope() ==
3864 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3865 else if (Opts.getSignReturnAddressScope() ==
3867 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3869 if (Opts.getSignReturnAddressKey() ==
3871 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3877 if (Opts.RelativeCXXABIVTables)
3878 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3880 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3888 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3894bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3896 std::vector<std::string> &Includes,
3906 if (Args.hasArg(OPT_fobjc_arc))
3907 Opts.ObjCAutoRefCount = 1;
3911 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
3923 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
3926 Diags.
Report(diag::err_drv_invalid_value)
3927 << A->getAsString(Args) << A->getValue();
3929 for (
unsigned KindValue = 0;
3935 auto Diag = Diags.
Report(diag::note_drv_use_standard);
3936 Diag <<
Std.getName() <<
Std.getDescription();
3937 unsigned NumAliases = 0;
3938#define LANGSTANDARD(id, name, lang, desc, features)
3939#define LANGSTANDARD_ALIAS(id, alias) \
3940 if (KindValue == LangStandard::lang_##id) ++NumAliases;
3941#define LANGSTANDARD_ALIAS_DEPR(id, alias)
3942#include "clang/Basic/LangStandards.def"
3944#define LANGSTANDARD(id, name, lang, desc, features)
3945#define LANGSTANDARD_ALIAS(id, alias) \
3946 if (KindValue == LangStandard::lang_##id) Diag << alias;
3947#define LANGSTANDARD_ALIAS_DEPR(id, alias)
3948#include "clang/Basic/LangStandards.def"
3956 Diags.
Report(diag::err_drv_argument_not_allowed_with)
3964 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
3966 = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
3967 .Cases(
"cl",
"CL", LangStandard::lang_opencl10)
3968 .Cases(
"cl1.0",
"CL1.0", LangStandard::lang_opencl10)
3969 .Cases(
"cl1.1",
"CL1.1", LangStandard::lang_opencl11)
3970 .Cases(
"cl1.2",
"CL1.2", LangStandard::lang_opencl12)
3971 .Cases(
"cl2.0",
"CL2.0", LangStandard::lang_opencl20)
3972 .Cases(
"cl3.0",
"CL3.0", LangStandard::lang_opencl30)
3973 .Cases(
"clc++",
"CLC++", LangStandard::lang_openclcpp10)
3974 .Cases(
"clc++1.0",
"CLC++1.0", LangStandard::lang_openclcpp10)
3975 .Cases(
"clc++2021",
"CLC++2021", LangStandard::lang_openclcpp2021)
3979 Diags.
Report(diag::err_drv_invalid_value)
3980 << A->getAsString(Args) << A->getValue();
3983 LangStd = OpenCLLangStd;
3987 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
3988 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
3996#define LANG_OPTION_WITH_MARSHALLING(...) \
3997 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3998#include "clang/Driver/Options.inc"
3999#undef LANG_OPTION_WITH_MARSHALLING
4001 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4002 StringRef Name = A->getValue();
4003 if (Name ==
"full" || Name ==
"branch") {
4004 Opts.CFProtectionBranch = 1;
4008 if (Opts.CFProtectionBranch) {
4009 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4011 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4012#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4013 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4014#include "clang/Basic/CFProtectionOptions.def"
4016 Opts.setCFBranchLabelScheme(Scheme);
4020 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4021 !Args.hasArg(OPT_sycl_std_EQ)) {
4031 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4032 StringRef value =
arg->getValue();
4034 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4037 if (Args.hasArg(OPT_fobjc_gc_only))
4039 else if (Args.hasArg(OPT_fobjc_gc))
4041 else if (Args.hasArg(OPT_fobjc_arc)) {
4042 Opts.ObjCAutoRefCount = 1;
4044 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4051 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4052 Opts.ObjCWeakRuntime = 1;
4058 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4059 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4060 assert(!Opts.ObjCWeak);
4062 Diags.
Report(diag::err_objc_weak_with_gc);
4063 }
else if (!Opts.ObjCWeakRuntime) {
4064 Diags.
Report(diag::err_objc_weak_unsupported);
4068 }
else if (Opts.ObjCAutoRefCount) {
4069 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4072 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4073 Opts.ObjCSubscriptingLegacyRuntime =
4077 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4080 VersionTuple GNUCVer;
4081 bool Invalid = GNUCVer.tryParse(A->getValue());
4082 unsigned Major = GNUCVer.getMajor();
4083 unsigned Minor = GNUCVer.getMinor().value_or(0);
4084 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4085 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4086 Diags.
Report(diag::err_drv_invalid_value)
4087 << A->getAsString(Args) << A->getValue();
4089 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4092 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4093 Opts.IgnoreXCOFFVisibility = 1;
4095 if (Args.hasArg(OPT_ftrapv)) {
4099 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4101 else if (Args.hasArg(OPT_fwrapv))
4104 Opts.MSCompatibilityVersion = 0;
4105 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4107 if (VT.tryParse(A->getValue()))
4108 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4110 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4111 VT.getMinor().value_or(0) * 100000 +
4112 VT.getSubminor().value_or(0);
4120 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4123 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4126 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4128 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4129 && Opts.OpenCLVersion == 200);
4131 bool HasConvergentOperations = Opts.OpenMPIsTargetDevice || Opts.OpenCL ||
4132 Opts.CUDAIsDevice || Opts.SYCLIsDevice ||
4133 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4134 Opts.ConvergentFunctions =
4135 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4136 HasConvergentOperations);
4138 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4139 if (!Opts.NoBuiltin)
4141 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4142 if (A->getOption().matches(options::OPT_mlong_double_64))
4143 Opts.LongDoubleSize = 64;
4144 else if (A->getOption().matches(options::OPT_mlong_double_80))
4145 Opts.LongDoubleSize = 80;
4146 else if (A->getOption().matches(options::OPT_mlong_double_128))
4147 Opts.LongDoubleSize = 128;
4149 Opts.LongDoubleSize = 0;
4151 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4157 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4159 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4160 << A->getSpelling() <<
"-fdefault-calling-conv";
4162 switch (
T.getArch()) {
4163 case llvm::Triple::x86:
4166 case llvm::Triple::m68k:
4170 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4171 << A->getSpelling() <<
T.getTriple();
4177 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4179 bool IsSimdSpecified =
4180 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4182 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4184 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4185 Opts.OpenMPIsTargetDevice =
4186 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4187 Opts.OpenMPIRBuilder =
4188 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4189 bool IsTargetSpecified =
4190 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ);
4192 if (Opts.OpenMP || Opts.OpenMPSimd) {
4194 Args, OPT_fopenmp_version_EQ,
4195 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4196 Opts.OpenMP = Version;
4199 if (!Opts.OpenMPIsTargetDevice) {
4200 switch (
T.getArch()) {
4204 case llvm::Triple::nvptx:
4205 case llvm::Triple::nvptx64:
4206 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4214 if ((Opts.OpenMPIsTargetDevice && (
T.isNVPTX() ||
T.isAMDGCN())) ||
4215 Opts.OpenCLCPlusPlus) {
4217 Opts.Exceptions = 0;
4218 Opts.CXXExceptions = 0;
4220 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4221 Opts.OpenMPCUDANumSMs =
4223 Opts.OpenMPCUDANumSMs, Diags);
4224 Opts.OpenMPCUDABlocksPerSM =
4226 Opts.OpenMPCUDABlocksPerSM, Diags);
4228 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4229 Opts.OpenMPCUDAReductionBufNum, Diags);
4234 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4235 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4237 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4238 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4239 Opts.OpenMPTargetDebug = 1;
4242 if (Opts.OpenMPIsTargetDevice) {
4243 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4244 Opts.OpenMPTeamSubscription =
true;
4245 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4246 Opts.OpenMPThreadSubscription =
true;
4250 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
4251 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4252 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4253 if (
T.isArch16Bit())
4255 if (
T.isArch32Bit())
4257 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4261 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4262 llvm::Triple TT(A->getValue(i));
4264 if (TT.getArch() == llvm::Triple::UnknownArch ||
4265 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
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{
"-cc1"};
5171 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5197 llvm::vfs::getRealFileSystem());
5205 Diags, std::move(BaseFS));
5211 if (VFSOverlayFiles.empty())
5216 for (
const auto &
File : VFSOverlayFiles) {
5217 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5220 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5225 std::move(Buffer.get()),
nullptr,
File,
5228 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 unsigned getOptimizationLevelSize(ArgList &Args)
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)
llvm::function_ref< bool(CompilerInvocation &, ArrayRef< const char * >, DiagnosticsEngine &, const char *)> ParseFn
llvm::function_ref< void(CompilerInvocation &, SmallVectorImpl< const char * > &, CompilerInvocation::StringAllocator)> GenerateFn
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 void GenerateAPINotesArgs(const APINotesOptions &Opts, ArgumentConsumer Consumer)
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 void setPGOUseInstrumentor(CodeGenOptions &Opts, const Twine &ProfileName, llvm::vfs::FileSystem &FS, DiagnosticsEngine &Diags)
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 ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, const std::string &WorkingDir)
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)
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)
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)
static unsigned getOptimizationLevel(ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
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 void GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, ArgumentConsumer Consumer)
static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config, StringRef OptionName, StringRef DefaultVal)
static bool FixupInvocation(CompilerInvocation &Invocation, DiagnosticsEngine &Diags, const ArgList &Args, InputKind IK)
static void parseSanitizerKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags, SanitizerSet &S)
static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts, ArgumentConsumer Consumer)
Defines the clang::FileSystemOptions interface.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines types useful for describing an Objective-C runtime.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SanitizerKind enum.
Defines the clang::SourceLocation class and associated facilities.
Defines the clang::TargetOptions class.
Defines version macros and version-related utility functions for Clang.
Defines the clang::Visibility enumeration and various utility functions.
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.
Implements C++ ABI-specific semantic analysis functions.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::SmallVector< std::pair< std::string, std::string >, 0 > CoveragePrefixMap
Prefix replacement map for source-based code coverage to remap source file paths in coverage mapping.
SanitizerSet SanitizeMergeHandlers
Set of sanitizer checks that can merge handlers (smaller code size at the expense of debuggability).
llvm::SmallVector< std::pair< std::string, std::string >, 0 > DebugPrefixMap
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
std::string BinutilsVersion
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
std::optional< uint64_t > DiagnosticsHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
char CoverageVersion[4]
The version string to put into coverage files.
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
uint64_t LargeDataThreshold
The code model-specific large data threshold to use (-mlarge-data-threshold).
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::string CodeModel
The code model to use (-mcmodel).
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::optional< uint32_t > DiagnosticsMisExpectTolerance
The maximum percentage profiling weights can deviate from the expected values in order to be included...
std::string StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
std::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
bool hasSanitizeCoverage() const
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.
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::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< 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
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
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
AnalyzerOptionsRef AnalyzerOpts
Options controlling the static analyzer.
IntrusiveRefCntPtr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
CompilerInvocationBase & shallow_copy_assign(const CompilerInvocationBase &X)
const TargetOptions & getTargetOpts() const
std::shared_ptr< CodeGenOptions > CodeGenOpts
Options controlling IRgen and the backend.
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
const APINotesOptions & getAPINotesOpts() const
const HeaderSearchOptions & getHeaderSearchOpts() const
std::shared_ptr< HeaderSearchOptions > HSOpts
Options controlling the #include directive.
const PreprocessorOptions & getPreprocessorOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
const LangOptions & getLangOpts() const
Const getters.
std::shared_ptr< FrontendOptions > FrontendOpts
Options controlling the frontend itself.
llvm::function_ref< void(const Twine &)> ArgumentConsumer
std::shared_ptr< DependencyOutputOptions > DependencyOutputOpts
Options controlling dependency output.
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
MigratorOptions & getMigratorOpts()
AnalyzerOptions & getAnalyzerOpts()
APINotesOptions & getAPINotesOpts()
static std::string GetResourcesPath(const char *Argv0, void *MainAddr)
Get the directory where the compiler headers reside, relative to the compiler binary (found by the pa...
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
LangOptions & getLangOpts()
Mutable getters.
static bool checkCC1RoundTrip(ArrayRef< const char * > Args, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Check that Args can be parsed and re-serialized without change, emiting diagnostics for any differenc...
DependencyOutputOptions & getDependencyOutputOpts()
CompilerInvocation()=default
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
std::string getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
FileSystemOptions & getFileSystemOpts()
CompilerInvocation & operator=(const CompilerInvocation &X)
static void setDefaultPointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple)
Populate Opts with the default set of pointer authentication-related options given LangOpts and Tripl...
CodeGenOptions & getCodeGenOpts()
std::shared_ptr< LangOptions > LangOpts
Base class internals.
TargetOptions & getTargetOpts()
HeaderSearchOptions & getHeaderSearchOpts()
DiagnosticOptions & getDiagnosticOpts()
PreprocessorOutputOptions & getPreprocessorOutputOpts()
Same as CompilerInvocation, but with copy-on-write optimization.
FrontendOptions & getMutFrontendOpts()
LangOptions & getMutLangOpts()
Mutable getters.
HeaderSearchOptions & getMutHeaderSearchOpts()
MigratorOptions & getMutMigratorOpts()
PreprocessorOptions & getMutPreprocessorOpts()
APINotesOptions & getMutAPINotesOpts()
PreprocessorOutputOptions & getMutPreprocessorOutputOpts()
CodeGenOptions & getMutCodeGenOpts()
TargetOptions & getMutTargetOpts()
FileSystemOptions & getMutFileSystemOpts()
AnalyzerOptions & getMutAnalyzerOpts()
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
HeaderIncludeFormatKind HeaderIncludeFormat
The format of header information.
std::string OutputFile
The file to write dependency output to.
HeaderIncludeFilteringKind HeaderIncludeFiltering
Determine whether header information should be filtered.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
unsigned IncludeSystemHeaders
Include system header dependencies.
Used for handling and querying diagnostic IDs.
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.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
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.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
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.
std::map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
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.
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.
enum clang::FrontendOptions::@199 ARCMTAction
std::string AuxTriple
Auxiliary triple for CUDA/HIP compilation.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
A diagnostic client that ignores all diagnostics.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ None
Don't exclude any overflow patterns from sanitizers.
@ AddUnsignedOverflowTest
if (a + b < a)
@ All
Exclude all overflow patterns (below)
@ AddSignedOverflowTest
if (a + b < a)
@ PostDecrInWhile
while (count–)
@ Ver6
Attempt to be ABI-compatible with code generated by Clang 6.0.x (SVN r321711).
@ Ver18
Attempt to be ABI-compatible with code generated by Clang 18.0.x.
@ Ver4
Attempt to be ABI-compatible with code generated by Clang 4.0.x (SVN r291814).
@ Ver14
Attempt to be ABI-compatible with code generated by Clang 14.0.x.
@ Ver11
Attempt to be ABI-compatible with code generated by Clang 11.0.x (git 2e10b7a39b93).
@ Ver19
Attempt to be ABI-compatible with code generated by Clang 19.0.x.
@ Ver15
Attempt to be ABI-compatible with code generated by Clang 15.0.x.
@ Ver17
Attempt to be ABI-compatible with code generated by Clang 17.0.x.
@ Ver7
Attempt to be ABI-compatible with code generated by Clang 7.0.x (SVN r338536).
@ Latest
Conform to the underlying platform's C and C++ ABIs as closely as we can.
@ Ver3_8
Attempt to be ABI-compatible with code generated by Clang 3.8.x (SVN r257626).
@ Ver12
Attempt to be ABI-compatible with code generated by Clang 12.0.x (git 8e464dd76bef).
@ Ver9
Attempt to be ABI-compatible with code generated by Clang 9.0.x (SVN r351319).
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
clang::ObjCRuntime ObjCRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
SanitizerSet Sanitize
Set of enabled sanitizers.
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 OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
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().
LangStandard::Kind LangStd
The used language standard.
std::string OpenACCMacroOverride
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.
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 sepa...
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 beginni...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
std::vector< std::pair< std::string, bool > > Macros
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
unsigned ShowMacros
Print macro definitions.
unsigned ShowCPP
Print normal preprocessed output.
unsigned ShowLineMarkers
Show #line markers.
unsigned DirectivesOnly
Process directives but do not expand macros.
Encodes a location in the source.
static bool isSupportedCXXABI(const llvm::Triple &T, Kind Kind)
static const auto & getSpelling(Kind ABIKind)
static bool usesRelativeVTables(const llvm::Triple &T)
static bool isABI(StringRef Name)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
uint64_t LargeDataThreshold
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
Action - Represent an abstract compilation step to perform.
static std::string GetResourcesPath(StringRef BinaryPath)
Takes the path to a binary that's either in bin/ or lib/ and returns the path to clang's resource dir...
constexpr XRayInstrMask None
constexpr XRayInstrMask All
const llvm::opt::OptTable & getDriverOptTable()
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.
@ MigrateSource
Run migrator.
@ 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.
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.
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.
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ HIFIL_Only_Direct_System
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 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.
@ Result
The result type of a method or function.
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.
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
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 FunctionProtoType * T
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.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
@ Success
Template argument deduction was successful.
AnalysisInliningMode
AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
Diagnostic wrappers for TextAPI types for error reporting.
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
bool Internalize
If true, we use LLVM module internalizer.
bool PropagateAttrs
If true, we set attributes functions in the bitcode library according to our CodeGenOptions,...
std::string Filename
The filename of the bitcode file to link in.
unsigned LinkFlags
Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
Dummy tag type whose instance can be passed into the constructor to prevent creation of the reference...
LangStandard - Information about the properties of a particular language standard.
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 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 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 FunctionPointers
The ABI for C function 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 CXXVirtualFunctionPointers
The ABI for most C++ virtual function pointers, i.e. v-table entries.
bool IndirectGotos
Do indirect goto label addresses need to be authenticated?
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
bool empty() const
Returns true if no sanitizers are enabled.
SanitizerMask Mask
Bitmask of enabled sanitizers.