29#include "clang/Config/config.h"
44#include "llvm/ADT/APInt.h"
45#include "llvm/ADT/ArrayRef.h"
46#include "llvm/ADT/CachedHashString.h"
47#include "llvm/ADT/FloatingPointMode.h"
48#include "llvm/ADT/STLExtras.h"
49#include "llvm/ADT/SmallVector.h"
50#include "llvm/ADT/StringRef.h"
51#include "llvm/ADT/StringSwitch.h"
52#include "llvm/ADT/Twine.h"
53#include "llvm/Config/llvm-config.h"
54#include "llvm/Frontend/Debug/Options.h"
55#include "llvm/IR/DebugInfoMetadata.h"
56#include "llvm/Linker/Linker.h"
57#include "llvm/MC/MCTargetOptions.h"
58#include "llvm/Option/Arg.h"
59#include "llvm/Option/ArgList.h"
60#include "llvm/Option/OptSpecifier.h"
61#include "llvm/Option/OptTable.h"
62#include "llvm/Option/Option.h"
63#include "llvm/ProfileData/InstrProfReader.h"
64#include "llvm/Remarks/HotnessThresholdParser.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/Compiler.h"
67#include "llvm/Support/Error.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/ErrorOr.h"
70#include "llvm/Support/FileSystem.h"
71#include "llvm/Support/HashBuilder.h"
72#include "llvm/Support/MathExtras.h"
73#include "llvm/Support/MemoryBuffer.h"
74#include "llvm/Support/Path.h"
75#include "llvm/Support/Process.h"
76#include "llvm/Support/Regex.h"
77#include "llvm/Support/VersionTuple.h"
78#include "llvm/Support/VirtualFileSystem.h"
79#include "llvm/Support/raw_ostream.h"
80#include "llvm/Target/TargetOptions.h"
81#include "llvm/TargetParser/Host.h"
82#include "llvm/TargetParser/Triple.h"
110 if (Arg.getAsInteger(10, Val))
111 return llvm::createStringError(llvm::inconvertibleErrorCode(),
112 "Not an integer: %s", Arg.data());
121 return std::make_shared<T>(
X);
195 if (Storage.use_count() > 1)
196 Storage = std::make_shared<T>(*Storage);
267#define SIMPLE_ENUM_VALUE_TABLE
268#include "clang/Options/Options.inc"
269#undef SIMPLE_ENUM_VALUE_TABLE
275 if (Args.hasArg(Opt))
284 if (Args.hasArg(Opt))
294 unsigned SpellingOffset, Option::OptionClass,
299 const Twine &Spelling, Option::OptionClass,
305 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
309 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
311 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
313 if (Args.hasArg(Opt))
320 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
326 OptSpecifier OtherOpt) {
327 return [
Value, OtherValue,
328 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
330 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
331 return A->getOption().matches(Opt) ?
Value : OtherValue;
339 Option::OptionClass,
unsigned,
bool KeyPath) {
340 if (KeyPath ==
Value)
346 const Twine &Spelling,
347 Option::OptionClass OptClass,
unsigned,
348 const Twine &
Value) {
350 case Option::SeparateClass:
351 case Option::JoinedOrSeparateClass:
352 case Option::JoinedAndSeparateClass:
356 case Option::JoinedClass:
357 case Option::CommaJoinedClass:
358 Consumer(Spelling +
Value);
361 llvm_unreachable(
"Cannot denormalize an option with option class "
362 "incompatible with string denormalization.");
369 Option::OptionClass OptClass,
unsigned TableIndex,
T Value) {
371 TableIndex, Twine(
Value));
376 Option::OptionClass OptClass,
unsigned TableIndex,
381static std::optional<SimpleEnumValue>
383 for (
int I = 0, E = Table.Size; I != E; ++I)
384 if (Name == Table.Table[I].Name)
385 return Table.Table[I];
390static std::optional<SimpleEnumValue>
392 for (
int I = 0, E = Table.Size; I != E; ++I)
394 return Table.Table[I];
403 assert(TableIndex < SimpleEnumValueTablesSize);
404 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
406 auto *Arg = Args.getLastArg(Opt);
410 StringRef ArgValue = Arg->getValue();
412 return MaybeEnumVal->Value;
414 Diags.
Report(diag::err_drv_invalid_value)
415 << Arg->getAsString(Args) << ArgValue;
420 unsigned SpellingOffset,
421 Option::OptionClass OptClass,
422 unsigned TableIndex,
unsigned Value) {
423 assert(TableIndex < SimpleEnumValueTablesSize);
424 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
427 TableIndex, MaybeEnumVal->Name);
429 llvm_unreachable(
"The simple enum value was not correctly defined in "
430 "the tablegen option description");
436 unsigned SpellingOffset,
437 Option::OptionClass OptClass,
438 unsigned TableIndex,
T Value) {
440 TableIndex,
static_cast<unsigned>(
Value));
447 auto *Arg = Args.getLastArg(Opt);
450 return std::string(Arg->getValue());
453template <
typename IntTy>
457 auto *Arg = Args.getLastArg(Opt);
461 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
462 Diags.
Report(diag::err_drv_invalid_int_value)
463 << Arg->getAsString(Args) << Arg->getValue();
469static std::optional<std::vector<std::string>>
472 return Args.getAllArgValues(Opt);
476 unsigned SpellingOffset,
477 Option::OptionClass OptClass,
479 const std::vector<std::string> &Values) {
481 case Option::CommaJoinedClass: {
482 std::string CommaJoinedValue;
483 if (!Values.empty()) {
484 CommaJoinedValue.append(Values.front());
485 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
486 CommaJoinedValue.append(
",");
487 CommaJoinedValue.append(
Value);
491 Option::OptionClass::JoinedClass, TableIndex,
495 case Option::JoinedClass:
496 case Option::SeparateClass:
497 case Option::JoinedOrSeparateClass:
498 for (
const std::string &
Value : Values)
502 llvm_unreachable(
"Cannot denormalize an option with option class "
503 "incompatible with string vector denormalization.");
511 auto *Arg = Args.getLastArg(Opt);
514 return llvm::Triple::normalize(Arg->getValue());
517#define PARSE_OPTION_WITH_MARSHALLING( \
518 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
519 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
520 METAVAR, VALUES, SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
521 DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
523 if ((VISIBILITY) & options::CC1Option) { \
524 KEYPATH = static_cast<decltype(KEYPATH)>(DEFAULT_VALUE); \
526 KEYPATH = static_cast<decltype(KEYPATH)>(IMPLIED_VALUE); \
528 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
529 KEYPATH = static_cast<decltype(KEYPATH)>(*MaybeValue); \
532#define GENERATE_OPTION_WITH_MARSHALLING( \
533 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
534 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
535 SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
536 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, TABLE_INDEX) \
537 if ((VISIBILITY) & options::CC1Option) { \
538 if (ALWAYS_EMIT || (KEYPATH != static_cast<decltype(KEYPATH)>( \
539 ((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
540 : (DEFAULT_VALUE))))) \
541 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
542 TABLE_INDEX, KEYPATH); \
556 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
557 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
558 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
559 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
562 CodeGenOpts.ClearASTBeforeBackend =
false;
564 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
565 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
568 llvm::Triple
T(TargetOpts.
Triple);
569 llvm::Triple::ArchType
Arch =
T.getArch();
574 if (CodeGenOpts.getExceptionHandling() !=
576 T.isWindowsMSVCEnvironment())
577 Diags.
Report(diag::err_fe_invalid_exception_model)
578 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) <<
T.str();
580 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
581 Diags.
Report(diag::warn_c_kext);
583 if (LangOpts.NewAlignOverride &&
584 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
585 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
586 Diags.
Report(diag::err_fe_invalid_alignment)
587 << A->getAsString(Args) << A->getValue();
588 LangOpts.NewAlignOverride = 0;
593 if (LangOpts.CPlusPlus11) {
594 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
595 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
596 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
597 <<
bool(LangOpts.RawStringLiterals);
601 LangOpts.RawStringLiterals =
true;
604 if (Args.hasArg(OPT_freflection) && !LangOpts.CPlusPlus26) {
605 Diags.
Report(diag::err_drv_reflection_requires_cxx26)
606 << Args.getLastArg(options::OPT_freflection)->getAsString(Args);
609 LangOpts.NamedLoops =
610 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
613 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
614 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
618 if ((LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) && !LangOpts.CPlusPlus)
619 Diags.
Report(diag::err_drv_argument_not_allowed_with)
622 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
623 Diags.
Report(diag::err_drv_argument_not_allowed_with)
626 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
627 Diags.
Report(diag::err_drv_argument_not_allowed_with)
630 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
631 Diags.
Report(diag::err_drv_argument_not_allowed_with)
634 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
635 Diags.
Report(diag::err_drv_argument_not_allowed_with)
638 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
639 Diags.
Report(diag::warn_ignored_hip_only_option)
640 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
642 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
643 Diags.
Report(diag::warn_ignored_hip_only_option)
644 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
650 if (!llvm::is_contained(Warnings,
"conversion"))
651 Warnings.insert(Warnings.begin(),
"conversion");
652 if (!llvm::is_contained(Warnings,
"vector-conversion"))
653 Warnings.insert(Warnings.begin(),
"vector-conversion");
654 if (!llvm::is_contained(Warnings,
"matrix-conversion"))
655 Warnings.insert(Warnings.begin(),
"matrix-conversion");
665 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
666 if (LangOpts.ApproxFunc)
667 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
668 if (LangOpts.AllowFPReassoc)
669 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
670 if (LangOpts.AllowRecip)
671 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
677 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
679 Diags.
Report(diag::warn_option_invalid_ocl_version)
681 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
683 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
684 auto DefaultCC = LangOpts.getDefaultCallingConv();
688 Arch != llvm::Triple::x86;
694 Diags.
Report(diag::err_drv_argument_not_allowed_with)
695 << A->getSpelling() <<
T.getTriple();
706 llvm::opt::OptSpecifier OptSpecifier) {
709 Option::OptionClass::FlagClass, 0);
713 llvm::opt::OptSpecifier OptSpecifier,
714 const Twine &
Value) {
752 bool CheckAgainstOriginalInvocation =
false,
753 bool ForceRoundTrip =
false) {
755 bool DoRoundTripDefault =
true;
757 bool DoRoundTripDefault =
false;
760 bool DoRoundTrip = DoRoundTripDefault;
761 if (ForceRoundTrip) {
764 for (
const auto *Arg : CommandLineArgs) {
765 if (Arg == StringRef(
"-round-trip-args"))
767 if (Arg == StringRef(
"-no-round-trip-args"))
775 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
780 llvm::raw_string_ostream OS(Buffer);
781 for (
const char *Arg : Args) {
782 llvm::sys::printArg(OS, Arg,
true);
795 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
802 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
808 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
809 Diags.
Report(diag::note_cc1_round_trip_original)
810 << SerializeArgs(CommandLineArgs);
815 llvm::BumpPtrAllocator Alloc;
816 llvm::StringSaver StringPool(Alloc);
817 auto SA = [&StringPool](
const Twine &Arg) {
818 return StringPool.save(Arg).data();
825 Generate(DummyInvocation, GeneratedArgs, SA);
831 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
836 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
837 Diags.
Report(diag::note_cc1_round_trip_generated)
838 << 1 << SerializeArgs(GeneratedArgs);
843 if (CheckAgainstOriginalInvocation)
845 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
849 Generate(RealInvocation, ComparisonArgs, SA);
854 return llvm::equal(A, B, [](
const char *AElem,
const char *BElem) {
855 return StringRef(AElem) == StringRef(BElem);
862 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
863 Diags.
Report(diag::err_cc1_round_trip_mismatch);
864 Diags.
Report(diag::note_cc1_round_trip_generated)
865 << 1 << SerializeArgs(GeneratedArgs);
866 Diags.
Report(diag::note_cc1_round_trip_generated)
867 << 2 << SerializeArgs(ComparisonArgs);
871 Diags.
Report(diag::remark_cc1_round_trip_generated)
872 << 1 << SerializeArgs(GeneratedArgs);
873 Diags.
Report(diag::remark_cc1_round_trip_generated)
874 << 2 << SerializeArgs(ComparisonArgs);
886 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
890 Args.push_back(
"-cc1");
893 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
898 OptSpecifier GroupWithValue,
899 std::vector<std::string> &Diagnostics) {
900 for (
auto *A : Args.filtered(Group)) {
901 if (A->getOption().getKind() == Option::FlagClass) {
904 Diagnostics.push_back(
905 std::string(A->getOption().getName().drop_front(1)));
906 }
else if (A->getOption().matches(GroupWithValue)) {
909 Diagnostics.push_back(
910 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
913 Diagnostics.push_back(A->getValue());
924 std::vector<std::string> &Funcs) {
925 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
927 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
934#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
935 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
936#include "clang/Options/Options.inc"
937#undef ANALYZER_OPTION_WITH_MARSHALLING
941#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
943 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
945#include "clang/StaticAnalyzer/Core/Analyses.def"
947 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
953#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
955 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
957#include "clang/StaticAnalyzer/Core/Analyses.def"
959 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
965#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
967 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
969#include "clang/StaticAnalyzer/Core/Analyses.def"
971 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
977#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
979 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
981#include "clang/StaticAnalyzer/Core/Analyses.def"
983 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
989 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
998 for (
const auto &
C : Opts.
Config)
999 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1000 llvm::sort(SortedConfigOpts, llvm::less_first());
1002 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1005 auto Entry = ConfigOpts.
Config.find(Key);
1006 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1019#define SSAF_OPTION_WITH_MARSHALLING(...) \
1020 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1021#include "clang/Options/Options.inc"
1022#undef SSAF_OPTION_WITH_MARSHALLING
1031#define SSAF_OPTION_WITH_MARSHALLING(...) \
1032 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1033#include "clang/Options/Options.inc"
1034#undef SSAF_OPTION_WITH_MARSHALLING
1045#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1046 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1047#include "clang/Options/Options.inc"
1048#undef ANALYZER_OPTION_WITH_MARSHALLING
1050 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1051 StringRef Name = A->getValue();
1053#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1054 .Case(CMDFLAG, NAME##Model)
1055#include "clang/StaticAnalyzer/Core/Analyses.def"
1058 Diags.
Report(diag::err_drv_invalid_value)
1059 << A->getAsString(Args) << Name;
1062 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1063 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1070 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1071 StringRef Name = A->getValue();
1073#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1074 .Case(CMDFLAG, PD_##NAME)
1075#include "clang/StaticAnalyzer/Core/Analyses.def"
1078 Diags.
Report(diag::err_drv_invalid_value)
1079 << A->getAsString(Args) << Name;
1085 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1086 StringRef Name = A->getValue();
1088#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1089 .Case(CMDFLAG, NAME)
1090#include "clang/StaticAnalyzer/Core/Analyses.def"
1093 Diags.
Report(diag::err_drv_invalid_value)
1094 << A->getAsString(Args) << Name;
1100 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1101 StringRef Name = A->getValue();
1103#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1104 .Case(CMDFLAG, NAME)
1105#include "clang/StaticAnalyzer/Core/Analyses.def"
1108 Diags.
Report(diag::err_drv_invalid_value)
1109 << A->getAsString(Args) << Name;
1117 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1119 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1122 StringRef CheckerAndPackageList = A->getValue();
1124 CheckerAndPackageList.split(CheckersAndPackages,
",");
1125 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1131 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1135 StringRef configList = A->getValue();
1137 configList.split(configVals,
",");
1138 for (
const auto &configVal : configVals) {
1140 std::tie(key, val) = configVal.split(
"=");
1143 diag::err_analyzer_config_no_value) << configVal;
1146 if (val.contains(
'=')) {
1148 diag::err_analyzer_config_multiple_values)
1157 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1162 Opts.
Config[key] = std::string(val);
1172 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1175 os << Args.getArgString(i);
1182 StringRef OptionName, StringRef DefaultVal) {
1183 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1188 StringRef &OptionField, StringRef Name,
1189 StringRef DefaultVal) {
1198 bool &OptionField, StringRef Name,
bool DefaultVal) {
1199 auto PossiblyInvalidVal =
1200 llvm::StringSwitch<std::optional<bool>>(
1203 .Case(
"false",
false)
1204 .Default(std::nullopt);
1206 if (!PossiblyInvalidVal) {
1208 Diags->
Report(diag::err_analyzer_config_invalid_input)
1209 << Name <<
"a boolean";
1211 OptionField = DefaultVal;
1213 OptionField = *PossiblyInvalidVal;
1218 unsigned &OptionField, StringRef Name,
1219 unsigned DefaultVal) {
1221 OptionField = DefaultVal;
1222 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1223 .getAsInteger(0, OptionField);
1224 if (Diags && HasFailed)
1225 Diags->
Report(diag::err_analyzer_config_invalid_input)
1226 << Name <<
"an unsigned";
1232 unsigned DefaultVal) {
1235 if (Parsed.has_value()) {
1236 OptionField = Parsed.value();
1239 if (Diags && !Parsed.has_value())
1240 Diags->
Report(diag::err_analyzer_config_invalid_input)
1241 << Name <<
"a positive";
1243 OptionField = DefaultVal;
1251#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1252 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1253#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1254#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1256 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1257 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1259#define ANALYZER_OPTION(...)
1260#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1261 SHALLOW_VAL, DEEP_VAL) \
1262 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1263 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1264#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1271 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1272 std::vector<StringRef> Checkers =
1274 std::vector<StringRef> Packages =
1278 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1280 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1282 bool IsChecker = CheckerOrPackage.contains(
'.');
1283 bool IsValidName = IsChecker
1284 ? llvm::is_contained(Checkers, CheckerOrPackage)
1285 : llvm::is_contained(Packages, CheckerOrPackage);
1288 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1289 << CheckerOrPackage;
1299 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1300 Diags->
Report(diag::err_analyzer_config_invalid_input)
1301 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1309 if (
Remark.hasValidPattern()) {
1314 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1323 OptSpecifier OptEQ, StringRef Name) {
1326 auto InitializeResultPattern = [&Diags, &Args, &
Result](
const Arg *A,
1327 StringRef Pattern) {
1328 Result.Pattern = Pattern.str();
1330 std::string RegexError;
1331 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1332 if (!
Result.Regex->isValid(RegexError)) {
1333 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1334 << RegexError << A->getAsString(Args);
1341 for (Arg *A : Args) {
1342 if (A->getOption().matches(OPT_R_Joined)) {
1343 StringRef
Value = A->getValue();
1347 else if (
Value ==
"everything")
1349 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1351 else if (
Value ==
"no-everything")
1361 InitializeResultPattern(A,
".*");
1363 }
else if (A->getOption().matches(OptEQ)) {
1365 if (!InitializeResultPattern(A, A->getValue()))
1374 const std::vector<std::string> &Levels,
1378 for (
const auto &Level : Levels) {
1380 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1388 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1396 const std::vector<std::string> &Sanitizers,
1398 for (
const auto &Sanitizer : Sanitizers) {
1401 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1415 const std::vector<std::string> &Sanitizers,
1418 for (
const auto &Sanitizer : Sanitizers) {
1420 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1429 llvm::SplitString(Bundle, BundleParts,
",");
1430 for (
const auto &B : BundleParts) {
1434 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1448 llvm::raw_string_ostream OS(Buffer);
1449 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1455 const llvm::Triple &Triple) {
1456 assert(Triple.getArch() == llvm::Triple::aarch64);
1463 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1464 : Discrimination::None);
1467 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1468 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1469 : Discrimination::None);
1471 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1479 if (
LangOpts.PointerAuthVTTVTPtrDiscrimination)
1481 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1482 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1483 : Discrimination::None);
1499 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1518 if (
LangOpts.PointerAuthObjcClassROPointers)
1531 const llvm::Triple &Triple,
1533 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1534 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1535 !LangOpts.AArch64JumpTableHardening)
1541void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1543 const llvm::Triple &
T,
1544 const std::string &OutputFile,
1548 if (Opts.OptimizationLevel == 0)
1551 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1553#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1554 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1555#include "clang/Options/Options.inc"
1556#undef CODEGEN_OPTION_WITH_MARSHALLING
1558 if (Opts.OptimizationLevel > 0) {
1562 GenerateArg(Consumer, OPT_finline_hint_functions);
1567 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1568 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1569 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1570 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1572 std::optional<StringRef> DebugInfoVal;
1573 switch (Opts.DebugInfo) {
1574 case llvm::codegenoptions::DebugLineTablesOnly:
1575 DebugInfoVal =
"line-tables-only";
1577 case llvm::codegenoptions::DebugDirectivesOnly:
1578 DebugInfoVal =
"line-directives-only";
1580 case llvm::codegenoptions::DebugInfoConstructor:
1581 DebugInfoVal =
"constructor";
1583 case llvm::codegenoptions::LimitedDebugInfo:
1584 DebugInfoVal =
"limited";
1586 case llvm::codegenoptions::FullDebugInfo:
1587 DebugInfoVal =
"standalone";
1589 case llvm::codegenoptions::UnusedTypeInfo:
1590 DebugInfoVal =
"unused-types";
1592 case llvm::codegenoptions::NoDebugInfo:
1593 DebugInfoVal = std::nullopt;
1595 case llvm::codegenoptions::LocTrackingOnly:
1596 DebugInfoVal = std::nullopt;
1600 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1604 Prefix.first +
"=" + Prefix.second);
1607 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1608 Prefix.first +
"=" + Prefix.second);
1610 if (Opts.NewStructPathTBAA)
1613 if (Opts.OptimizeSize == 1)
1615 else if (Opts.OptimizeSize == 2)
1623 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1625 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1628 if (Opts.InterchangeLoops)
1634 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1639 if (Opts.DebugNameTable ==
1640 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1642 else if (Opts.DebugNameTable ==
1643 static_cast<unsigned>(
1644 llvm::DICompileUnit::DebugNameTableKind::Default))
1647 if (Opts.DebugTemplateAlias)
1650 auto TNK = Opts.getDebugSimpleTemplateNames();
1651 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1652 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1653 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1654 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1655 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1660 if (Opts.TimePasses) {
1661 if (Opts.TimePassesPerRun)
1662 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1666 if (Opts.TimePassesJson)
1670 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1673 if (Opts.PrepareForThinLTO)
1683 GenerateArg(Consumer, OPT_save_dynamic_debugging_temps);
1685 StringRef MemProfileBasename(
"memprof.profraw");
1706 std::string InstrBundle =
1708 if (!InstrBundle.empty())
1709 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1712 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1713 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1714 else if (Opts.CFProtectionReturn)
1715 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1716 else if (Opts.CFProtectionBranch)
1717 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1719 if (Opts.CFProtectionBranch) {
1720 switch (Opts.getCFBranchLabelScheme()) {
1723#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1724 case CFBranchLabelSchemeKind::Kind: \
1725 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1727#include "clang/Basic/CFProtectionOptions.def"
1731 if (Opts.FunctionReturnThunks)
1732 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1735 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1736 F.PropagateAttrs && F.Internalize;
1738 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1742 if (Opts.EmulatedTLS)
1750 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1755 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1759 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1763 if (Opts.EnableAIXExtendedAltivecABI)
1766 if (Opts.XCOFFReadOnlyPointers)
1784 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1789 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1793 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1796 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1798 for (StringRef Sanitizer :
1800 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1802 SmallVector<std::string, 4> Values;
1804 for (std::string Sanitizer : Values)
1805 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1808 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1812 for (StringRef Sanitizer :
1814 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1816 if (!Opts.EmitVersionIdentMetadata)
1819 switch (Opts.FiniteLoops) {
1830 if (Opts.StaticClosure)
1834bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1837 const llvm::Triple &
T,
1838 const std::string &OutputFile,
1849 const LangOptions *
LangOpts = &LangOptsRef;
1851#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1852 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1853#include "clang/Options/Options.inc"
1854#undef CODEGEN_OPTION_WITH_MARSHALLING
1858 if (Opts.OptimizationLevel == 0) {
1860 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1861 options::OPT_finline_hint_functions,
1862 options::OPT_fno_inline_functions,
1863 options::OPT_fno_inline)) {
1866 if (A->getOption().matches(options::OPT_finline_functions))
1868 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1878 Opts.DirectAccessExternalData =
1879 Args.hasArg(OPT_fdirect_access_external_data) ||
1880 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1883 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1885 llvm::StringSwitch<unsigned>(A->getValue())
1886 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1887 .Case(
"line-directives-only",
1888 llvm::codegenoptions::DebugDirectivesOnly)
1889 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1890 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1891 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1892 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1895 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1898 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1904 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1905 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1906 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1907 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1908 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1909 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1910 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1913 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1914 auto Split = StringRef(Arg).split(
'=');
1918 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1919 auto Split = StringRef(Arg).split(
'=');
1923 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1924 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1925 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1926 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el,
1927 llvm::Triple::riscv32, llvm::Triple::riscv64};
1930 llvm::is_contained(DebugEntryValueArchs,
T.getArch()))
1931 Opts.EmitCallSiteInfo =
true;
1934 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1939 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1940 Args.hasArg(OPT_new_struct_path_tbaa);
1942 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1943 if (Opts.SimplifyLibCalls)
1946 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1947 (Opts.OptimizationLevel > 1));
1950 Opts.InterchangeLoops =
1951 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
true);
1952 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1953 OPT_fno_experimental_loop_fusion,
false);
1955 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1957 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1959 Opts.DebugNameTable =
static_cast<unsigned>(
1960 Args.hasArg(OPT_ggnu_pubnames)
1961 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1962 : Args.hasArg(OPT_gpubnames)
1963 ? llvm::DICompileUnit::DebugNameTableKind::Default
1964 : llvm::DICompileUnit::DebugNameTableKind::None);
1965 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1966 StringRef
Value = A->getValue();
1968 Diags.
Report(diag::err_drv_unsupported_option_argument)
1969 << A->getSpelling() << A->getValue();
1970 Opts.setDebugSimpleTemplateNames(
1971 StringRef(A->getValue()) ==
"simple"
1972 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1973 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1976 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1977 OPT_stats_file_timers)) {
1978 Opts.TimePasses =
true;
1981 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1982 StringRef Val =
EQ->getValue();
1983 if (Val ==
"per-pass")
1984 Opts.TimePassesPerRun =
false;
1985 else if (Val ==
"per-pass-run")
1986 Opts.TimePassesPerRun =
true;
1988 Diags.
Report(diag::err_drv_invalid_value)
1989 <<
EQ->getAsString(Args) <<
EQ->getValue();
1992 if (Args.getLastArg(OPT_ftime_report_json))
1993 Opts.TimePassesJson =
true;
1996 Opts.PrepareForLTO =
false;
1997 Opts.PrepareForThinLTO =
false;
1998 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1999 Opts.PrepareForLTO =
true;
2000 StringRef S = A->getValue();
2002 Opts.PrepareForThinLTO =
true;
2003 else if (S !=
"full")
2004 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
2005 if (Args.hasArg(OPT_funified_lto))
2006 Opts.PrepareForThinLTO =
true;
2008 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2010 Diags.
Report(diag::err_drv_argument_only_allowed_with)
2011 << A->getAsString(Args) <<
"-x ir";
2013 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2015 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2017 llvm::StringSwitch<std::string>(A->getValue())
2018 .Case(
"obj", OutputFile)
2019 .Default(llvm::sys::path::filename(OutputFile).str());
2021 if (Args.getLastArg(OPT_save_dynamic_debugging_temps))
2025 const char *MemProfileBasename =
"memprof.profraw";
2026 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2027 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2028 llvm::sys::path::append(Path, MemProfileBasename);
2030 }
else if (Args.hasArg(OPT_fmemory_profile))
2034 if (Args.hasArg(OPT_coverage_version_EQ)) {
2035 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2036 if (CoverageVersion.size() != 4) {
2037 Diags.
Report(diag::err_drv_invalid_value)
2038 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2048 for (
const auto &A : Args) {
2050 if (A->getOption().getID() == options::OPT_o ||
2051 A->getOption().getID() == options::OPT_INPUT ||
2052 A->getOption().getID() == options::OPT_x ||
2053 A->getOption().getID() == options::OPT_fembed_bitcode ||
2054 A->getOption().matches(options::OPT_W_Group))
2057 A->render(Args, ASL);
2058 for (
const auto &arg : ASL) {
2059 StringRef ArgStr(arg);
2060 llvm::append_range(Opts.
CmdArgs, ArgStr);
2066 auto XRayInstrBundles =
2067 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2068 if (XRayInstrBundles.empty())
2071 for (
const auto &A : XRayInstrBundles)
2075 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2076 StringRef Name = A->getValue();
2077 if (Name ==
"full") {
2078 Opts.CFProtectionReturn = 1;
2079 Opts.CFProtectionBranch = 1;
2080 }
else if (Name ==
"return")
2081 Opts.CFProtectionReturn = 1;
2082 else if (Name ==
"branch")
2083 Opts.CFProtectionBranch = 1;
2084 else if (Name !=
"none")
2085 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2088 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2089 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2091 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2092#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2093 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2094#include "clang/Basic/CFProtectionOptions.def"
2097 Opts.setCFBranchLabelScheme(Scheme);
2099 Diags.
Report(diag::err_drv_invalid_value)
2100 << A->getAsString(Args) << A->getValue();
2104 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2105 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2106 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2107 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2108 .Default(llvm::FunctionReturnThunksKind::Invalid);
2111 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2112 << A->getSpelling() <<
T.getTriple();
2113 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2114 Diags.
Report(diag::err_drv_invalid_value)
2115 << A->getAsString(Args) << A->getValue();
2116 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2117 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2118 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2119 << A->getAsString(Args)
2120 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2122 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2126 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2127 CodeGenOptions::BitcodeFileToLink F;
2129 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2130 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2139 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2140 StringRef Val = A->getValue();
2144 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2147 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2148 StringRef Val = A->getValue();
2151 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2157 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2158 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2162 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2163 << A->getSpelling() <<
T.str();
2165 const Option &O = A->getOption();
2166 if (O.matches(OPT_fpcc_struct_return) ||
2167 O.matches(OPT_maix_struct_return)) {
2170 assert(O.matches(OPT_freg_struct_return) ||
2171 O.matches(OPT_msvr4_struct_return));
2176 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2178 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2179 << A->getSpelling() <<
T.str();
2189 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2190 Diags.
Report(diag::err_roptr_requires_data_sections);
2192 Opts.XCOFFReadOnlyPointers =
true;
2195 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2196 if (!
T.isOSAIX() ||
T.isPPC32())
2197 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2198 << A->getSpelling() <<
T.str();
2201 bool NeedLocTracking =
false;
2204 NeedLocTracking =
true;
2206 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2208 NeedLocTracking =
true;
2211 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2213 NeedLocTracking =
true;
2223 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2233 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2236 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2237 <<
"-fdiagnostics-show-hotness";
2241 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2243 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2246 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2247 <<
"-fdiagnostics-hotness-threshold=";
2253 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2254 <<
"-fdiagnostics-hotness-threshold=";
2259 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2263 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2264 <<
"-fdiagnostics-misexpect-tolerance=";
2270 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2271 <<
"-fdiagnostics-misexpect-tolerance=";
2278 if (UsingSampleProfile)
2279 NeedLocTracking =
true;
2282 NeedLocTracking =
true;
2286 if (NeedLocTracking &&
2287 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2288 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2293 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2296 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2299 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2304 "-fsanitize-skip-hot-cutoff=",
2305 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2308 "-fsanitize-annotate-debug-info=",
2309 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2313 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2316 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2317 Diags.
Report(diag::err_drv_invalid_value)
2318 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2324 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2329 if (Args.hasArg(options::OPT_ffinite_loops))
2331 else if (Args.hasArg(options::OPT_fno_finite_loops))
2334 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2335 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2336 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2337 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2339 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2345 Diags.
Report(diag::err_drv_invalid_escaped_command_line)
2346 << llvm::toString(ParsedArgs.takeError());
2357#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2358 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2359#include "clang/Options/Options.inc"
2360#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2365 for (
const auto &Dep : Opts.
ExtraDeps) {
2366 switch (Dep.second) {
2379 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2388 bool ShowLineMarkers) {
2392#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2393 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2394#include "clang/Options/Options.inc"
2395#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2397 if (Args.hasArg(OPT_show_includes)) {
2412 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2413 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2414 StringRef Val = A->getValue();
2415 if (!Val.contains(
'='))
2419 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2420 StringRef Val = A->getValue();
2421 if (!Val.contains(
'='))
2428 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2432 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2436 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2437 StringRef Val = A->getValue();
2438 if (!Val.contains(
'='))
2446 if (Args.hasArg(OPT_header_include_format_EQ))
2447 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2451 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2455 if (Args.hasArg(OPT_header_include_filtering_EQ))
2456 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2460 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2468 bool DefaultColor) {
2475 for (
auto *A : Args) {
2476 const Option &O = A->getOption();
2477 if (O.matches(options::OPT_fcolor_diagnostics)) {
2479 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2481 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2482 StringRef
Value(A->getValue());
2483 if (
Value ==
"always")
2485 else if (
Value ==
"never")
2487 else if (
Value ==
"auto")
2497 for (
const auto &Prefix : VerifyPrefixes) {
2500 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2503 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2505 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2506 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2516#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2517 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2518#include "clang/Options/Options.inc"
2519#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2528#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2529 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2530#include "clang/Options/Options.inc"
2531#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2539#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2540 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2541#include "clang/Options/Options.inc"
2542#undef MIGRATOR_OPTION_WITH_MARSHALLING
2551#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2552 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2553#include "clang/Options/Options.inc"
2554#undef MIGRATOR_OPTION_WITH_MARSHALLING
2559void CompilerInvocationBase::GenerateDiagnosticArgs(
2561 bool DefaultDiagColor) {
2563#define DIAG_OPTION_WITH_MARSHALLING(...) \
2564 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2565#include "clang/Options/Options.inc"
2566#undef DIAG_OPTION_WITH_MARSHALLING
2569 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2572 switch (Opts.getShowColors()) {
2583 if (Opts.VerifyDiagnostics &&
2588 if (Prefix !=
"expected")
2591 if (Opts.VerifyDirectives) {
2599 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2602 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2604 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2606 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2608 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2613 if (
Warning ==
"undef-prefix")
2616 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2618 Consumer(StringRef(
"-W") +
Warning);
2624 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2625 "pass-analysis",
"no-pass-analysis",
2626 "pass-missed",
"no-pass-missed"};
2627 if (llvm::is_contained(IgnoredRemarks,
Remark))
2630 Consumer(StringRef(
"-R") +
Remark);
2634 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2639std::unique_ptr<DiagnosticOptions>
2641 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2642 unsigned MissingArgIndex, MissingArgCount;
2644 Argv.slice(1), MissingArgIndex, MissingArgCount);
2646 bool ShowColors =
true;
2647 if (std::optional<std::string> NoColor =
2648 llvm::sys::Process::GetEnv(
"NO_COLOR");
2649 NoColor && !NoColor->empty()) {
2664 bool DefaultDiagColor) {
2665 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2666 std::optional<DiagnosticsEngine> IgnoringDiags;
2668 IgnoringDiagOpts.emplace();
2671 Diags = &*IgnoringDiags;
2680#define DIAG_OPTION_WITH_MARSHALLING(...) \
2681 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2682#include "clang/Options/Options.inc"
2683#undef DIAG_OPTION_WITH_MARSHALLING
2685 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2688 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2692 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2693 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2695 if (Args.hasArg(OPT_verify))
2700 Opts.VerifyDiagnostics =
false;
2705 "-verify-ignore-unexpected=",
2706 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2707 if (Args.hasArg(OPT_verify_ignore_unexpected))
2709 Opts.setVerifyIgnoreUnexpected(DiagMask);
2711 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2716 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2727 unsigned DefaultOpt = 0;
2730 !Args.hasArg(OPT_cl_opt_disable))
2733 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2734 if (A->getOption().matches(options::OPT_O0))
2737 if (A->getOption().matches(options::OPT_Ofast) ||
2738 A->getOption().matches(options::OPT_O4))
2741 assert(A->getOption().matches(options::OPT_O));
2743 StringRef S(A->getValue());
2744 if (S ==
"s" || S ==
"z")
2753 unsigned MaxOptLevel = 3;
2754 if (DefaultOpt > MaxOptLevel) {
2757 Diags.
Report(diag::warn_drv_optimization_value)
2758 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2759 DefaultOpt = MaxOptLevel;
2766 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2767 if (A->getOption().matches(options::OPT_O)) {
2768 switch (A->getValue()[0]) {
2786 std::string &BlockName,
2787 unsigned &MajorVersion,
2788 unsigned &MinorVersion,
2790 std::string &UserInfo) {
2792 Arg.split(Args,
':', 5);
2793 if (Args.size() < 5)
2796 BlockName = std::string(Args[0]);
2797 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2798 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2799 if (Args[3].getAsInteger(2, Hashed))
return true;
2800 if (Args.size() > 4)
2801 UserInfo = std::string(Args[4]);
2810 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2841 OPT_emit_reduced_module_interface},
2857 OPT_print_dependency_directives_minimized_source},
2864static std::optional<frontend::ActionKind>
2867 if (ActionOpt.second == Opt.getID())
2868 return ActionOpt.first;
2870 return std::nullopt;
2874static std::optional<OptSpecifier>
2877 if (ActionOpt.first == ProgramAction)
2878 return OptSpecifier(ActionOpt.second);
2880 return std::nullopt;
2886#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2887 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2888#include "clang/Options/Options.inc"
2889#undef FRONTEND_OPTION_WITH_MARSHALLING
2891 std::optional<OptSpecifier> ProgramActionOpt =
2899 if (!ProgramActionOpt) {
2902 "Frontend action without option.");
2903 GenerateProgramAction = [&]() {
2910 GenerateProgramAction = [&]() {
2918 llvm_unreachable(
"Default AST dump format.");
2925 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2938 GenerateProgramAction = [&]() {
2943 GenerateProgramAction();
2945 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2947 for (
const auto &PluginArg : PluginArgs.second)
2949 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2950 Opt.getKind(), 0, PluginArg);
2954 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2955 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2961 for (
const auto &Plugin : Opts.
Plugins)
2967 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2980 StringRef HeaderUnit =
"";
2985 HeaderUnit =
"-user";
2988 HeaderUnit =
"-system";
2991 HeaderUnit =
"-header-unit";
2994 StringRef Header = IsHeader ?
"-header" :
"";
3017 Lang =
"objective-c";
3020 Lang =
"objective-c++";
3023 Lang =
"assembler-with-cpp";
3027 "Generating -x argument for unknown language (not precompiled).");
3042 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3046 for (
const auto &Input : Opts.
Inputs)
3047 Consumer(Input.getFile());
3056#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3057 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3058#include "clang/Options/Options.inc"
3059#undef FRONTEND_OPTION_WITH_MARSHALLING
3062 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3063 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3065 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3068 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3069 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3072 .Default(std::numeric_limits<unsigned>::max());
3074 if (Val != std::numeric_limits<unsigned>::max())
3077 Diags.
Report(diag::err_drv_invalid_value)
3078 << A->getAsString(Args) << A->getValue();
3088 Args.hasArg(OPT_interface_stub_version_EQ)
3089 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3091 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3092 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3093 ArgStr ==
"experimental-tapi-elf-v1") {
3094 std::string ErrorMessage =
3095 "Invalid interface stub format: " + ArgStr.str() +
3097 Diags.
Report(diag::err_drv_invalid_value)
3098 <<
"Must specify a valid interface stub format type, ie: "
3099 "-interface-stub-version=ifs-v1"
3102 }
else if (!ArgStr.starts_with(
"ifs-")) {
3103 std::string ErrorMessage =
3104 "Invalid interface stub format: " + ArgStr.str() +
".";
3105 Diags.
Report(diag::err_drv_invalid_value)
3106 <<
"Must specify a valid interface stub format type, ie: "
3107 "-interface-stub-version=ifs-v1"
3122 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3123 const Arg *SavedAction =
nullptr;
3124 for (
const Arg *AA :
3125 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3126 if (AA->getOption().matches(OPT_main_file_name)) {
3127 SavedAction =
nullptr;
3128 }
else if (!SavedAction) {
3131 if (!A->getOption().matches(OPT_ast_dump_EQ))
3132 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3133 << SavedAction->getSpelling() << A->getSpelling();
3140 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3141 Opts.
Plugins.emplace_back(A->getValue(0));
3145 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3146 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3148 for (
const std::string &Arg :
3149 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3150 std::string BlockName;
3151 unsigned MajorVersion;
3152 unsigned MinorVersion;
3154 std::string UserInfo;
3156 MinorVersion, Hashed, UserInfo)) {
3157 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3164 std::make_shared<TestModuleFileExtension>(
3165 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3168 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3172 Diags.
Report(diag::err_drv_invalid_value)
3173 << A->getAsString(Args) << A->getValue();
3174 Diags.
Report(diag::note_command_line_code_loc_requirement);
3178 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3179 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3180 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3182 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3183 StringRef Val = A->getValue();
3184 if (!Val.contains(
'='))
3189 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3191 if (Args.hasArg(OPT_emit_cir))
3195 if (Args.hasArg(OPT_clangir_disable_passes))
3198 if (Args.hasArg(OPT_clangir_disable_verifier))
3201 if (Args.hasArg(OPT_clangir_lib_opt) || Args.hasArg(OPT_clangir_lib_opt_EQ))
3205 if (Args.hasArg(OPT_aux_target_cpu))
3206 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3207 if (Args.hasArg(OPT_aux_target_feature))
3211 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3212 StringRef XValue = A->getValue();
3217 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3218 bool ModuleMap = XValue.consume_back(
"-module-map");
3221 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3227 if (IsHeader || Preprocessed) {
3228 if (XValue.consume_back(
"-header-unit"))
3230 else if (XValue.consume_back(
"-system"))
3232 else if (XValue.consume_back(
"-user"))
3238 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3242 DashX = llvm::StringSwitch<InputKind>(XValue)
3258 DashX = llvm::StringSwitch<InputKind>(XValue)
3266 DashX = llvm::StringSwitch<InputKind>(XValue)
3269 .Cases({
"ast",
"pcm",
"precompiled-header"},
3276 Diags.
Report(diag::err_drv_invalid_value)
3277 << A->getAsString(Args) << A->getValue();
3284 IsHeaderFile =
true;
3285 }
else if (IsHeaderFile)
3292 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3295 Inputs.push_back(
"-");
3299 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3301 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3305 StringRef(Inputs[i]).rsplit(
'.').second);
3314 bool IsSystem =
false;
3323 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3340#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3341 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3342#include "clang/Options/Options.inc"
3343#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3352 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3358 GenerateArg(Consumer, OPT_fmodules_ignore_search_path, Path.val());
3362 std::optional<bool> IsFramework,
3363 std::optional<bool> IgnoreSysRoot) {
3364 return llvm::is_contained(Groups, Entry.
Group) &&
3365 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3366 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3375 OptSpecifier Opt = [It, Matches]() {
3380 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3394 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3401 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3407 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3412 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3420 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3422 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3432 ? OPT_internal_isystem
3433 : OPT_internal_externc_isystem;
3437 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3439 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3443 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3444 : OPT_no_system_header_prefix;
3458#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3459 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3460#include "clang/Options/Options.inc"
3461#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3463 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3464 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3467 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3468 StringRef Val = A->getValue();
3469 if (Val.contains(
'=')) {
3470 auto Split = Val.split(
'=');
3472 std::string(Split.first), std::string(Split.second));
3475 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3478 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3479 StringRef MacroDef = A->getValue();
3481 llvm::CachedHashString(MacroDef.split(
'=').first));
3484 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_search_path))
3488 bool IsSysrootSpecified =
3489 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3493 auto PrefixHeaderPath = [IsSysrootSpecified,
3494 &Opts](
const llvm::opt::Arg *A,
3495 bool IsFramework =
false) -> std::string {
3496 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3497 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3499 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3500 llvm::StringRef(A->getValue()).substr(1));
3501 return std::string(Buffer);
3503 return A->getValue();
3506 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3507 bool IsFramework = A->getOption().matches(OPT_F);
3513 StringRef Prefix =
"";
3514 for (
const auto *A :
3515 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3516 if (A->getOption().matches(OPT_iprefix))
3517 Prefix = A->getValue();
3518 else if (A->getOption().matches(OPT_iwithprefix))
3524 for (
const auto *A : Args.filtered(OPT_idirafter))
3526 for (
const auto *A : Args.filtered(OPT_iquote))
3529 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3530 if (A->getOption().matches(OPT_iwithsysroot)) {
3537 for (
const auto *A : Args.filtered(OPT_iframework))
3539 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3544 for (
const auto *A : Args.filtered(OPT_c_isystem))
3546 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3548 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3550 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3554 for (
const auto *A :
3555 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3557 if (A->getOption().matches(OPT_internal_externc_isystem))
3559 Opts.
AddPath(A->getValue(), Group,
false,
true);
3561 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3565 for (
const auto *A :
3566 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3568 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3570 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3579 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3583 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3588 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3590 diags.
Report(diag::err_drv_invalid_value)
3591 << A->getAsString(Args) << A->getValue();
3593 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3599 if (Opts.PointerAuthIntrinsics)
3601 if (Opts.PointerAuthCalls)
3603 if (Opts.PointerAuthReturns)
3605 if (Opts.PointerAuthIndirectGotos)
3606 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3607 if (Opts.PointerAuthAuthTraps)
3609 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3610 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3611 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3612 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3613 if (Opts.PointerAuthVTTVTPtrDiscrimination)
3614 GenerateArg(Consumer, OPT_fptrauth_vtt_vtable_pointer_discrimination);
3615 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3616 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3617 if (Opts.PointerAuthFunctionTypeDiscrimination)
3618 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3619 if (Opts.PointerAuthInitFini)
3621 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3622 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3623 if (Opts.PointerAuthELFGOT)
3625 if (Opts.AArch64JumpTableHardening)
3626 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3627 if (Opts.PointerAuthObjcIsa)
3629 if (Opts.PointerAuthObjcInterfaceSel)
3630 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3631 if (Opts.PointerAuthObjcClassROPointers)
3632 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3633 if (Opts.PointerAuthBlockDescriptorPointers)
3634 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3639 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3640 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3641 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3642 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3643 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3644 Opts.PointerAuthVTPtrAddressDiscrimination =
3645 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3646 Opts.PointerAuthVTPtrTypeDiscrimination =
3647 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3648 Opts.PointerAuthVTTVTPtrDiscrimination =
3649 Args.hasArg(OPT_fptrauth_vtt_vtable_pointer_discrimination);
3650 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3651 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3652 Opts.PointerAuthFunctionTypeDiscrimination =
3653 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3654 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3655 Opts.PointerAuthInitFiniAddressDiscrimination =
3656 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3657 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3658 Opts.AArch64JumpTableHardening =
3659 Args.hasArg(OPT_faarch64_jump_table_hardening);
3660 Opts.PointerAuthBlockDescriptorPointers =
3661 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3662 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3663 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3664 Opts.PointerAuthObjcInterfaceSel =
3665 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3667 if (Opts.PointerAuthObjcInterfaceSel)
3668 Opts.PointerAuthObjcInterfaceSelKey =
3679 llvm_unreachable(
"should not parse language flags for this input");
3714 llvm_unreachable(
"unexpected input language");
3723 return "Objective-C";
3727 return "Objective-C++";
3731 return "C++ for OpenCL";
3750 llvm_unreachable(
"unknown input language");
3753void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3755 const llvm::Triple &
T,
3760 if (Opts.ObjCAutoRefCount)
3762 if (Opts.PICLevel != 0)
3763 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3767 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3768 for (StringRef Sanitizer :
3770 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3776 OptSpecifier StdOpt;
3778 case LangStandard::lang_opencl10:
3779 case LangStandard::lang_opencl11:
3780 case LangStandard::lang_opencl12:
3781 case LangStandard::lang_opencl20:
3782 case LangStandard::lang_opencl30:
3783 case LangStandard::lang_openclcpp10:
3784 case LangStandard::lang_openclcpp2021:
3785 StdOpt = OPT_cl_std_EQ;
3788 StdOpt = OPT_std_EQ;
3793 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3795 if (Opts.IncludeDefaultHeader)
3796 GenerateArg(Consumer, OPT_finclude_default_header);
3797 if (Opts.DeclareOpenCLBuiltins)
3798 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3800 const LangOptions *
LangOpts = &Opts;
3802#define LANG_OPTION_WITH_MARSHALLING(...) \
3803 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3804#include "clang/Options/Options.inc"
3805#undef LANG_OPTION_WITH_MARSHALLING
3816 else if (Opts.ObjCAutoRefCount == 1)
3819 if (Opts.ObjCWeakRuntime)
3820 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3825 if (Opts.ObjCSubscriptingLegacyRuntime)
3826 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3829 if (Opts.GNUCVersion != 0) {
3830 unsigned Major = Opts.GNUCVersion / 100 / 100;
3831 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3832 unsigned Patch = Opts.GNUCVersion % 100;
3834 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3837 if (Opts.IgnoreXCOFFVisibility)
3838 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3844 if (!Opts.MSVCCompat)
3846 }
else if (Opts.MSVCCompat) {
3849 if (Opts.PointerOverflowDefined)
3852 if (Opts.MSCompatibilityVersion != 0) {
3853 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3854 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3855 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3856 GenerateArg(Consumer, OPT_fms_compatibility_version,
3857 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3860 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3862 if (!Opts.Trigraphs)
3869 if (
T.isOSzOS() && !Opts.ZOSExt)
3871 else if (Opts.ZOSExt)
3874 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3877 if (Opts.ConvergentFunctions)
3880 GenerateArg(Consumer, OPT_fno_convergent_functions);
3882 if (Opts.NoBuiltin && !Opts.Freestanding)
3885 if (!Opts.NoBuiltin)
3889 if (Opts.LongDoubleSize == 128)
3891 else if (Opts.LongDoubleSize == 64)
3893 else if (Opts.LongDoubleSize == 80)
3900 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3903 if (Opts.OpenMP != 51)
3904 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3906 if (!Opts.OpenMPUseTLS)
3909 if (Opts.OpenMPIsTargetDevice)
3910 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3912 if (Opts.OpenMPIRBuilder)
3913 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3916 if (Opts.OpenMPSimd) {
3919 if (Opts.OpenMP != 51)
3920 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3923 if (Opts.OpenMPThreadSubscription)
3924 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3926 if (Opts.OpenMPTeamSubscription)
3927 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3929 if (Opts.OpenMPTargetDebug != 0)
3930 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3931 Twine(Opts.OpenMPTargetDebug));
3933 if (Opts.OpenMPCUDANumSMs != 0)
3934 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3935 Twine(Opts.OpenMPCUDANumSMs));
3937 if (Opts.OpenMPCUDABlocksPerSM != 0)
3938 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3939 Twine(Opts.OpenMPCUDABlocksPerSM));
3942 std::string Targets;
3943 llvm::raw_string_ostream
OS(Targets);
3946 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3947 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3950 if (Opts.OpenMPCUDAMode)
3966 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3969 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3970 for (StringRef Sanitizer :
3972 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3976 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3978 switch (Opts.getClangABICompat()) {
3979#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3980 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3981 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3983#define ABI_VER_MAJOR(Major) \
3984 case LangOptions::ClangABI::Ver##Major: \
3985 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3987#define ABI_VER_LATEST(Latest) \
3988 case LangOptions::ClangABI::Latest: \
3990#include "clang/Basic/ABIVersions.def"
3993 if (Opts.getSignReturnAddressScope() ==
3995 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3996 else if (Opts.getSignReturnAddressScope() ==
3998 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
4000 if (Opts.getSignReturnAddressKey() ==
4002 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
4008 if (Opts.RelativeCXXABIVTables)
4009 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
4011 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
4019 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
4029 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
4030 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
4033 if (Opts.MatrixTypes) {
4034 if (Opts.getDefaultMatrixMemoryLayout() ==
4036 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
4037 if (Opts.getDefaultMatrixMemoryLayout() ==
4039 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4043bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4045 std::vector<std::string> &Includes,
4055 if (Args.hasArg(OPT_fobjc_arc))
4056 Opts.ObjCAutoRefCount = 1;
4060 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4064 "-fsanitize-ignore-for-ubsan-feature=",
4065 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4076 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4079 Diags.
Report(diag::err_drv_invalid_value)
4080 << A->getAsString(Args) << A->getValue();
4082 for (
unsigned KindValue = 0;
4088 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4090 unsigned NumAliases = 0;
4091#define LANGSTANDARD(id, name, lang, desc, features, version)
4092#define LANGSTANDARD_ALIAS(id, alias) \
4093 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4094#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4095#include "clang/Basic/LangStandards.def"
4097#define LANGSTANDARD(id, name, lang, desc, features, version)
4098#define LANGSTANDARD_ALIAS(id, alias) \
4099 if (KindValue == LangStandard::lang_##id) Diag << alias;
4100#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4101#include "clang/Basic/LangStandards.def"
4109 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4117 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4119 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4120 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4121 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4122 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4123 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4124 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4125 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4126 .Cases({
"cl3.1",
"CL3.1"}, LangStandard::lang_opencl31)
4127 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4128 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4129 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4133 Diags.
Report(diag::err_drv_invalid_value)
4134 << A->getAsString(Args) << A->getValue();
4137 LangStd = OpenCLLangStd;
4141 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4142 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4150#define LANG_OPTION_WITH_MARSHALLING(...) \
4151 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4152#include "clang/Options/Options.inc"
4153#undef LANG_OPTION_WITH_MARSHALLING
4158 Opts.Modules = Opts.ClangModules || Opts.CPlusPlusModules;
4160 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4161 StringRef Name = A->getValue();
4162 if (Name ==
"full") {
4163 Opts.CFProtectionBranch = 1;
4164 Opts.CFProtectionReturn = 1;
4165 }
else if (Name ==
"branch") {
4166 Opts.CFProtectionBranch = 1;
4167 }
else if (Name ==
"return") {
4168 Opts.CFProtectionReturn = 1;
4172 if (Opts.CFProtectionBranch) {
4173 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4175 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4176#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4177 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4178#include "clang/Basic/CFProtectionOptions.def"
4180 Opts.setCFBranchLabelScheme(Scheme);
4184 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4185 !Args.hasArg(OPT_sycl_std_EQ)) {
4195 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4196 StringRef value =
arg->getValue();
4198 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4201 if (Args.hasArg(OPT_fobjc_gc_only))
4203 else if (Args.hasArg(OPT_fobjc_gc))
4205 else if (Args.hasArg(OPT_fobjc_arc)) {
4206 Opts.ObjCAutoRefCount = 1;
4208 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4215 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4216 Opts.ObjCWeakRuntime = 1;
4222 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4223 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4224 assert(!Opts.ObjCWeak);
4226 Diags.
Report(diag::err_objc_weak_with_gc);
4227 }
else if (!Opts.ObjCWeakRuntime) {
4228 Diags.
Report(diag::err_objc_weak_unsupported);
4232 }
else if (Opts.ObjCAutoRefCount) {
4233 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4236 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4237 Opts.ObjCSubscriptingLegacyRuntime =
4241 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4244 VersionTuple GNUCVer;
4245 bool Invalid = GNUCVer.tryParse(A->getValue());
4246 unsigned Major = GNUCVer.getMajor();
4247 unsigned Minor = GNUCVer.getMinor().value_or(0);
4248 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4249 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4250 Diags.
Report(diag::err_drv_invalid_value)
4251 << A->getAsString(Args) << A->getValue();
4253 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4256 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4257 Opts.IgnoreXCOFFVisibility = 1;
4259 if (Args.hasArg(OPT_ftrapv)) {
4263 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4264 }
else if (Args.hasFlag(OPT_fwrapv, OPT_fno_wrapv, Opts.MSVCCompat)) {
4267 if (Args.hasArg(OPT_fwrapv_pointer))
4268 Opts.PointerOverflowDefined =
true;
4270 Opts.MSCompatibilityVersion = 0;
4271 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4273 if (VT.tryParse(A->getValue()))
4274 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4276 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4277 VT.getMinor().value_or(0) * 100000 +
4278 VT.getSubminor().value_or(0);
4286 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4289 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4292 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4294 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4295 && Opts.OpenCLVersion == 200);
4297 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4298 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4299 Opts.ConvergentFunctions =
4300 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4301 HasConvergentOperations);
4303 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4304 if (!Opts.NoBuiltin)
4306 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4307 if (A->getOption().matches(options::OPT_mlong_double_64))
4308 Opts.LongDoubleSize = 64;
4309 else if (A->getOption().matches(options::OPT_mlong_double_80))
4310 Opts.LongDoubleSize = 80;
4311 else if (A->getOption().matches(options::OPT_mlong_double_128))
4312 Opts.LongDoubleSize = 128;
4314 Opts.LongDoubleSize = 0;
4316 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4322 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4324 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4325 << A->getSpelling() <<
"-fdefault-calling-conv";
4327 switch (
T.getArch()) {
4328 case llvm::Triple::x86:
4331 case llvm::Triple::m68k:
4335 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4336 << A->getSpelling() <<
T.getTriple();
4342 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4344 bool IsSimdSpecified =
4345 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4347 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4349 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4350 Opts.OpenMPIsTargetDevice =
4351 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4352 Opts.OpenMPIRBuilder =
4353 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4354 bool IsTargetSpecified =
4355 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4357 if (Opts.OpenMP || Opts.OpenMPSimd) {
4359 Args, OPT_fopenmp_version_EQ,
4360 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4361 Opts.OpenMP = Version;
4364 if (!Opts.OpenMPIsTargetDevice) {
4365 switch (
T.getArch()) {
4369 case llvm::Triple::nvptx:
4370 case llvm::Triple::nvptx64:
4371 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4379 if ((Opts.OpenMPIsTargetDevice &&
T.isGPU()) || Opts.OpenCLCPlusPlus) {
4381 Opts.Exceptions = 0;
4382 Opts.CXXExceptions = 0;
4384 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4385 Opts.OpenMPCUDANumSMs =
4387 Opts.OpenMPCUDANumSMs, Diags);
4388 Opts.OpenMPCUDABlocksPerSM =
4390 Opts.OpenMPCUDABlocksPerSM, Diags);
4395 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4396 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4398 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4399 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4400 Opts.OpenMPTargetDebug = 1;
4403 if (Opts.OpenMPIsTargetDevice) {
4404 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4405 Opts.OpenMPTeamSubscription =
true;
4406 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4407 Opts.OpenMPThreadSubscription =
true;
4411 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4412 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4413 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4414 if (
T.isArch16Bit())
4416 if (
T.isArch32Bit())
4418 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4422 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4423 llvm::Triple TT(A->getValue(i));
4425 if (TT.getArch() == llvm::Triple::UnknownArch ||
4426 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4427 TT.getArch() == llvm::Triple::spirv64 ||
4428 TT.getArch() == llvm::Triple::systemz ||
4429 TT.getArch() == llvm::Triple::loongarch64 ||
4430 TT.getArch() == llvm::Triple::nvptx ||
4431 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4432 TT.getArch() == llvm::Triple::x86 ||
4433 TT.getArch() == llvm::Triple::x86_64))
4434 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4435 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4436 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4437 << A->getValue(i) <<
T.str();
4444 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4445 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4446 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4449 if (Args.hasArg(options::OPT_fopenacc))
4450 Opts.OpenACC =
true;
4452 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4453 StringRef Val = A->getValue();
4456 else if (Val ==
"on")
4458 else if (Val ==
"off")
4460 else if (Val ==
"fast-honor-pragmas")
4463 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4467 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4468 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4470 llvm::StringSwitch<unsigned>(A->getValue(i))
4473 .Case(
"add-unsigned-overflow-test",
4475 .Case(
"add-signed-overflow-test",
4478 .Case(
"unsigned-post-decr-while",
4488 "-fsanitize-ignore-for-ubsan-feature=",
4489 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4491 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4492 std::vector<std::string> systemIgnorelists =
4493 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4495 systemIgnorelists.begin(),
4496 systemIgnorelists.end());
4498 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4499 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4501 StringRef Ver = A->getValue();
4502 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4503 int Major, Minor = 0;
4507 if (!VerParts.first.starts_with(
"0") &&
4508 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4509 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4511 ? VerParts.second.size() == 1 &&
4512 !VerParts.second.getAsInteger(10, Minor)
4513 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4515#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4516 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4517 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4519#define ABI_VER_MAJOR(Major_) \
4520 if (Major <= Major_) \
4521 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4523#define ABI_VER_LATEST(Latest) \
4526#include "clang/Basic/ABIVersions.def"
4527 }
else if (Ver !=
"latest") {
4528 Diags.
Report(diag::err_drv_invalid_value)
4529 << A->getAsString(Args) << A->getValue();
4533 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4534 StringRef SignScope = A->getValue();
4536 if (SignScope.equals_insensitive(
"none"))
4537 Opts.setSignReturnAddressScope(
4539 else if (SignScope.equals_insensitive(
"all"))
4540 Opts.setSignReturnAddressScope(
4542 else if (SignScope.equals_insensitive(
"non-leaf"))
4543 Opts.setSignReturnAddressScope(
4546 Diags.
Report(diag::err_drv_invalid_value)
4547 << A->getAsString(Args) << SignScope;
4549 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4550 StringRef SignKey = A->getValue();
4551 if (!SignScope.empty() && !SignKey.empty()) {
4552 if (SignKey ==
"a_key")
4553 Opts.setSignReturnAddressKey(
4555 else if (SignKey ==
"b_key")
4556 Opts.setSignReturnAddressKey(
4559 Diags.
Report(diag::err_drv_invalid_value)
4560 << A->getAsString(Args) << SignKey;
4566 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4573 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4579 Opts.RelativeCXXABIVTables =
4580 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4581 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4585 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4586 Opts.OmitVTableRTTI =
4587 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4588 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4589 if (Opts.OmitVTableRTTI && HasRTTI)
4590 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4592 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4593 auto Split = StringRef(A).split(
'=');
4595 {std::string(
Split.first), std::string(
Split.second)});
4599 !Args.getLastArg(OPT_fno_file_reproducible) &&
4600 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4601 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4602 Args.getLastArg(OPT_ffile_reproducible));
4605 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4607 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4608 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4610 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4612 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4613 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4616 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4617 std::ifstream SeedFile(A->getValue(0));
4619 if (!SeedFile.is_open())
4620 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4626 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4629 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4630 StringRef S = Arg->getValue();
4632 if (S.getAsInteger(0,
Value))
4633 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4638 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4639 StringRef S = Arg->getValue();
4640 if (
auto Mode = getAllocTokenModeFromString(S))
4643 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4647 if (Opts.MatrixTypes) {
4648 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4649 StringRef ClangValue = A->getValue();
4650 if (ClangValue ==
"row-major")
4651 Opts.setDefaultMatrixMemoryLayout(
4654 Opts.setDefaultMatrixMemoryLayout(
4657 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4658 StringRef OptValue = A->getValue();
4659 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4660 ClangValue != OptValue)
4661 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4662 << ClangValue << OptValue;
4671 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4673 enum {
OS, Environment };
4675 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4677 if (
T.getOSName().empty()) {
4678 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4679 << ExpectedOS <<
OS <<
T.str();
4680 }
else if (
T.getEnvironmentName().empty()) {
4681 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4683 }
else if (!
T.isShaderStageEnvironment()) {
4684 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4689 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4690 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4691 << ShaderModel <<
T.getOSName() <<
T.str();
4696 if (Args.getLastArg(OPT_fnative_half_type) ||
4697 Args.getLastArg(OPT_fnative_int16_type)) {
4698 const LangStandard &Std =
4700 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4701 T.getOSVersion() >= VersionTuple(6, 2)))
4702 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4703 <<
"-enable-16bit-types" <<
true << Std.
getName()
4704 <<
T.getOSVersion().getAsString();
4706 }
else if (
T.isSPIRVLogical()) {
4707 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4708 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4709 << VulkanEnv <<
T.getOSName() <<
T.str();
4711 if (Args.getLastArg(OPT_fnative_half_type) ||
4712 Args.getLastArg(OPT_fnative_int16_type)) {
4713 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4714 ?
"-fnative-half-type"
4715 :
"-fnative-int16-type";
4716 const LangStandard &Std =
4718 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4719 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4720 << Str <<
false << Std.
getName();
4723 llvm_unreachable(
"expected DXIL or SPIR-V target");
4726 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4728 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4729 const LangStandard &Requested =
4731 const LangStandard &Recommended =
4733 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4783 llvm_unreachable(
"invalid frontend action");
4827 llvm_unreachable(
"invalid frontend action");
4837#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4838 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4839#include "clang/Options/Options.inc"
4840#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4843 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4846 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4853 for (
const auto &M : Opts.
Macros) {
4856 if (M.first ==
"__CET__=1" && !M.second &&
4857 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4859 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4860 !CodeGenOpts.CFProtectionBranch)
4862 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4863 CodeGenOpts.CFProtectionBranch)
4866 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4869 for (
const auto &I : Opts.
Includes) {
4872 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4873 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4878 if (LangOpts.HLSL && I ==
"hlsl.h")
4888 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4894 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4897 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4911#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4912 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4913#include "clang/Options/Options.inc"
4914#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4916 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4917 Args.hasArg(OPT_pch_through_hdrstop_use);
4919 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4922 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4923 StringRef
Value(A->getValue());
4924 size_t Comma =
Value.find(
',');
4926 unsigned EndOfLine = 0;
4928 if (Comma == StringRef::npos ||
4929 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4930 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4931 Diags.
Report(diag::err_drv_preamble_format);
4939 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4940 if (A->getOption().matches(OPT_D))
4947 for (
const auto *A : Args.filtered(OPT_include))
4948 Opts.
Includes.emplace_back(A->getValue());
4950 for (
const auto *A : Args.filtered(OPT_chain_include))
4953 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4954 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4956 if (Split.second.empty()) {
4957 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4964 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4965 StringRef Epoch = A->getValue();
4969 const uint64_t MaxTimestamp =
4970 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4972 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4973 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4974 << Epoch << MaxTimestamp;
4980 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4981 StringRef Val = A->getValue();
4992 Args.hasFlag(OPT_fdefine_target_os_macros,
5004#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5005 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5006#include "clang/Options/Options.inc"
5007#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5025#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5026 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5027#include "clang/Options/Options.inc"
5028#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5031 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
5040#define TARGET_OPTION_WITH_MARSHALLING(...) \
5041 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5042#include "clang/Options/Options.inc"
5043#undef TARGET_OPTION_WITH_MARSHALLING
5049 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5071#define TARGET_OPTION_WITH_MARSHALLING(...) \
5072 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5073#include "clang/Options/Options.inc"
5074#undef TARGET_OPTION_WITH_MARSHALLING
5076 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5077 llvm::VersionTuple Version;
5078 if (Version.tryParse(A->getValue()))
5079 Diags.
Report(diag::err_drv_invalid_value)
5080 << A->getAsString(Args) << A->getValue();
5085 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5086 llvm::VersionTuple Version;
5087 if (Version.tryParse(A->getValue()))
5088 Diags.
Report(diag::err_drv_invalid_value)
5089 << A->getAsString(Args) << A->getValue();
5094 if (Arg *A = Args.getLastArg(options::OPT_mxnack, options::OPT_mno_xnack)) {
5095 bool IsEnabled = A->getOption().matches(options::OPT_mxnack);
5102 Args.getLastArg(options::OPT_msramecc, options::OPT_mno_sramecc)) {
5103 bool IsEnabled = A->getOption().matches(options::OPT_msramecc);
5112bool CompilerInvocation::CreateFromArgsImpl(
5120 unsigned MissingArgIndex, MissingArgCount;
5121 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5122 MissingArgCount, VisibilityMask);
5126 if (MissingArgCount)
5127 Diags.
Report(diag::err_drv_missing_argument)
5128 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5131 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5132 auto ArgString = A->getAsString(Args);
5133 std::string Nearest;
5134 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5135 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5137 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5138 << ArgString << Nearest;
5171 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5185 Diags.
Report(diag::warn_drv_openacc_without_cir);
5193 if (!Args.hasArg(options::OPT_triple))
5205 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5206 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5207 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5208 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5221 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5227 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5238 llvm::driver::ProfileInstrKind::ProfileNone)
5239 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5249 const char *Argv0) {
5255 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5259 Args.push_back(
"-cc1");
5262 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5267 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5280 const unsigned LanguageOptionValues[] = {
5281#define HASH_LANGOPT_Benign(Value)
5282#define HASH_LANGOPT_Compatible(Value) Value,
5283#define HASH_LANGOPT_NotCompatible(Value) Value,
5284#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5285 HASH_LANGOPT_##Compatibility(LangOpts->Name)
5286#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5287 HASH_LANGOPT_##Compatibility(static_cast<unsigned>(LangOpts->get##Name()))
5288#include "clang/Basic/LangOptions.def"
5290#undef HASH_LANGOPT_Benign
5291#undef HASH_LANGOPT_Compatible
5292#undef HASH_LANGOPT_NotCompatible
5295 HBuilder.addRangeElements(LanguageOptionValues);
5300 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5317 StringRef MacroDef =
Macro.first;
5319 llvm::CachedHashString(MacroDef.split(
'=').first)))
5323 HBuilder.add(
Macro);
5336 for (
const auto &UserEntry : hsOpts.
UserEntries) {
5341 StringRef Path = UserEntry.Path;
5346 HBuilder.add(UserEntry);
5352#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5353#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5354 HBuilder.add(diagOpts.get##Name());
5355#include "clang/Basic/DiagnosticOptions.def"
5365 ext->hashExtension(HBuilder);
5372 HBuilder.add(*Minor);
5373 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5374 HBuilder.add(*Subminor);
5376 HBuilder.add(*Build);
5382#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5383 if constexpr (CK::Compatibility != CK::Benign) \
5384 HBuilder.add(CodeGenOpts->Name);
5385#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5386 if constexpr (CK::Compatibility != CK::Benign) \
5387 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5388#define DEBUGOPT(Name, Bits, Default, Compatibility)
5389#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5390#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5391#include "clang/Basic/CodeGenOptions.def"
5403#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5404 if constexpr (CK::Compatibility != CK::Benign) \
5405 HBuilder.add(CodeGenOpts->Name);
5406#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5407 if constexpr (CK::Compatibility != CK::Benign) \
5408 HBuilder.add(CodeGenOpts->Name);
5409#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5410 if constexpr (CK::Compatibility != CK::Benign) \
5411 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5412#include "clang/Basic/DebugOptions.def"
5419 if (!SanHash.
empty())
5420 HBuilder.add(SanHash.
Mask);
5422 llvm::MD5::MD5Result
Result;
5423 HBuilder.getHasher().final(
Result);
5425 return toString(llvm::APInt(64, Hash), 36,
false);
5429 llvm::function_ref<
VisitMutResult(StringRef, std::string &)> Cb) {
5430 std::string NewValue;
5432#define RETURN_IF(OPTS, PATH) \
5434 VisitMutResult Res = Cb(PATH, NewValue); \
5435 if (Res.Replace) { \
5436 (void)ensureOwned(OPTS); \
5438 std::swap(PATH, NewValue); \
5440 if (Res.Terminate) \
5444#define RETURN_IF_MANY(OPTS, PATHS) \
5446 for (unsigned I = 0, E = PATHS.size(); I != E; ++I) \
5447 RETURN_IF(OPTS, PATHS[I]); \
5452 for (
auto &Entry :
HSOpts->UserEntries)
5453 if (Entry.IgnoreSysRoot)
5458 for (
auto &[Name,
File] :
HSOpts->PrebuiltModuleFiles)
5470 if (Input.isBuffer())
5508 [&Cb](StringRef Path, std::string &) {
return Cb(Path); });
5537 std::vector<std::string> Args{
"-cc1"};
5539 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5565 llvm::vfs::getRealFileSystem());
5573 Diags, std::move(BaseFS));
5579 if (VFSOverlayFiles.empty())
5584 for (
const auto &
File : VFSOverlayFiles) {
5585 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5588 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5593 std::move(Buffer.get()),
nullptr,
File,
5596 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 std::optional< IntTy > normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &Diags)
static std::optional< std::string > normalizeString(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, OptSpecifier OtherOpt)
static void parsePointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple, DiagnosticsEngine &Diags)
static void denormalizeString(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, T Value)
static SmallVector< StringRef, 4 > serializeSanitizerKinds(SanitizerSet S)
static void parseXRayInstrumentationBundle(StringRef FlagName, StringRef Bundle, ArgList &Args, DiagnosticsEngine &D, XRayInstrSet &S)
static void GenerateFrontendArgs(const FrontendOptions &Opts, ArgumentConsumer Consumer, bool IsHeader)
static std::optional< SimpleEnumValue > findValueTableByValue(const SimpleEnumValueTable &Table, unsigned Value)
static void GenerateSSAFArgs(const ssaf::SSAFOptions &Opts, ArgumentConsumer Consumer)
static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static auto makeFlagToValueNormalizer(T Value)
#define RETURN_IF_MANY(OPTS, PATHS)
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)
#define RETURN_IF(OPTS, PATH)
static std::optional< std::string > normalizeTriple(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
T & ensureOwned(std::shared_ptr< T > &Storage)
static void GenerateMigratorArgs(const MigratorOptions &Opts, ArgumentConsumer Consumer)
static const auto & getFrontendActionTable()
Return a table that associates command line option specifiers with the frontend action.
static void GenerateTargetArgs(const TargetOptions &Opts, ArgumentConsumer Consumer)
static std::optional< frontend::ActionKind > getFrontendAction(OptSpecifier &Opt)
Maps command line option to frontend action.
static bool checkVerifyPrefixes(const std::vector< std::string > &VerifyPrefixes, DiagnosticsEngine &Diags)
static SanitizerMaskCutoffs parseSanitizerWeightedKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags)
static ShowColorsKind parseShowColorsMode(const ArgList &Args, bool DefaultColor)
static void GenerateAPINotesArgs(const APINotesOptions &Opts, ArgumentConsumer Consumer)
static bool isCodeGenAction(frontend::ActionKind Action)
static std::optional< bool > normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, const ArgList &Args, DiagnosticsEngine &)
static void GenerateFileSystemArgs(const FileSystemOptions &Opts, ArgumentConsumer Consumer)
static bool IsInputCompatibleWithStandard(InputKind IK, const LangStandard &S)
Check if input file kind and language standard are compatible.
static void denormalizeStringImpl(ArgumentConsumer Consumer, const Twine &Spelling, Option::OptionClass OptClass, unsigned, const Twine &Value)
static llvm::StringRef lookupStrInTable(unsigned Offset)
static bool ParseSSAFArgs(ssaf::SSAFOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void GeneratePreprocessorArgs(const PreprocessorOptions &Opts, ArgumentConsumer Consumer, const LangOptions &LangOpts, const FrontendOptions &FrontendOpts, const CodeGenOptions &CodeGenOpts)
static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, bool &IsHeaderFile)
static auto makeBooleanOptionDenormalizer(bool Value)
static void GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, ArgumentConsumer Consumer, frontend::ActionKind Action)
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action)
static std::string serializeXRayInstrumentationBundle(const XRayInstrSet &S)
static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static void ParseAPINotesArgs(APINotesOptions &Opts, ArgList &Args, DiagnosticsEngine &diags)
static void denormalizeStringVector(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, const std::vector< std::string > &Values)
static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action, bool ShowLineMarkers)
static Expected< std::optional< uint32_t > > parseToleranceOption(StringRef Arg)
static std::optional< std::vector< std::string > > normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &)
static void GenerateAnalyzerArgs(const AnalyzerOptions &Opts, ArgumentConsumer Consumer)
static void GenerateOptimizationRemark(ArgumentConsumer Consumer, OptSpecifier OptEQ, StringRef Name, const CodeGenOptions::OptRemark &Remark)
Generate a remark argument. This is an inverse of ParseOptimizationRemark.
static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action)
llvm::function_ref< void( CompilerInvocation &, SmallVectorImpl< const char * > &, CompilerInvocation::StringAllocator)> GenerateFn
static bool RoundTrip(ParseFn Parse, GenerateFn Generate, CompilerInvocation &RealInvocation, CompilerInvocation &DummyInvocation, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0, bool CheckAgainstOriginalInvocation=false, bool ForceRoundTrip=false)
May perform round-trip of command line arguments.
static void denormalizeSimpleEnum(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, T Value)
std::shared_ptr< T > make_shared_copy(const T &X)
llvm::function_ref< bool(CompilerInvocation &, ArrayRef< const char * >, DiagnosticsEngine &, const char *)> ParseFn
static bool parseTestModuleFileExtensionArg(StringRef Arg, std::string &BlockName, unsigned &MajorVersion, unsigned &MinorVersion, bool &Hashed, std::string &UserInfo)
Parse the argument to the -ftest-module-file-extension command-line argument.
static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, ArgumentConsumer Consumer)
static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config, StringRef OptionName, StringRef DefaultVal)
static bool FixupInvocation(CompilerInvocation &Invocation, DiagnosticsEngine &Diags, const ArgList &Args, InputKind IK)
static void parseSanitizerKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags, SanitizerSet &S)
static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts, ArgumentConsumer Consumer)
Defines the clang::FileSystemOptions interface.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines types useful for describing an Objective-C runtime.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SanitizerKind enum.
Defines the clang::SourceLocation class and associated facilities.
#define CXXABI(Name, Str)
Defines the clang::TargetOptions class.
Defines version macros and version-related utility functions for Clang.
Defines the clang::XRayInstrKind enum.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Tracks various options which control how API notes are found and handled.
llvm::VersionTuple SwiftVersion
The Swift version which should be used for API notes.
std::vector< std::string > ModuleSearchPaths
The set of search paths where we API notes can be found for particular modules.
Stores options for the analyzer from the command line.
static std::vector< StringRef > getRegisteredPackages(bool IncludeExperimental=false)
Retrieves the list of packages generated from Checkers.td.
std::vector< std::pair< std::string, bool > > CheckersAndPackages
Pairs of checker/package name and enable/disable.
std::vector< std::string > SilencedCheckersAndPackages
Vector of checker/package names which will not emit warnings.
AnalysisDiagClients AnalysisDiagOpt
AnalysisConstraints AnalysisConstraintsOpt
ConfigTable Config
A key-value table of use-specified configuration values.
unsigned ShouldEmitErrorsOnInvalidConfigValue
AnalysisPurgeMode AnalysisPurgeOpt
bool isUnknownAnalyzerConfig(llvm::StringRef Name)
static std::vector< StringRef > getRegisteredCheckers(bool IncludeExperimental=false)
Retrieves the list of checkers generated from Checkers.td.
llvm::StringMap< std::string > ConfigTable
std::string FullCompilerInvocation
Store full compiler invocation for reproducible instructions in the generated report.
AnalysisInliningMode InliningMode
The mode of function selection used during inlining.
static bool isBuiltinFunc(llvm::StringRef Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::SmallVector< std::pair< std::string, std::string >, 0 > CoveragePrefixMap
Prefix replacement map for source-based code coverage to remap source file paths in coverage mapping.
SanitizerSet SanitizeMergeHandlers
Set of sanitizer checks that can merge handlers (smaller code size at the expense of debuggability).
std::string StackUsageFile
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
llvm::SmallVector< std::pair< std::string, std::string >, 0 > DebugPrefixMap
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
std::string BinutilsVersion
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
std::optional< uint64_t > DiagnosticsHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
char CoverageVersion[4]
The version string to put into coverage files.
std::string HLSLRecordCommandLine
The string containing the commandline for the dx.source.args metadata, if non-empty.
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
uint64_t LargeDataThreshold
The code model-specific large data threshold to use (-mlarge-data-threshold).
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::string CodeModel
The code model to use (-mcmodel).
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::optional< uint32_t > DiagnosticsMisExpectTolerance
The maximum percentage profiling weights can deviate from the expected values in order to be included...
std::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
bool hasSanitizeCoverage() const
SanitizerSet SanitizeAnnotateDebugInfo
Set of sanitizer checks, for which the instrumentation will be annotated with extra debug info.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
bool hasReducedDebugInfo() const
Check if type and variable info should be emitted.
OptRemark OptimizationRemark
Selected optimizations for which we should enable optimization remarks.
std::string ThinLTOIndexFile
Name of the function summary index file to use for ThinLTO function importing.
const char * Argv0
Executable and command-line used to create a given CompilerInvocation.
llvm::SmallVector< llvm::SmallString< 8 > > HLSLParsedCommandLine
The vector contains parsed commandline for the dx.source.args metadata, if parsing was successful.
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
OptRemark OptimizationRemarkAnalysis
Selected optimizations for which we should enable optimization analyses.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
std::string SaveDynDbgTempsFilePrefix
Prefix to use for -save-dynamic-debugging-temps output.
The base class of CompilerInvocation.
std::shared_ptr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::shared_ptr< AnalyzerOptions > AnalyzerOpts
Options controlling the static analyzer.
std::shared_ptr< MigratorOptions > MigratorOpts
std::shared_ptr< PreprocessorOutputOptions > PreprocessorOutputOpts
Options controlling preprocessed output.
std::shared_ptr< APINotesOptions > APINotesOpts
Options controlling API notes.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
const FrontendOptions & getFrontendOpts() const
std::shared_ptr< ssaf::SSAFOptions > SSAFOpts
Options controlling the Scalable Static Analysis Framework (SSAF).
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
const ssaf::SSAFOptions & getSSAFOpts() 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
CompilerInvocationBase & shallow_copy_assign(const CompilerInvocationBase &X)
const TargetOptions & getTargetOpts() const
std::shared_ptr< CodeGenOptions > CodeGenOpts
Options controlling IRgen and the backend.
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
const APINotesOptions & getAPINotesOpts() const
const HeaderSearchOptions & getHeaderSearchOpts() const
std::shared_ptr< HeaderSearchOptions > HSOpts
Options controlling the #include directive.
const PreprocessorOptions & getPreprocessorOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
const LangOptions & getLangOpts() const
Const getters.
std::shared_ptr< FrontendOptions > FrontendOpts
Options controlling the frontend itself.
llvm::function_ref< void(const Twine &)> ArgumentConsumer
std::shared_ptr< DependencyOutputOptions > DependencyOutputOpts
Options controlling dependency output.
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
MigratorOptions & getMigratorOpts()
AnalyzerOptions & getAnalyzerOpts()
APINotesOptions & getAPINotesOpts()
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
ssaf::SSAFOptions & getSSAFOpts()
LangOptions & getLangOpts()
Mutable getters.
static bool checkCC1RoundTrip(ArrayRef< const char * > Args, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Check that Args can be parsed and re-serialized without change, emiting diagnostics for any differenc...
DependencyOutputOptions & getDependencyOutputOpts()
CompilerInvocation()=default
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
FileSystemOptions & getFileSystemOpts()
CompilerInvocation & operator=(const CompilerInvocation &X)
static void setDefaultPointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple)
Populate Opts with the default set of pointer authentication-related options given LangOpts and Tripl...
CodeGenOptions & getCodeGenOpts()
TargetOptions & getTargetOpts()
std::string computeContextHash() const
Compute the context hash - a string that uniquely identifies compiler settings.
HeaderSearchOptions & getHeaderSearchOpts()
DiagnosticOptions & getDiagnosticOpts()
PreprocessorOutputOptions & getPreprocessorOutputOpts()
Same as CompilerInvocation, but with copy-on-write optimization.
FrontendOptions & getMutFrontendOpts()
LangOptions & getMutLangOpts()
Mutable getters.
HeaderSearchOptions & getMutHeaderSearchOpts()
MigratorOptions & getMutMigratorOpts()
PreprocessorOptions & getMutPreprocessorOpts()
APINotesOptions & getMutAPINotesOpts()
PreprocessorOutputOptions & getMutPreprocessorOutputOpts()
CodeGenOptions & getMutCodeGenOpts()
TargetOptions & getMutTargetOpts()
FileSystemOptions & getMutFileSystemOpts()
AnalyzerOptions & getMutAnalyzerOpts()
void visitMutPaths(llvm::function_ref< VisitMutResult(StringRef, std::string &)> Cb)
Visits paths stored in the invocation, allowing the callback to mutate them via the out-param.
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
CowCompilerInvocation()=default
void visitPaths(llvm::function_ref< VisitConstResult(StringRef)> Cb) const
Visits paths stored in the invocation.
ssaf::SSAFOptions & getMutSSAFOpts()
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
HeaderIncludeFormatKind HeaderIncludeFormat
The format of header information.
std::string OutputFile
The file to write dependency output to.
HeaderIncludeFilteringKind HeaderIncludeFiltering
Determine whether header information should be filtered.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
unsigned IncludeSystemHeaders
Include system header dependencies.
static llvm::IntrusiveRefCntPtr< DiagnosticIDs > create()
Options for controlling the compiler diagnostics engine.
std::string DiagnosticSuppressionMappingsFile
Path for the file that defines diagnostic suppression mappings.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > VerifyPrefixes
The prefixes for comment directives sought by -verify ("expected" by default).
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setClient(DiagnosticConsumer *client, bool ShouldOwnClient=true)
Set the diagnostic client associated with this diagnostic object.
unsigned getNumErrors() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
unsigned getNumWarnings() const
Keeps track of options that affect how file operations are performed.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input.
unsigned ClangIRDisablePasses
Disable Clang IR specific (CIR) passes.
std::map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
unsigned ClangIRDisableCIRVerifier
Disable Clang IR (CIR) verifier.
unsigned IsSystemModule
When using -emit-module, treat the modulemap as a system module.
unsigned ClangIRLibOptEnabled
Enable ClangIR library optimization.
unsigned UseClangIRPipeline
Use Clang IR pipeline to emit code.
ASTDumpOutputFormat ASTDumpFormat
Specifies the output format of the AST.
std::optional< std::string > AuxTargetCPU
Auxiliary target CPU for CUDA/HIP compilation.
std::string OutputFile
The output file, if any.
unsigned ShowStats
Show frontend performance metrics and statistics.
unsigned GenReducedBMI
Whether to generate reduced BMI for C++20 named modules.
std::string ActionName
The name of the action to run when using a plugin action.
std::vector< std::shared_ptr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
static InputKind getInputKindForExtension(StringRef Extension)
getInputKindForExtension - Return the appropriate input kind for a file extension.
std::vector< std::string > Plugins
The list of plugins to load.
unsigned ASTDumpAll
Whether we deserialize all decls when forming AST dumps.
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
unsigned DisableFree
Disable memory freeing on exit.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
frontend::ActionKind ProgramAction
The frontend action to perform.
std::optional< std::vector< std::string > > AuxTargetFeatures
Auxiliary target features for CUDA/HIP compilation.
std::string AuxTriple
Auxiliary triple for CUDA/HIP/SYCL compilation.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
A diagnostic client that ignores all diagnostics.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ None
Don't exclude any overflow patterns from sanitizers.
@ AddUnsignedOverflowTest
if (a + b < a)
@ All
Exclude all overflow patterns (below)
@ AddSignedOverflowTest
if (a + b < a)
@ PostDecrInWhile
while (count–)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
SanitizerSet UBSanFeatureIgnoredSanitize
Set of (UBSan) sanitizers that when enabled do not cause __has_feature(undefined_behavior_sanitizer) ...
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
clang::ObjCRuntime ObjCRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
SanitizerSet Sanitize
Set of enabled sanitizers.
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
bool UseTargetPathSeparator
Indicates whether to use target's platform-specific file separator when FILE macro is used and when c...
static void setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, std::vector< std::string > &Includes, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
std::string RandstructSeed
The seed used by the randomize structure layout feature.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint64_t > AllocTokenMax
Maximum number of allocation tokens (0 = target SIZE_MAX), nullopt if none set (use target SIZE_MAX).
LangStandard::Kind LangStd
The used language standard.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
bool SanitizeCoverage
Is at least one coverage instrumentation type enabled.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
The basic abstraction for the target Objective-C runtime.
bool allowsWeak() const
Does this runtime allow the use of __weak?
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
std::string getAsString() const
bool allowsARC() const
Does this runtime allow ARC at all?
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
Discrimination
Forms of extra discrimination.
ARM8_3Key
Hardware pointer-signing keys in ARM8.3.
static constexpr std::optional< PositiveAnalyzerOption > create(unsigned Val)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a pragma hdrstop to separ...
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
void resetNonModularOptions()
Reset any options that are not considered when building a module.
void addMacroUndef(StringRef Name)
std::set< std::string > DeserializedPCHDeclsToErrorOn
This is a set of names for decls that we do not want to be deserialized, and we emit an error if they...
std::vector< std::string > EmbedEntries
User specified embed entries.
void addMacroDef(StringRef Name)
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a pragma hdrstop is expected to indicate the beginnin...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
std::vector< std::pair< std::string, bool > > Macros
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
unsigned ShowMacros
Print macro definitions.
unsigned ShowCPP
Print normal preprocessed output.
unsigned ShowLineMarkers
Show #line markers.
unsigned DirectivesOnly
Process directives but do not expand macros.
Encodes a location in the source.
static bool isSupportedCXXABI(const llvm::Triple &T, Kind Kind)
static const auto & getSpelling(Kind ABIKind)
static bool usesRelativeVTables(const llvm::Triple &T)
static bool isABI(StringRef Name)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
uint64_t LargeDataThreshold
AMDGPUFeatureState AMDGPUSramEccState
AMDGPU sramecc setting from -msramecc/-mno-sramecc.
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
AMDGPUFeatureState AMDGPUXnackState
AMDGPU xnack setting from -mxnack/-mno-xnack.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
@ Enabled
Feature explicitly enabled.
@ Disabled
Feature explicitly disabled.
constexpr XRayInstrMask None
constexpr XRayInstrMask All
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
@ CXXSystem
Like System, but only used for C++.
@ Angled
Paths for '#include <>' added by '-I'.
@ CSystem
Like System, but only used for C.
@ System
Like Angled, but marks system directories.
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
@ ExternCSystem
Like System, but headers are implicitly wrapped in extern "C".
@ ObjCSystem
Like System, but only used for ObjC.
@ ObjCXXSystem
Like System, but only used for ObjC++.
@ After
Like System, but searched after the system directories.
@ GenerateHeaderUnit
Generate a C++20 header unit module from a header file.
@ VerifyPCH
Load and verify that a PCH file is usable.
@ PrintPreprocessedInput
-E mode.
@ RewriteTest
Rewriter playground.
@ ParseSyntaxOnly
Parse and perform semantic analysis.
@ GenerateModuleInterface
Generate pre-compiled module from a standard C++ module interface unit.
@ EmitLLVM
Emit a .ll file.
@ PrintPreamble
Print the "preamble" of the input file.
@ InitOnly
Only execute frontend initialization.
@ ASTView
Parse ASTs and view them in Graphviz.
@ PluginAction
Run a plugin action,.
@ DumpRawTokens
Dump out raw tokens.
@ PrintDependencyDirectivesSourceMinimizerOutput
Print the output of the dependency directives source minimizer.
@ RewriteObjC
ObjC->C Rewriter.
@ RunPreprocessorOnly
Just lex, no output.
@ ModuleFileInfo
Dump information about a module file.
@ EmitCIR
Emit a .cir file.
@ DumpCompilerOptions
Dump the compiler configuration.
@ RunAnalysis
Run one or more source code analyses.
@ ASTPrint
Parse ASTs and print them.
@ GenerateReducedModuleInterface
Generate reduced module interface for a standard C++ module interface unit.
@ GenerateInterfaceStubs
Generate Interface Stub Files.
@ ASTDump
Parse ASTs and dump them.
@ DumpTokens
Dump out preprocessed tokens.
@ FixIt
Parse and apply any fixits to the source.
@ EmitAssembly
Emit a .s file.
@ EmitCodeGenOnly
Generate machine code, but don't emit anything.
@ RewriteMacros
Expand macros but not #includes.
@ EmitHTML
Translate input source into HTML.
@ GeneratePCH
Generate pre-compiled header.
@ EmitLLVMOnly
Generate LLVM IR, but do not emit anything.
@ GenerateModule
Generate pre-compiled module from a module map.
@ ASTDeclList
Parse ASTs and list Decl nodes.
bool EQ(InterpState &S, CodePtr OpPC)
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
Top level wrappers for InstallAPI frontend operations.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromOverlayFiles(ArrayRef< std::string > VFSOverlayFiles, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS)
DiagnosticLevelMask
A bitmask representing the diagnostic levels used by VerifyDiagnosticConsumer.
const char * headerIncludeFormatKindToString(HeaderIncludeFormatKind K)
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
constexpr uint16_t BlockDescriptorConstantDiscriminator
Constant discriminator to be used with block descriptor pointers.
constexpr uint16_t IsaPointerConstantDiscriminator
Constant discriminator to be used with objective-c isa pointers.
const char * headerIncludeFilteringKindToString(HeaderIncludeFilteringKind K)
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ Success
Annotation was successful.
@ Parse
Parse the block; this code is always used.
constexpr uint16_t SuperPointerConstantDiscriminator
Constant discriminator to be used with objective-c superclass pointers.
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
constexpr uint16_t MethodListPointerConstantDiscriminator
Constant discriminator to be used with method list pointers.
constexpr uint16_t ClassROConstantDiscriminator
Constant discriminator to be used with objective-c class_ro_t pointers.
@ 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.
@ Default
Set to the current date and time.
bool parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskCutoffs &Cutoffs)
Parse a single weighted value (e.g., 'undefined=0.05') from a -fsanitize= or -fno-sanitize= value lis...
@ Result
The result type of a method or function.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
XRayInstrMask parseXRayInstrValue(StringRef Value)
Parses a command line argument into a mask.
const FunctionProtoType * T
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void serializeXRayInstrValue(XRayInstrSet Set, SmallVectorImpl< StringRef > &Values)
Serializes a set into a list of command line arguments.
unsigned getOptimizationLevelSize(const llvm::opt::ArgList &Args)
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
llvm::Expected< llvm::SmallVector< llvm::SmallString< 8 > > > parseEscapedCommandLine(const char *CommandLine)
Parse a space-separated command line with escaped spaces and backslashes.
void serializeSanitizerMaskCutoffs(const SanitizerMaskCutoffs &Cutoffs, SmallVectorImpl< std::string > &Values)
Serialize a SanitizerMaskCutoffs into command line arguments.
ShowColorsKind
Controls whether to show colors in diagnostic output.
@ Auto
Emit colors only if the output stream is detected to support them.
@ On
Always emit colors regardless of the output stream.
@ Off
Never emit colors regardless of the output stream.
ShaderStage
Shader programs run in specific pipeline stages.
constexpr uint16_t StdTypeInfoVTablePointerConstantDiscrimination
Constant discriminator for std::type_info vtable pointers: 0xB1EA/45546 The value is ptrauth_string_d...
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const llvm::opt::OptTable & getDriverOptTable()
AnalysisDiagClients
AnalysisDiagClients - Set of available diagnostic clients for rendering analysis results.
@ NUM_ANALYSIS_DIAG_CLIENTS
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
int getLastArgIntValue(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, int Default, DiagnosticsEngine *Diags=nullptr, unsigned Base=0)
Return the value of the last argument as an integer, or a default.
AnalysisInliningMode
AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
int const char * function
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
bool Internalize
If true, we use LLVM module internalizer.
bool PropagateAttrs
If true, we set attributes functions in the bitcode library according to our CodeGenOptions,...
std::string Filename
The filename of the bitcode file to link in.
unsigned LinkFlags
Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
Dummy tag type whose instance can be passed into the constructor to prevent creation of the reference...
The result of const visitation.
The result of mutable visitation.
LangStandard - Information about the properties of a particular language standard.
clang::Language getLanguage() const
Get the language that this standard describes.
const char * getDescription() const
getDescription - Get the description of this standard.
static const LangStandard & getLangStandardForKind(Kind K)
const char * getName() const
getName - Get the name of this standard.
static Kind getLangKind(StringRef Name)
static ParsedSourceLocation FromString(StringRef Str)
Construct a parsed source location from a string; the Filename is empty on error.
std::string ToString() const
Serialize ParsedSourceLocation back to a string.
PointerAuthSchema BlockDescriptorPointers
The ABI for pointers to block descriptors.
PointerAuthSchema BlockHelperFunctionPointers
The ABI for block object copy/destroy function pointers.
PointerAuthSchema CXXVTablePointers
The ABI for C++ virtual table pointers (the pointer to the table itself) as installed in an actual cl...
PointerAuthSchema BlockInvocationFunctionPointers
The ABI for block invocation function pointers.
PointerAuthSchema BlockByrefHelperFunctionPointers
The ABI for __block variable copy/destroy function pointers.
PointerAuthSchema CXXVTTVTablePointers
The ABI for C++ virtual table pointers as installed in a VTT.
bool ReturnAddresses
Should return addresses be authenticated?
PointerAuthSchema CXXTypeInfoVTablePointer
TypeInfo has external ABI requirements and is emitted without actually having parsed the libcxx defin...
bool AArch64JumpTableHardening
Use hardened lowering for jump-table dispatch?
PointerAuthSchema ObjCMethodListPointer
The ABI for a reference to an Objective-C method list in _class_ro_t.
PointerAuthSchema FunctionPointers
The ABI for C function pointers.
PointerAuthSchema ObjCSuperPointers
The ABI for Objective-C superclass pointers.
bool AuthTraps
Do authentication failures cause a trap?
PointerAuthSchema CXXMemberFunctionPointers
The ABI for C++ member function pointers.
PointerAuthSchema CXXVirtualVariadicFunctionPointers
The ABI for variadic C++ virtual function pointers.
PointerAuthSchema ObjCMethodListFunctionPointers
The ABI for Objective-C method lists.
PointerAuthSchema ObjCClassROPointers
The ABI for Objective-C class_ro_t pointers.
PointerAuthSchema CXXVirtualFunctionPointers
The ABI for most C++ virtual function pointers, i.e. v-table entries.
PointerAuthSchema ObjCIsaPointers
The ABI for Objective-C isa pointers.
bool IndirectGotos
Do indirect goto label addresses need to be authenticated?
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool empty() const
Returns true if no sanitizers are enabled.
SanitizerMask Mask
Bitmask of enabled sanitizers.
void set(XRayInstrMask K, bool Value)