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";
1266 unsigned DefaultVal) {
1269 if (Parsed.has_value()) {
1270 OptionField = Parsed.value();
1273 if (Diags && !Parsed.has_value())
1274 Diags->
Report(diag::err_analyzer_config_invalid_input)
1275 << Name <<
"a positive";
1279 OptionField =
Default.value();
1287#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1288 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1289#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1290#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1292 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1293 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1295#define ANALYZER_OPTION(...)
1296#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1297 SHALLOW_VAL, DEEP_VAL) \
1298 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1299 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1300#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1307 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1308 std::vector<StringRef> Checkers =
1310 std::vector<StringRef> Packages =
1314 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1316 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1318 bool IsChecker = CheckerOrPackage.contains(
'.');
1319 bool IsValidName = IsChecker
1320 ? llvm::is_contained(Checkers, CheckerOrPackage)
1321 : llvm::is_contained(Packages, CheckerOrPackage);
1324 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1325 << CheckerOrPackage;
1335 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1336 Diags->
Report(diag::err_analyzer_config_invalid_input)
1337 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1339 if (!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir))
1340 Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"ctu-dir"
1343 if (!AnOpts.ModelPath.empty() &&
1344 !llvm::sys::fs::is_directory(AnOpts.ModelPath))
1345 Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"model-path"
1354 if (
Remark.hasValidPattern()) {
1359 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1368 OptSpecifier OptEQ, StringRef Name) {
1371 auto InitializeResultPattern = [&Diags, &Args, &
Result](
const Arg *A,
1372 StringRef Pattern) {
1373 Result.Pattern = Pattern.str();
1375 std::string RegexError;
1376 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1377 if (!
Result.Regex->isValid(RegexError)) {
1378 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1379 << RegexError << A->getAsString(Args);
1386 for (Arg *A : Args) {
1387 if (A->getOption().matches(OPT_R_Joined)) {
1388 StringRef
Value = A->getValue();
1392 else if (
Value ==
"everything")
1394 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1396 else if (
Value ==
"no-everything")
1406 InitializeResultPattern(A,
".*");
1408 }
else if (A->getOption().matches(OptEQ)) {
1410 if (!InitializeResultPattern(A, A->getValue()))
1419 const std::vector<std::string> &Levels,
1423 for (
const auto &Level : Levels) {
1425 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1433 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1441 const std::vector<std::string> &Sanitizers,
1443 for (
const auto &Sanitizer : Sanitizers) {
1446 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1462 llvm::SplitString(Bundle, BundleParts,
",");
1463 for (
const auto &B : BundleParts) {
1467 D.Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1481 llvm::raw_string_ostream OS(Buffer);
1482 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1488 const Twine &ProfileName,
1489 llvm::vfs::FileSystem &FS,
1491 auto ReaderOrErr = llvm::IndexedInstrProfReader::create(ProfileName, FS);
1492 if (
auto E = ReaderOrErr.takeError()) {
1494 "Error in reading profile %0: %1");
1495 llvm::handleAllErrors(std::move(
E), [&](
const llvm::ErrorInfoBase &EI) {
1496 Diags.
Report(DiagID) << ProfileName.str() << EI.message();
1500 std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader =
1501 std::move(ReaderOrErr.get());
1505 if (PGOReader->isIRLevelProfile() || PGOReader->hasMemoryProfile()) {
1506 if (PGOReader->hasCSIRLevelProfile())
1516 const llvm::Triple &Triple) {
1517 assert(Triple.getArch() == llvm::Triple::aarch64);
1524 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1525 : Discrimination::None);
1528 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1529 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1530 : Discrimination::None);
1532 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1547 if (
LangOpts.PointerAuthInitFini) {
1549 Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1561 const llvm::Triple &Triple,
1563 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1564 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1565 !LangOpts.AArch64JumpTableHardening)
1571void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1573 const llvm::Triple &
T,
1574 const std::string &OutputFile,
1578 if (Opts.OptimizationLevel == 0)
1581 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1583#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1584 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1585#include "clang/Driver/Options.inc"
1586#undef CODEGEN_OPTION_WITH_MARSHALLING
1588 if (Opts.OptimizationLevel > 0) {
1592 GenerateArg(Consumer, OPT_finline_hint_functions);
1597 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1598 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1599 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1600 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1602 std::optional<StringRef> DebugInfoVal;
1603 switch (Opts.DebugInfo) {
1604 case llvm::codegenoptions::DebugLineTablesOnly:
1605 DebugInfoVal =
"line-tables-only";
1607 case llvm::codegenoptions::DebugDirectivesOnly:
1608 DebugInfoVal =
"line-directives-only";
1610 case llvm::codegenoptions::DebugInfoConstructor:
1611 DebugInfoVal =
"constructor";
1613 case llvm::codegenoptions::LimitedDebugInfo:
1614 DebugInfoVal =
"limited";
1616 case llvm::codegenoptions::FullDebugInfo:
1617 DebugInfoVal =
"standalone";
1619 case llvm::codegenoptions::UnusedTypeInfo:
1620 DebugInfoVal =
"unused-types";
1622 case llvm::codegenoptions::NoDebugInfo:
1623 DebugInfoVal = std::nullopt;
1625 case llvm::codegenoptions::LocTrackingOnly:
1626 DebugInfoVal = std::nullopt;
1630 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1634 Prefix.first +
"=" + Prefix.second);
1637 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1638 Prefix.first +
"=" + Prefix.second);
1640 if (Opts.NewStructPathTBAA)
1643 if (Opts.OptimizeSize == 1)
1645 else if (Opts.OptimizeSize == 2)
1653 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1655 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1661 if (Opts.DebugNameTable ==
1662 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1664 else if (Opts.DebugNameTable ==
1665 static_cast<unsigned>(
1666 llvm::DICompileUnit::DebugNameTableKind::Default))
1669 if (Opts.DebugTemplateAlias)
1672 auto TNK = Opts.getDebugSimpleTemplateNames();
1673 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1674 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1675 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1676 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1677 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1682 if (Opts.TimePasses) {
1683 if (Opts.TimePassesPerRun)
1684 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1689 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1692 if (Opts.PrepareForThinLTO)
1701 StringRef MemProfileBasename(
"memprof.profraw");
1722 std::string InstrBundle =
1724 if (!InstrBundle.empty())
1725 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1728 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1729 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1730 else if (Opts.CFProtectionReturn)
1731 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1732 else if (Opts.CFProtectionBranch)
1733 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1735 if (Opts.CFProtectionBranch) {
1736 switch (Opts.getCFBranchLabelScheme()) {
1739#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1740 case CFBranchLabelSchemeKind::Kind: \
1741 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1743#include "clang/Basic/CFProtectionOptions.def"
1747 if (Opts.FunctionReturnThunks)
1748 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1751 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1752 F.PropagateAttrs && F.Internalize;
1754 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1758 if (Opts.EmulatedTLS)
1766 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1771 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1775 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1779 if (Opts.EnableAIXExtendedAltivecABI)
1782 if (Opts.XCOFFReadOnlyPointers)
1800 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1805 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1809 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1812 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1814 for (StringRef Sanitizer :
1816 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1818 if (!Opts.EmitVersionIdentMetadata)
1821 switch (Opts.FiniteLoops) {
1833bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1836 const llvm::Triple &
T,
1837 const std::string &OutputFile,
1843 unsigned MaxOptLevel = 3;
1844 if (OptimizationLevel > MaxOptLevel) {
1847 Diags.
Report(diag::warn_drv_optimization_value)
1848 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
1849 OptimizationLevel = MaxOptLevel;
1851 Opts.OptimizationLevel = OptimizationLevel;
1860#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1861 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1862#include "clang/Driver/Options.inc"
1863#undef CODEGEN_OPTION_WITH_MARSHALLING
1867 if (Opts.OptimizationLevel == 0) {
1869 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1870 options::OPT_finline_hint_functions,
1871 options::OPT_fno_inline_functions,
1872 options::OPT_fno_inline)) {
1875 if (A->getOption().matches(options::OPT_finline_functions))
1877 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1887 Opts.DirectAccessExternalData =
1888 Args.hasArg(OPT_fdirect_access_external_data) ||
1889 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1892 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1894 llvm::StringSwitch<unsigned>(A->getValue())
1895 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1896 .Case(
"line-directives-only",
1897 llvm::codegenoptions::DebugDirectivesOnly)
1898 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1899 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1900 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1901 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1904 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1907 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1913 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1914 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1915 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1916 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1917 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1918 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1919 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1922 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1923 auto Split = StringRef(Arg).split(
'=');
1927 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1928 auto Split = StringRef(Arg).split(
'=');
1932 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1933 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1934 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1935 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el};
1938 llvm::is_contained(DebugEntryValueArchs,
T.getArch()))
1939 Opts.EmitCallSiteInfo =
true;
1942 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1947 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1948 Args.hasArg(OPT_new_struct_path_tbaa);
1950 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1951 if (Opts.SimplifyLibCalls)
1954 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1955 (Opts.OptimizationLevel > 1));
1957 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1959 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1961 Opts.DebugNameTable =
static_cast<unsigned>(
1962 Args.hasArg(OPT_ggnu_pubnames)
1963 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1964 : Args.hasArg(OPT_gpubnames)
1965 ? llvm::DICompileUnit::DebugNameTableKind::Default
1966 : llvm::DICompileUnit::DebugNameTableKind::None);
1967 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1968 StringRef
Value = A->getValue();
1970 Diags.
Report(diag::err_drv_unsupported_option_argument)
1971 << A->getSpelling() << A->getValue();
1972 Opts.setDebugSimpleTemplateNames(
1973 StringRef(A->getValue()) ==
"simple"
1974 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1975 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1978 if (
const Arg *A = Args.getLastArg(OPT_ftime_report, OPT_ftime_report_EQ)) {
1979 Opts.TimePasses =
true;
1982 if (A->getOption().getID() == OPT_ftime_report_EQ) {
1983 StringRef Val = A->getValue();
1984 if (Val ==
"per-pass")
1985 Opts.TimePassesPerRun =
false;
1986 else if (Val ==
"per-pass-run")
1987 Opts.TimePassesPerRun =
true;
1989 Diags.
Report(diag::err_drv_invalid_value)
1990 << A->getAsString(Args) << A->getValue();
1994 Opts.PrepareForLTO =
false;
1995 Opts.PrepareForThinLTO =
false;
1996 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1997 Opts.PrepareForLTO =
true;
1998 StringRef S = A->getValue();
2000 Opts.PrepareForThinLTO =
true;
2001 else if (S !=
"full")
2002 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
2003 if (Args.hasArg(OPT_funified_lto))
2004 Opts.PrepareForThinLTO =
true;
2006 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2008 Diags.
Report(diag::err_drv_argument_only_allowed_with)
2009 << A->getAsString(Args) <<
"-x ir";
2011 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2013 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2015 llvm::StringSwitch<std::string>(A->getValue())
2016 .Case(
"obj", OutputFile)
2017 .Default(llvm::sys::path::filename(OutputFile).str());
2020 const char *MemProfileBasename =
"memprof.profraw";
2021 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2023 std::string(Args.getLastArgValue(OPT_fmemory_profile_EQ)));
2024 llvm::sys::path::append(
Path, MemProfileBasename);
2026 }
else if (Args.hasArg(OPT_fmemory_profile))
2030 if (Args.hasArg(OPT_coverage_version_EQ)) {
2031 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2032 if (CoverageVersion.size() != 4) {
2033 Diags.
Report(diag::err_drv_invalid_value)
2034 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2044 for (
const auto &A : Args) {
2046 if (A->getOption().getID() == options::OPT_o ||
2047 A->getOption().getID() == options::OPT_INPUT ||
2048 A->getOption().getID() == options::OPT_x ||
2049 A->getOption().getID() == options::OPT_fembed_bitcode ||
2050 A->getOption().matches(options::OPT_W_Group))
2053 A->render(Args, ASL);
2054 for (
const auto &arg : ASL) {
2055 StringRef ArgStr(arg);
2056 Opts.
CmdArgs.insert(Opts.
CmdArgs.end(), ArgStr.begin(), ArgStr.end());
2062 auto XRayInstrBundles =
2063 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2064 if (XRayInstrBundles.empty())
2067 for (
const auto &A : XRayInstrBundles)
2071 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2072 StringRef Name = A->getValue();
2073 if (Name ==
"full") {
2074 Opts.CFProtectionReturn = 1;
2075 Opts.CFProtectionBranch = 1;
2076 }
else if (Name ==
"return")
2077 Opts.CFProtectionReturn = 1;
2078 else if (Name ==
"branch")
2079 Opts.CFProtectionBranch = 1;
2080 else if (Name !=
"none")
2081 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2084 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2085 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2087 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2088#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2089 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2090#include "clang/Basic/CFProtectionOptions.def"
2093 Opts.setCFBranchLabelScheme(Scheme);
2095 Diags.
Report(diag::err_drv_invalid_value)
2096 << A->getAsString(Args) << A->getValue();
2100 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2101 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2102 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2103 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2104 .Default(llvm::FunctionReturnThunksKind::Invalid);
2107 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2108 << A->getSpelling() <<
T.getTriple();
2109 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2110 Diags.
Report(diag::err_drv_invalid_value)
2111 << A->getAsString(Args) << A->getValue();
2112 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2113 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2114 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2115 << A->getAsString(Args)
2116 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2118 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2122 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2125 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2126 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2135 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2136 StringRef Val = A->getValue();
2140 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2143 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2144 StringRef Val = A->getValue();
2147 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2153 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2154 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2158 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2159 << A->getSpelling() <<
T.str();
2161 const Option &O = A->getOption();
2162 if (O.matches(OPT_fpcc_struct_return) ||
2163 O.matches(OPT_maix_struct_return)) {
2166 assert(O.matches(OPT_freg_struct_return) ||
2167 O.matches(OPT_msvr4_struct_return));
2172 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2174 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2175 << A->getSpelling() <<
T.str();
2185 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2186 Diags.
Report(diag::err_roptr_requires_data_sections);
2188 Opts.XCOFFReadOnlyPointers =
true;
2191 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2192 if (!
T.isOSAIX() ||
T.isPPC32())
2193 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2194 << A->getSpelling() <<
T.str();
2197 bool NeedLocTracking =
false;
2200 NeedLocTracking =
true;
2202 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2204 NeedLocTracking =
true;
2207 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2209 NeedLocTracking =
true;
2219 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2229 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2232 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2233 <<
"-fdiagnostics-show-hotness";
2237 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2239 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2242 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2243 <<
"-fdiagnostics-hotness-threshold=";
2249 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2250 <<
"-fdiagnostics-hotness-threshold=";
2255 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2259 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2260 <<
"-fdiagnostics-misexpect-tolerance=";
2266 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2267 <<
"-fdiagnostics-misexpect-tolerance=";
2274 if (UsingSampleProfile)
2275 NeedLocTracking =
true;
2278 NeedLocTracking =
true;
2282 if (NeedLocTracking &&
2283 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2284 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2289 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2292 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2295 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2298 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2303 if (Args.hasArg(options::OPT_ffinite_loops))
2305 else if (Args.hasArg(options::OPT_fno_finite_loops))
2308 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2309 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2310 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2311 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2319#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2320 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2321#include "clang/Driver/Options.inc"
2322#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2327 for (
const auto &Dep : Opts.
ExtraDeps) {
2328 switch (Dep.second) {
2341 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2350 bool ShowLineMarkers) {
2354#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2355 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2356#include "clang/Driver/Options.inc"
2357#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2359 if (Args.hasArg(OPT_show_includes)) {
2374 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2375 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2376 StringRef Val = A->getValue();
2377 if (!Val.contains(
'='))
2381 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2382 StringRef Val = A->getValue();
2383 if (!Val.contains(
'='))
2390 for (
const auto &
Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2394 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2398 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2399 StringRef Val = A->getValue();
2400 if (!Val.contains(
'='))
2410 Diags.
Report(diag::err_drv_print_header_env_var_combination_cc1)
2411 << Args.getLastArg(OPT_header_include_format_EQ)->getValue()
2412 << Args.getLastArg(OPT_header_include_filtering_EQ)->getValue();
2426 }
ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2427 for (
auto *A : Args) {
2428 const Option &O = A->getOption();
2429 if (O.matches(options::OPT_fcolor_diagnostics)) {
2431 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2433 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2434 StringRef
Value(A->getValue());
2435 if (
Value ==
"always")
2437 else if (
Value ==
"never")
2439 else if (
Value ==
"auto")
2445 llvm::sys::Process::StandardErrHasColors());
2451 for (
const auto &Prefix : VerifyPrefixes) {
2454 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2457 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2459 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2460 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2470#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2471 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2472#include "clang/Driver/Options.inc"
2473#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2482#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2483 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2484#include "clang/Driver/Options.inc"
2485#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2493#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2494 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2495#include "clang/Driver/Options.inc"
2496#undef MIGRATOR_OPTION_WITH_MARSHALLING
2505#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2506 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2507#include "clang/Driver/Options.inc"
2508#undef MIGRATOR_OPTION_WITH_MARSHALLING
2513void CompilerInvocationBase::GenerateDiagnosticArgs(
2515 bool DefaultDiagColor) {
2517#define DIAG_OPTION_WITH_MARSHALLING(...) \
2518 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2519#include "clang/Driver/Options.inc"
2520#undef DIAG_OPTION_WITH_MARSHALLING
2523 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2526 if (Opts.ShowColors)
2529 if (Opts.VerifyDiagnostics &&
2534 if (Prefix !=
"expected")
2541 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2544 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2546 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2548 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2550 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2555 if (
Warning ==
"undef-prefix")
2558 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2560 Consumer(StringRef(
"-W") +
Warning);
2566 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2567 "pass-analysis",
"no-pass-analysis",
2568 "pass-missed",
"no-pass-missed"};
2569 if (llvm::is_contained(IgnoredRemarks,
Remark))
2572 Consumer(StringRef(
"-R") +
Remark);
2576 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2581std::unique_ptr<DiagnosticOptions>
2583 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2584 unsigned MissingArgIndex, MissingArgCount;
2586 Argv.slice(1), MissingArgIndex, MissingArgCount);
2589 if (std::optional<std::string> NoColor =
2590 llvm::sys::Process::GetEnv(
"NO_COLOR");
2591 NoColor && !NoColor->empty()) {
2606 bool DefaultDiagColor) {
2607 std::optional<DiagnosticsEngine> IgnoringDiags;
2611 Diags = &*IgnoringDiags;
2620#define DIAG_OPTION_WITH_MARSHALLING(...) \
2621 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2622#include "clang/Driver/Options.inc"
2623#undef DIAG_OPTION_WITH_MARSHALLING
2625 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2628 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2632 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2634 if (Args.hasArg(OPT_verify))
2639 Opts.VerifyDiagnostics =
false;
2644 "-verify-ignore-unexpected=",
2645 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2646 if (Args.hasArg(OPT_verify_ignore_unexpected))
2648 Opts.setVerifyIgnoreUnexpected(DiagMask);
2650 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2655 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2669 std::string &BlockName,
2670 unsigned &MajorVersion,
2671 unsigned &MinorVersion,
2673 std::string &UserInfo) {
2675 Arg.split(Args,
':', 5);
2676 if (Args.size() < 5)
2679 BlockName = std::string(Args[0]);
2680 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2681 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2682 if (Args[3].getAsInteger(2, Hashed))
return true;
2683 if (Args.size() > 4)
2684 UserInfo = std::string(Args[4]);
2693 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2724 OPT_emit_reduced_module_interface},
2742 OPT_print_dependency_directives_minimized_source},
2749static std::optional<frontend::ActionKind>
2752 if (ActionOpt.second == Opt.getID())
2753 return ActionOpt.first;
2755 return std::nullopt;
2759static std::optional<OptSpecifier>
2762 if (ActionOpt.first == ProgramAction)
2763 return OptSpecifier(ActionOpt.second);
2765 return std::nullopt;
2771#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2772 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2773#include "clang/Driver/Options.inc"
2774#undef FRONTEND_OPTION_WITH_MARSHALLING
2776 std::optional<OptSpecifier> ProgramActionOpt =
2780 std::function<void()> GenerateProgramAction = [&]() {
2784 if (!ProgramActionOpt) {
2787 "Frontend action without option.");
2788 GenerateProgramAction = [&]() {
2795 GenerateProgramAction = [&]() {
2803 llvm_unreachable(
"Default AST dump format.");
2810 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2823 GenerateProgramAction = [&]() {
2828 GenerateProgramAction();
2830 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2832 for (
const auto &PluginArg : PluginArgs.second)
2834 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2835 Opt.getKind(), 0, PluginArg);
2839 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2840 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2846 for (
const auto &Plugin : Opts.
Plugins)
2852 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2859 GenerateArg(Consumer, OPT_aux_target_feature, Feature);
2865 StringRef HeaderUnit =
"";
2870 HeaderUnit =
"-user";
2873 HeaderUnit =
"-system";
2876 HeaderUnit =
"-header-unit";
2879 StringRef Header = IsHeader ?
"-header" :
"";
2902 Lang =
"objective-c";
2905 Lang =
"objective-c++";
2908 Lang =
"assembler-with-cpp";
2912 "Generating -x argument for unknown language (not precompiled).");
2927 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
2931 for (
const auto &Input : Opts.
Inputs)
2932 Consumer(Input.getFile());
2941#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2942 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2943#include "clang/Driver/Options.inc"
2944#undef FRONTEND_OPTION_WITH_MARSHALLING
2947 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
2948 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
2950 assert(ProgramAction &&
"Option specifier not in Action_Group.");
2953 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
2954 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
2957 .Default(std::numeric_limits<unsigned>::max());
2959 if (Val != std::numeric_limits<unsigned>::max())
2962 Diags.
Report(diag::err_drv_invalid_value)
2963 << A->getAsString(Args) << A->getValue();
2973 Args.hasArg(OPT_interface_stub_version_EQ)
2974 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
2976 if (ArgStr ==
"experimental-yaml-elf-v1" ||
2977 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
2978 ArgStr ==
"experimental-tapi-elf-v1") {
2979 std::string ErrorMessage =
2980 "Invalid interface stub format: " + ArgStr.str() +
2982 Diags.
Report(diag::err_drv_invalid_value)
2983 <<
"Must specify a valid interface stub format type, ie: "
2984 "-interface-stub-version=ifs-v1"
2987 }
else if (!ArgStr.starts_with(
"ifs-")) {
2988 std::string ErrorMessage =
2989 "Invalid interface stub format: " + ArgStr.str() +
".";
2990 Diags.
Report(diag::err_drv_invalid_value)
2991 <<
"Must specify a valid interface stub format type, ie: "
2992 "-interface-stub-version=ifs-v1"
3007 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3008 const Arg *SavedAction =
nullptr;
3009 for (
const Arg *AA :
3010 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3011 if (AA->getOption().matches(OPT_main_file_name)) {
3012 SavedAction =
nullptr;
3013 }
else if (!SavedAction) {
3016 if (!A->getOption().matches(OPT_ast_dump_EQ))
3017 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3018 << SavedAction->getSpelling() << A->getSpelling();
3025 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3026 Opts.
Plugins.emplace_back(A->getValue(0));
3030 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3031 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3033 for (
const std::string &Arg :
3034 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3035 std::string BlockName;
3036 unsigned MajorVersion;
3037 unsigned MinorVersion;
3039 std::string UserInfo;
3041 MinorVersion, Hashed, UserInfo)) {
3042 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3049 std::make_shared<TestModuleFileExtension>(
3050 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3053 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3057 Diags.
Report(diag::err_drv_invalid_value)
3058 << A->getAsString(Args) << A->getValue();
3061 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3062 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3063 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3065 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3066 StringRef Val = A->getValue();
3067 if (!Val.contains(
'='))
3072 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3074 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3077 if (Args.hasArg(OPT_aux_target_cpu))
3078 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3079 if (Args.hasArg(OPT_aux_target_feature))
3084 Diags.
Report(diag::err_drv_argument_not_allowed_with)
3085 <<
"ARC migration" <<
"ObjC migration";
3089 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3090 StringRef XValue = A->getValue();
3095 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3096 bool ModuleMap = XValue.consume_back(
"-module-map");
3099 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3105 if (IsHeader || Preprocessed) {
3106 if (XValue.consume_back(
"-header-unit"))
3108 else if (XValue.consume_back(
"-system"))
3110 else if (XValue.consume_back(
"-user"))
3116 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3120 DashX = llvm::StringSwitch<InputKind>(XValue)
3136 DashX = llvm::StringSwitch<InputKind>(XValue)
3144 DashX = llvm::StringSwitch<InputKind>(XValue)
3147 .Cases(
"ast",
"pcm",
"precompiled-header",
3154 Diags.
Report(diag::err_drv_invalid_value)
3155 << A->getAsString(Args) << A->getValue();
3162 IsHeaderFile =
true;
3163 }
else if (IsHeaderFile)
3170 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3173 Inputs.push_back(
"-");
3177 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3179 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3183 StringRef(Inputs[i]).rsplit(
'.').second);
3192 bool IsSystem =
false;
3201 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3211 std::string ClangExecutable =
3212 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
3219#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3220 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3221#include "clang/Driver/Options.inc"
3222#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3237 GenerateArg(Consumer, OPT_fmodules_ignore_macro, Macro.val());
3241 std::optional<bool> IsFramework,
3242 std::optional<bool> IgnoreSysRoot) {
3243 return llvm::is_contained(Groups, Entry.
Group) &&
3244 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3245 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3254 OptSpecifier Opt = [It, Matches]() {
3259 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3273 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3280 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3286 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3291 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3299 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3301 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3311 ? OPT_internal_isystem
3312 : OPT_internal_externc_isystem;
3316 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3320 OptSpecifier Opt =
P.IsSystemHeader ? OPT_system_header_prefix
3321 : OPT_no_system_header_prefix;
3331 const std::string &WorkingDir) {
3336#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3337 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3338#include "clang/Driver/Options.inc"
3339#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3341 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3342 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3346 if (!(
P.empty() || llvm::sys::path::is_absolute(
P))) {
3347 if (WorkingDir.empty())
3348 llvm::sys::fs::make_absolute(
P);
3350 llvm::sys::fs::make_absolute(WorkingDir,
P);
3352 llvm::sys::path::remove_dots(
P);
3356 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3357 StringRef Val = A->getValue();
3358 if (Val.contains(
'=')) {
3359 auto Split = Val.split(
'=');
3361 std::string(Split.first), std::string(Split.second));
3364 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3367 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3368 StringRef MacroDef = A->getValue();
3370 llvm::CachedHashString(MacroDef.split(
'=').first));
3374 bool IsSysrootSpecified =
3375 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3379 auto PrefixHeaderPath = [IsSysrootSpecified,
3380 &Opts](
const llvm::opt::Arg *A,
3381 bool IsFramework =
false) -> std::string {
3382 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3383 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3385 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3386 llvm::StringRef(A->getValue()).substr(1));
3387 return std::string(Buffer);
3389 return A->getValue();
3392 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3393 bool IsFramework = A->getOption().matches(OPT_F);
3399 StringRef Prefix =
"";
3400 for (
const auto *A :
3401 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3402 if (A->getOption().matches(OPT_iprefix))
3403 Prefix = A->getValue();
3404 else if (A->getOption().matches(OPT_iwithprefix))
3410 for (
const auto *A : Args.filtered(OPT_idirafter))
3412 for (
const auto *A : Args.filtered(OPT_iquote))
3415 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3416 if (A->getOption().matches(OPT_iwithsysroot)) {
3423 for (
const auto *A : Args.filtered(OPT_iframework))
3425 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3430 for (
const auto *A : Args.filtered(OPT_c_isystem))
3432 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3434 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3436 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3440 for (
const auto *A :
3441 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3443 if (A->getOption().matches(OPT_internal_externc_isystem))
3445 Opts.
AddPath(A->getValue(), Group,
false,
true);
3449 for (
const auto *A :
3450 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3452 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3454 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3463 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3472 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3474 diags.
Report(diag::err_drv_invalid_value)
3475 << A->getAsString(Args) << A->getValue();
3477 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3483 if (Opts.PointerAuthIntrinsics)
3485 if (Opts.PointerAuthCalls)
3487 if (Opts.PointerAuthReturns)
3489 if (Opts.PointerAuthIndirectGotos)
3490 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3491 if (Opts.PointerAuthAuthTraps)
3493 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3494 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3495 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3496 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3497 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3498 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3499 if (Opts.PointerAuthFunctionTypeDiscrimination)
3500 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3501 if (Opts.PointerAuthInitFini)
3503 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3504 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3505 if (Opts.PointerAuthELFGOT)
3507 if (Opts.AArch64JumpTableHardening)
3508 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3513 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3514 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3515 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3516 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3517 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3518 Opts.PointerAuthVTPtrAddressDiscrimination =
3519 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3520 Opts.PointerAuthVTPtrTypeDiscrimination =
3521 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3522 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3523 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3524 Opts.PointerAuthFunctionTypeDiscrimination =
3525 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3526 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3527 Opts.PointerAuthInitFiniAddressDiscrimination =
3528 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3529 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3530 Opts.AArch64JumpTableHardening =
3531 Args.hasArg(OPT_faarch64_jump_table_hardening);
3541 llvm_unreachable(
"should not parse language flags for this input");
3576 llvm_unreachable(
"unexpected input language");
3585 return "Objective-C";
3589 return "Objective-C++";
3593 return "C++ for OpenCL";
3612 llvm_unreachable(
"unknown input language");
3615void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3617 const llvm::Triple &
T,
3622 if (Opts.ObjCAutoRefCount)
3624 if (Opts.PICLevel != 0)
3625 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3629 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3634 OptSpecifier StdOpt;
3636 case LangStandard::lang_opencl10:
3637 case LangStandard::lang_opencl11:
3638 case LangStandard::lang_opencl12:
3639 case LangStandard::lang_opencl20:
3640 case LangStandard::lang_opencl30:
3641 case LangStandard::lang_openclcpp10:
3642 case LangStandard::lang_openclcpp2021:
3643 StdOpt = OPT_cl_std_EQ;
3646 StdOpt = OPT_std_EQ;
3653 if (Opts.IncludeDefaultHeader)
3654 GenerateArg(Consumer, OPT_finclude_default_header);
3655 if (Opts.DeclareOpenCLBuiltins)
3656 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3660#define LANG_OPTION_WITH_MARSHALLING(...) \
3661 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3662#include "clang/Driver/Options.inc"
3663#undef LANG_OPTION_WITH_MARSHALLING
3674 else if (Opts.ObjCAutoRefCount == 1)
3677 if (Opts.ObjCWeakRuntime)
3678 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3683 if (Opts.ObjCSubscriptingLegacyRuntime)
3684 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3687 if (Opts.GNUCVersion != 0) {
3688 unsigned Major = Opts.GNUCVersion / 100 / 100;
3689 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3690 unsigned Patch = Opts.GNUCVersion % 100;
3692 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3695 if (Opts.IgnoreXCOFFVisibility)
3696 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3705 if (Opts.MSCompatibilityVersion != 0) {
3706 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3707 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3708 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3709 GenerateArg(Consumer, OPT_fms_compatibility_version,
3710 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3713 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3715 if (!Opts.Trigraphs)
3722 if (
T.isOSzOS() && !Opts.ZOSExt)
3724 else if (Opts.ZOSExt)
3727 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3730 if (Opts.ConvergentFunctions)
3733 GenerateArg(Consumer, OPT_fno_convergent_functions);
3735 if (Opts.NoBuiltin && !Opts.Freestanding)
3738 if (!Opts.NoBuiltin)
3742 if (Opts.LongDoubleSize == 128)
3744 else if (Opts.LongDoubleSize == 64)
3746 else if (Opts.LongDoubleSize == 80)
3753 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3756 if (Opts.OpenMP != 51)
3757 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3759 if (!Opts.OpenMPUseTLS)
3762 if (Opts.OpenMPIsTargetDevice)
3763 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3765 if (Opts.OpenMPIRBuilder)
3766 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3769 if (Opts.OpenMPSimd) {
3772 if (Opts.OpenMP != 51)
3773 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3776 if (Opts.OpenMPThreadSubscription)
3777 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3779 if (Opts.OpenMPTeamSubscription)
3780 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3782 if (Opts.OpenMPTargetDebug != 0)
3783 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3784 Twine(Opts.OpenMPTargetDebug));
3786 if (Opts.OpenMPCUDANumSMs != 0)
3787 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3788 Twine(Opts.OpenMPCUDANumSMs));
3790 if (Opts.OpenMPCUDABlocksPerSM != 0)
3791 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3792 Twine(Opts.OpenMPCUDABlocksPerSM));
3794 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3795 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3796 Twine(Opts.OpenMPCUDAReductionBufNum));
3799 std::string Targets;
3800 llvm::raw_string_ostream OS(Targets);
3803 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3804 GenerateArg(Consumer, OPT_fopenmp_targets_EQ, Targets);
3810 if (Opts.OpenMPCUDAMode)
3830 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3833 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3837 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3839 switch (Opts.getClangABICompat()) {
3841 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"3.8");
3844 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"4.0");
3847 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"6.0");
3850 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"7.0");
3853 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"9.0");
3856 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"11.0");
3859 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"12.0");
3862 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"14.0");
3865 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"15.0");
3868 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"17.0");
3871 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"18.0");
3874 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"19.0");
3880 if (Opts.getSignReturnAddressScope() ==
3882 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3883 else if (Opts.getSignReturnAddressScope() ==
3885 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3887 if (Opts.getSignReturnAddressKey() ==
3889 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3895 if (Opts.RelativeCXXABIVTables)
3896 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3898 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3906 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3912bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3914 std::vector<std::string> &Includes,
3924 if (Args.hasArg(OPT_fobjc_arc))
3925 Opts.ObjCAutoRefCount = 1;
3929 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
3941 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
3944 Diags.
Report(diag::err_drv_invalid_value)
3945 << A->getAsString(Args) << A->getValue();
3947 for (
unsigned KindValue = 0;
3953 auto Diag = Diags.
Report(diag::note_drv_use_standard);
3954 Diag <<
Std.getName() <<
Std.getDescription();
3955 unsigned NumAliases = 0;
3956#define LANGSTANDARD(id, name, lang, desc, features)
3957#define LANGSTANDARD_ALIAS(id, alias) \
3958 if (KindValue == LangStandard::lang_##id) ++NumAliases;
3959#define LANGSTANDARD_ALIAS_DEPR(id, alias)
3960#include "clang/Basic/LangStandards.def"
3962#define LANGSTANDARD(id, name, lang, desc, features)
3963#define LANGSTANDARD_ALIAS(id, alias) \
3964 if (KindValue == LangStandard::lang_##id) Diag << alias;
3965#define LANGSTANDARD_ALIAS_DEPR(id, alias)
3966#include "clang/Basic/LangStandards.def"
3974 Diags.
Report(diag::err_drv_argument_not_allowed_with)
3982 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
3984 = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
3985 .Cases(
"cl",
"CL", LangStandard::lang_opencl10)
3986 .Cases(
"cl1.0",
"CL1.0", LangStandard::lang_opencl10)
3987 .Cases(
"cl1.1",
"CL1.1", LangStandard::lang_opencl11)
3988 .Cases(
"cl1.2",
"CL1.2", LangStandard::lang_opencl12)
3989 .Cases(
"cl2.0",
"CL2.0", LangStandard::lang_opencl20)
3990 .Cases(
"cl3.0",
"CL3.0", LangStandard::lang_opencl30)
3991 .Cases(
"clc++",
"CLC++", LangStandard::lang_openclcpp10)
3992 .Cases(
"clc++1.0",
"CLC++1.0", LangStandard::lang_openclcpp10)
3993 .Cases(
"clc++2021",
"CLC++2021", LangStandard::lang_openclcpp2021)
3997 Diags.
Report(diag::err_drv_invalid_value)
3998 << A->getAsString(Args) << A->getValue();
4001 LangStd = OpenCLLangStd;
4005 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4006 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4014#define LANG_OPTION_WITH_MARSHALLING(...) \
4015 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4016#include "clang/Driver/Options.inc"
4017#undef LANG_OPTION_WITH_MARSHALLING
4019 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4020 StringRef Name = A->getValue();
4021 if (Name ==
"full" || Name ==
"branch") {
4022 Opts.CFProtectionBranch = 1;
4026 if (Opts.CFProtectionBranch) {
4027 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4029 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4030#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4031 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4032#include "clang/Basic/CFProtectionOptions.def"
4034 Opts.setCFBranchLabelScheme(Scheme);
4038 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4039 !Args.hasArg(OPT_sycl_std_EQ)) {
4049 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4050 StringRef value =
arg->getValue();
4052 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4055 if (Args.hasArg(OPT_fobjc_gc_only))
4057 else if (Args.hasArg(OPT_fobjc_gc))
4059 else if (Args.hasArg(OPT_fobjc_arc)) {
4060 Opts.ObjCAutoRefCount = 1;
4062 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4069 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4070 Opts.ObjCWeakRuntime = 1;
4076 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4077 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4078 assert(!Opts.ObjCWeak);
4080 Diags.
Report(diag::err_objc_weak_with_gc);
4081 }
else if (!Opts.ObjCWeakRuntime) {
4082 Diags.
Report(diag::err_objc_weak_unsupported);
4086 }
else if (Opts.ObjCAutoRefCount) {
4087 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4090 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4091 Opts.ObjCSubscriptingLegacyRuntime =
4095 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4098 VersionTuple GNUCVer;
4099 bool Invalid = GNUCVer.tryParse(A->getValue());
4100 unsigned Major = GNUCVer.getMajor();
4101 unsigned Minor = GNUCVer.getMinor().value_or(0);
4102 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4103 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4104 Diags.
Report(diag::err_drv_invalid_value)
4105 << A->getAsString(Args) << A->getValue();
4107 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4110 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4111 Opts.IgnoreXCOFFVisibility = 1;
4113 if (Args.hasArg(OPT_ftrapv)) {
4117 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4119 else if (Args.hasArg(OPT_fwrapv))
4122 Opts.MSCompatibilityVersion = 0;
4123 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4125 if (VT.tryParse(A->getValue()))
4126 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4128 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4129 VT.getMinor().value_or(0) * 100000 +
4130 VT.getSubminor().value_or(0);
4138 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4141 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4144 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4146 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4147 && Opts.OpenCLVersion == 200);
4149 bool HasConvergentOperations = Opts.OpenMPIsTargetDevice || Opts.OpenCL ||
4150 Opts.CUDAIsDevice || Opts.SYCLIsDevice ||
4151 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4152 Opts.ConvergentFunctions =
4153 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4154 HasConvergentOperations);
4156 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4157 if (!Opts.NoBuiltin)
4159 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4160 if (A->getOption().matches(options::OPT_mlong_double_64))
4161 Opts.LongDoubleSize = 64;
4162 else if (A->getOption().matches(options::OPT_mlong_double_80))
4163 Opts.LongDoubleSize = 80;
4164 else if (A->getOption().matches(options::OPT_mlong_double_128))
4165 Opts.LongDoubleSize = 128;
4167 Opts.LongDoubleSize = 0;
4169 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4175 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4177 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4178 << A->getSpelling() <<
"-fdefault-calling-conv";
4180 switch (
T.getArch()) {
4181 case llvm::Triple::x86:
4184 case llvm::Triple::m68k:
4188 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4189 << A->getSpelling() <<
T.getTriple();
4195 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4197 bool IsSimdSpecified =
4198 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4200 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4202 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4203 Opts.OpenMPIsTargetDevice =
4204 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4205 Opts.OpenMPIRBuilder =
4206 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4207 bool IsTargetSpecified =
4208 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ);
4210 if (Opts.OpenMP || Opts.OpenMPSimd) {
4212 Args, OPT_fopenmp_version_EQ,
4213 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4214 Opts.OpenMP = Version;
4217 if (!Opts.OpenMPIsTargetDevice) {
4218 switch (
T.getArch()) {
4222 case llvm::Triple::nvptx:
4223 case llvm::Triple::nvptx64:
4224 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4232 if ((Opts.OpenMPIsTargetDevice && (
T.isNVPTX() ||
T.isAMDGCN())) ||
4233 Opts.OpenCLCPlusPlus) {
4235 Opts.Exceptions = 0;
4236 Opts.CXXExceptions = 0;
4238 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4239 Opts.OpenMPCUDANumSMs =
4241 Opts.OpenMPCUDANumSMs, Diags);
4242 Opts.OpenMPCUDABlocksPerSM =
4244 Opts.OpenMPCUDABlocksPerSM, Diags);
4246 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4247 Opts.OpenMPCUDAReductionBufNum, Diags);
4252 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4253 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4255 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4256 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4257 Opts.OpenMPTargetDebug = 1;
4260 if (Opts.OpenMPIsTargetDevice) {
4261 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4262 Opts.OpenMPTeamSubscription =
true;
4263 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4264 Opts.OpenMPThreadSubscription =
true;
4268 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
4269 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4270 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4271 if (
T.isArch16Bit())
4273 if (
T.isArch32Bit())
4275 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4279 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4280 llvm::Triple TT(A->getValue(i));
4282 if (TT.getArch() == llvm::Triple::UnknownArch ||
4283 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4284 TT.getArch() == llvm::Triple::spirv64 ||
4285 TT.getArch() == llvm::Triple::systemz ||
4286 TT.getArch() == llvm::Triple::loongarch64 ||
4287 TT.getArch() == llvm::Triple::nvptx ||
4288 TT.getArch() == llvm::Triple::nvptx64 ||
4289 TT.getArch() == llvm::Triple::amdgcn ||
4290 TT.getArch() == llvm::Triple::x86 ||
4291 TT.getArch() == llvm::Triple::x86_64))
4292 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4293 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4294 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4295 << A->getValue(i) <<
T.str();
4303 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) {
4306 Diags.
Report(diag::err_drv_omp_host_ir_file_not_found)
4311 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4312 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4313 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4316 if (Args.hasArg(options::OPT_fopenacc)) {
4317 Opts.OpenACC =
true;
4319 if (Arg *A = Args.getLastArg(options::OPT_openacc_macro_override))
4326 Opts.Optimize = Opt != 0;
4327 Opts.OptimizeSize = OptSize != 0;
4332 Opts.NoInlineDefine = !Opts.Optimize;
4333 if (Arg *InlineArg = Args.getLastArg(
4334 options::OPT_finline_functions, options::OPT_finline_hint_functions,
4335 options::OPT_fno_inline_functions, options::OPT_fno_inline))
4336 if (InlineArg->getOption().matches(options::OPT_fno_inline))
4337 Opts.NoInlineDefine =
true;
4339 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4340 StringRef Val = A->getValue();
4343 else if (Val ==
"on")
4345 else if (Val ==
"off")
4347 else if (Val ==
"fast-honor-pragmas")
4350 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4354 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4355 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4357 llvm::StringSwitch<unsigned>(A->getValue(i))
4360 .Case(
"add-unsigned-overflow-test",
4362 .Case(
"add-signed-overflow-test",
4365 .Case(
"unsigned-post-decr-while",
4374 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4375 std::vector<std::string> systemIgnorelists =
4376 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4378 systemIgnorelists.begin(),
4379 systemIgnorelists.end());
4381 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4384 StringRef Ver = A->getValue();
4385 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4386 unsigned Major, Minor = 0;
4390 if (!VerParts.first.starts_with(
"0") &&
4391 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4392 Major <= CLANG_VERSION_MAJOR &&
4394 ? VerParts.second.size() == 1 &&
4395 !VerParts.second.getAsInteger(10, Minor)
4396 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4398 if (Major == 3 && Minor <= 8)
4400 else if (Major <= 4)
4402 else if (Major <= 6)
4404 else if (Major <= 7)
4406 else if (Major <= 9)
4408 else if (Major <= 11)
4410 else if (Major <= 12)
4412 else if (Major <= 14)
4414 else if (Major <= 15)
4416 else if (Major <= 17)
4418 else if (Major <= 18)
4420 else if (Major <= 19)
4422 }
else if (Ver !=
"latest") {
4423 Diags.
Report(diag::err_drv_invalid_value)
4424 << A->getAsString(Args) << A->getValue();
4428 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4429 StringRef SignScope = A->getValue();
4431 if (SignScope.equals_insensitive(
"none"))
4432 Opts.setSignReturnAddressScope(
4434 else if (SignScope.equals_insensitive(
"all"))
4435 Opts.setSignReturnAddressScope(
4437 else if (SignScope.equals_insensitive(
"non-leaf"))
4438 Opts.setSignReturnAddressScope(
4441 Diags.
Report(diag::err_drv_invalid_value)
4442 << A->getAsString(Args) << SignScope;
4444 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4445 StringRef SignKey = A->getValue();
4446 if (!SignScope.empty() && !SignKey.empty()) {
4447 if (SignKey ==
"a_key")
4448 Opts.setSignReturnAddressKey(
4450 else if (SignKey ==
"b_key")
4451 Opts.setSignReturnAddressKey(
4454 Diags.
Report(diag::err_drv_invalid_value)
4455 << A->getAsString(Args) << SignKey;
4461 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4468 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4474 Opts.RelativeCXXABIVTables =
4475 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4476 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4480 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4481 Opts.OmitVTableRTTI =
4482 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4483 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4484 if (Opts.OmitVTableRTTI && HasRTTI)
4485 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4487 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4488 auto Split = StringRef(A).split(
'=');
4490 {std::string(
Split.first), std::string(
Split.second)});
4494 !Args.getLastArg(OPT_fno_file_reproducible) &&
4495 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4496 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4497 Args.getLastArg(OPT_ffile_reproducible));
4500 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4502 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4503 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4506 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4507 std::ifstream SeedFile(A->getValue(0));
4509 if (!SeedFile.is_open())
4510 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4516 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4523 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4525 enum { OS, Environment };
4527 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4529 if (
T.getOSName().empty()) {
4530 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4531 << ExpectedOS << OS <<
T.str();
4532 }
else if (
T.getEnvironmentName().empty()) {
4533 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4535 }
else if (!
T.isShaderStageEnvironment()) {
4536 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4541 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4542 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4543 << ShaderModel <<
T.getOSName() <<
T.str();
4548 if (Args.getLastArg(OPT_fnative_half_type)) {
4551 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4552 T.getOSVersion() >= VersionTuple(6, 2)))
4553 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4554 <<
"-enable-16bit-types" <<
true <<
Std.getName()
4555 <<
T.getOSVersion().getAsString();
4557 }
else if (
T.isSPIRVLogical()) {
4558 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4559 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4560 << VulkanEnv <<
T.getOSName() <<
T.str();
4562 if (Args.getLastArg(OPT_fnative_half_type)) {
4565 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4566 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4567 <<
"-fnative-half-type" <<
false <<
Std.getName();
4570 llvm_unreachable(
"expected DXIL or SPIR-V target");
4573 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4575 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4580 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4632 llvm_unreachable(
"invalid frontend action");
4642#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4643 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4644#include "clang/Driver/Options.inc"
4645#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4648 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4651 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl,
D);
4658 for (
const auto &M : Opts.
Macros) {
4661 if (M.first ==
"__CET__=1" && !M.second &&
4662 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4664 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4665 !CodeGenOpts.CFProtectionBranch)
4667 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4668 CodeGenOpts.CFProtectionBranch)
4671 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4674 for (
const auto &I : Opts.
Includes) {
4677 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4678 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4683 if (LangOpts.HLSL && I ==
"hlsl.h")
4693 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4699 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4702 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4716#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4717 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4718#include "clang/Driver/Options.inc"
4719#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4721 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4722 Args.hasArg(OPT_pch_through_hdrstop_use);
4724 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4727 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4728 StringRef
Value(A->getValue());
4729 size_t Comma =
Value.find(
',');
4731 unsigned EndOfLine = 0;
4733 if (Comma == StringRef::npos ||
4734 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4735 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4736 Diags.
Report(diag::err_drv_preamble_format);
4744 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4745 StringRef Name = A->getValue();
4746 if (Name ==
"branch")
4748 else if (Name ==
"return")
4750 else if (Name ==
"full")
4755 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4756 if (A->getOption().matches(OPT_D))
4763 for (
const auto *A : Args.filtered(OPT_include))
4764 Opts.
Includes.emplace_back(A->getValue());
4766 for (
const auto *A : Args.filtered(OPT_chain_include))
4769 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4770 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4772 if (Split.second.empty()) {
4773 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4780 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4781 StringRef Epoch = A->getValue();
4785 const uint64_t MaxTimestamp =
4786 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4788 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4789 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4790 << Epoch << MaxTimestamp;
4796 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4797 StringRef Val = A->getValue();
4808 Args.hasFlag(OPT_fdefine_target_os_macros,
4820#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4821 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4822#include "clang/Driver/Options.inc"
4823#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4841#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4842 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4843#include "clang/Driver/Options.inc"
4844#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4847 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4856#define TARGET_OPTION_WITH_MARSHALLING(...) \
4857 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4858#include "clang/Driver/Options.inc"
4859#undef TARGET_OPTION_WITH_MARSHALLING
4865 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
4875#define TARGET_OPTION_WITH_MARSHALLING(...) \
4876 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4877#include "clang/Driver/Options.inc"
4878#undef TARGET_OPTION_WITH_MARSHALLING
4880 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
4881 llvm::VersionTuple Version;
4882 if (Version.tryParse(A->getValue()))
4883 Diags.
Report(diag::err_drv_invalid_value)
4884 << A->getAsString(Args) << A->getValue();
4889 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
4890 llvm::VersionTuple Version;
4891 if (Version.tryParse(A->getValue()))
4892 Diags.
Report(diag::err_drv_invalid_value)
4893 << A->getAsString(Args) << A->getValue();
4901bool CompilerInvocation::CreateFromArgsImpl(
4909 unsigned MissingArgIndex, MissingArgCount;
4910 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
4911 MissingArgCount, VisibilityMask);
4915 if (MissingArgCount)
4916 Diags.
Report(diag::err_drv_missing_argument)
4917 << Args.getArgString(MissingArgIndex) << MissingArgCount;
4920 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
4921 auto ArgString = A->getAsString(Args);
4922 std::string Nearest;
4923 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
4924 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
4926 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
4927 << ArgString << Nearest;
4976 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
4977 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
4978 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
4979 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
4992 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
4998 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5012 Diags, llvm::vfs::getRealFileSystem());
5026 const char *Argv0) {
5032 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5036 Args.push_back(
"-cc1");
5039 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5044 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5057#define LANGOPT(Name, Bits, Default, Description) HBuilder.add(LangOpts->Name);
5058#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5059 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5060#define BENIGN_LANGOPT(Name, Bits, Default, Description)
5061#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
5062#include "clang/Basic/LangOptions.def"
5067 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5084 StringRef MacroDef = Macro.first;
5086 llvm::CachedHashString(MacroDef.split(
'=').first)))
5090 HBuilder.add(Macro);
5106#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5107#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5108 HBuilder.add(diagOpts.get##Name());
5109#include "clang/Basic/DiagnosticOptions.def"
5119 ext->hashExtension(HBuilder);
5126 HBuilder.add(*Minor);
5127 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5128 HBuilder.add(*Subminor);
5130 HBuilder.add(*Build);
5140#define DEBUGOPT(Name, Bits, Default) HBuilder.add(CodeGenOpts->Name);
5141#define VALUE_DEBUGOPT(Name, Bits, Default) HBuilder.add(CodeGenOpts->Name);
5142#define ENUM_DEBUGOPT(Name, Type, Bits, Default) \
5143 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5144#define BENIGN_DEBUGOPT(Name, Bits, Default)
5145#define BENIGN_VALUE_DEBUGOPT(Name, Bits, Default)
5146#define BENIGN_ENUM_DEBUGOPT(Name, Type, Bits, Default)
5147#include "clang/Basic/DebugOptions.def"
5154 if (!SanHash.
empty())
5155 HBuilder.add(SanHash.
Mask);
5157 llvm::MD5::MD5Result
Result;
5158 HBuilder.getHasher().final(
Result);
5160 return toString(llvm::APInt(64, Hash), 36,
false);
5188 std::vector<std::string> Args{
"-cc1"};
5190 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5216 llvm::vfs::getRealFileSystem());
5224 Diags, std::move(BaseFS));
5230 if (VFSOverlayFiles.empty())
5235 for (
const auto &
File : VFSOverlayFiles) {
5236 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5239 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5244 std::move(Buffer.get()),
nullptr,
File,
5247 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.
enum clang::FrontendOptions::@200 ARCMTAction
std::optional< std::vector< std::string > > AuxTargetFeatures
Auxiliary target features for CUDA/HIP compilation.
std::string AuxTriple
Auxiliary triple for CUDA/HIP compilation.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
A diagnostic client that ignores all diagnostics.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ None
Don't exclude any overflow patterns from sanitizers.
@ AddUnsignedOverflowTest
if (a + b < a)
@ All
Exclude all overflow patterns (below)
@ AddSignedOverflowTest
if (a + b < a)
@ PostDecrInWhile
while (count–)
@ 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.
static std::optional< PositiveAnalyzerOption > create(unsigned Val)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a #pragma hdrstop to 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.