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));
1948 Opts.InterchangeLoops =
1949 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
false);
1950 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1951 OPT_fno_experimental_loop_fusion,
false);
1953 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1955 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1957 Opts.DebugNameTable =
static_cast<unsigned>(
1958 Args.hasArg(OPT_ggnu_pubnames)
1959 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1960 : Args.hasArg(OPT_gpubnames)
1961 ? llvm::DICompileUnit::DebugNameTableKind::Default
1962 : llvm::DICompileUnit::DebugNameTableKind::None);
1963 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1964 StringRef
Value = A->getValue();
1966 Diags.
Report(diag::err_drv_unsupported_option_argument)
1967 << A->getSpelling() << A->getValue();
1968 Opts.setDebugSimpleTemplateNames(
1969 StringRef(A->getValue()) ==
"simple"
1970 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1971 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1974 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1975 OPT_stats_file_timers)) {
1976 Opts.TimePasses =
true;
1979 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1980 StringRef Val =
EQ->getValue();
1981 if (Val ==
"per-pass")
1982 Opts.TimePassesPerRun =
false;
1983 else if (Val ==
"per-pass-run")
1984 Opts.TimePassesPerRun =
true;
1986 Diags.
Report(diag::err_drv_invalid_value)
1987 <<
EQ->getAsString(Args) <<
EQ->getValue();
1990 if (Args.getLastArg(OPT_ftime_report_json))
1991 Opts.TimePassesJson =
true;
1994 Opts.PrepareForLTO =
false;
1995 Opts.PrepareForThinLTO =
false;
1996 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1997 Opts.PrepareForLTO =
true;
1998 StringRef S = A->getValue();
2000 Opts.PrepareForThinLTO =
true;
2001 else if (S !=
"full")
2002 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
2003 if (Args.hasArg(OPT_funified_lto))
2004 Opts.PrepareForThinLTO =
true;
2006 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2008 Diags.
Report(diag::err_drv_argument_only_allowed_with)
2009 << A->getAsString(Args) <<
"-x ir";
2011 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2013 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2015 llvm::StringSwitch<std::string>(A->getValue())
2016 .Case(
"obj", OutputFile)
2017 .Default(llvm::sys::path::filename(OutputFile).str());
2019 if (Args.getLastArg(OPT_save_dynamic_debugging_temps))
2023 const char *MemProfileBasename =
"memprof.profraw";
2024 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2025 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2026 llvm::sys::path::append(Path, MemProfileBasename);
2028 }
else if (Args.hasArg(OPT_fmemory_profile))
2032 if (Args.hasArg(OPT_coverage_version_EQ)) {
2033 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2034 if (CoverageVersion.size() != 4) {
2035 Diags.
Report(diag::err_drv_invalid_value)
2036 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2046 for (
const auto &A : Args) {
2048 if (A->getOption().getID() == options::OPT_o ||
2049 A->getOption().getID() == options::OPT_INPUT ||
2050 A->getOption().getID() == options::OPT_x ||
2051 A->getOption().getID() == options::OPT_fembed_bitcode ||
2052 A->getOption().matches(options::OPT_W_Group))
2055 A->render(Args, ASL);
2056 for (
const auto &arg : ASL) {
2057 StringRef ArgStr(arg);
2058 llvm::append_range(Opts.
CmdArgs, ArgStr);
2064 auto XRayInstrBundles =
2065 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2066 if (XRayInstrBundles.empty())
2069 for (
const auto &A : XRayInstrBundles)
2073 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2074 StringRef Name = A->getValue();
2075 if (Name ==
"full") {
2076 Opts.CFProtectionReturn = 1;
2077 Opts.CFProtectionBranch = 1;
2078 }
else if (Name ==
"return")
2079 Opts.CFProtectionReturn = 1;
2080 else if (Name ==
"branch")
2081 Opts.CFProtectionBranch = 1;
2082 else if (Name !=
"none")
2083 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2086 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2087 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2089 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2090#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2091 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2092#include "clang/Basic/CFProtectionOptions.def"
2095 Opts.setCFBranchLabelScheme(Scheme);
2097 Diags.
Report(diag::err_drv_invalid_value)
2098 << A->getAsString(Args) << A->getValue();
2102 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2103 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2104 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2105 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2106 .Default(llvm::FunctionReturnThunksKind::Invalid);
2109 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2110 << A->getSpelling() <<
T.getTriple();
2111 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2112 Diags.
Report(diag::err_drv_invalid_value)
2113 << A->getAsString(Args) << A->getValue();
2114 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2115 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2116 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2117 << A->getAsString(Args)
2118 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2120 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2124 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2125 CodeGenOptions::BitcodeFileToLink F;
2127 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2128 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2137 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2138 StringRef Val = A->getValue();
2142 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2145 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2146 StringRef Val = A->getValue();
2149 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2155 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2156 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2160 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2161 << A->getSpelling() <<
T.str();
2163 const Option &O = A->getOption();
2164 if (O.matches(OPT_fpcc_struct_return) ||
2165 O.matches(OPT_maix_struct_return)) {
2168 assert(O.matches(OPT_freg_struct_return) ||
2169 O.matches(OPT_msvr4_struct_return));
2174 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2176 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2177 << A->getSpelling() <<
T.str();
2187 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2188 Diags.
Report(diag::err_roptr_requires_data_sections);
2190 Opts.XCOFFReadOnlyPointers =
true;
2193 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2194 if (!
T.isOSAIX() ||
T.isPPC32())
2195 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2196 << A->getSpelling() <<
T.str();
2199 bool NeedLocTracking =
false;
2202 NeedLocTracking =
true;
2204 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2206 NeedLocTracking =
true;
2209 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2211 NeedLocTracking =
true;
2221 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2231 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2234 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2235 <<
"-fdiagnostics-show-hotness";
2239 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2241 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2244 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2245 <<
"-fdiagnostics-hotness-threshold=";
2251 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2252 <<
"-fdiagnostics-hotness-threshold=";
2257 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2261 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2262 <<
"-fdiagnostics-misexpect-tolerance=";
2268 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2269 <<
"-fdiagnostics-misexpect-tolerance=";
2276 if (UsingSampleProfile)
2277 NeedLocTracking =
true;
2280 NeedLocTracking =
true;
2284 if (NeedLocTracking &&
2285 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2286 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2291 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2294 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2297 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2302 "-fsanitize-skip-hot-cutoff=",
2303 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2306 "-fsanitize-annotate-debug-info=",
2307 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2311 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2314 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2315 Diags.
Report(diag::err_drv_invalid_value)
2316 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2322 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2327 if (Args.hasArg(options::OPT_ffinite_loops))
2329 else if (Args.hasArg(options::OPT_fno_finite_loops))
2332 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2333 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2334 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2335 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2337 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2343 Diags.
Report(diag::err_drv_invalid_escaped_command_line)
2344 << llvm::toString(ParsedArgs.takeError());
2355#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2356 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2357#include "clang/Options/Options.inc"
2358#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2363 for (
const auto &Dep : Opts.
ExtraDeps) {
2364 switch (Dep.second) {
2377 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2386 bool ShowLineMarkers) {
2390#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2391 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2392#include "clang/Options/Options.inc"
2393#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2395 if (Args.hasArg(OPT_show_includes)) {
2410 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2411 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2412 StringRef Val = A->getValue();
2413 if (!Val.contains(
'='))
2417 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2418 StringRef Val = A->getValue();
2419 if (!Val.contains(
'='))
2426 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2430 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2434 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2435 StringRef Val = A->getValue();
2436 if (!Val.contains(
'='))
2444 if (Args.hasArg(OPT_header_include_format_EQ))
2445 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2449 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2453 if (Args.hasArg(OPT_header_include_filtering_EQ))
2454 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2458 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2466 bool DefaultColor) {
2473 for (
auto *A : Args) {
2474 const Option &O = A->getOption();
2475 if (O.matches(options::OPT_fcolor_diagnostics)) {
2477 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2479 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2480 StringRef
Value(A->getValue());
2481 if (
Value ==
"always")
2483 else if (
Value ==
"never")
2485 else if (
Value ==
"auto")
2495 for (
const auto &Prefix : VerifyPrefixes) {
2498 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2501 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2503 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2504 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2514#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2515 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2516#include "clang/Options/Options.inc"
2517#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2526#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2527 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2528#include "clang/Options/Options.inc"
2529#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2537#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2538 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2539#include "clang/Options/Options.inc"
2540#undef MIGRATOR_OPTION_WITH_MARSHALLING
2549#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2550 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2551#include "clang/Options/Options.inc"
2552#undef MIGRATOR_OPTION_WITH_MARSHALLING
2557void CompilerInvocationBase::GenerateDiagnosticArgs(
2559 bool DefaultDiagColor) {
2561#define DIAG_OPTION_WITH_MARSHALLING(...) \
2562 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2563#include "clang/Options/Options.inc"
2564#undef DIAG_OPTION_WITH_MARSHALLING
2567 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2570 switch (Opts.getShowColors()) {
2581 if (Opts.VerifyDiagnostics &&
2586 if (Prefix !=
"expected")
2589 if (Opts.VerifyDirectives) {
2597 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2600 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2602 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2604 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2606 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2611 if (
Warning ==
"undef-prefix")
2614 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2616 Consumer(StringRef(
"-W") +
Warning);
2622 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2623 "pass-analysis",
"no-pass-analysis",
2624 "pass-missed",
"no-pass-missed"};
2625 if (llvm::is_contained(IgnoredRemarks,
Remark))
2628 Consumer(StringRef(
"-R") +
Remark);
2632 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2637std::unique_ptr<DiagnosticOptions>
2639 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2640 unsigned MissingArgIndex, MissingArgCount;
2642 Argv.slice(1), MissingArgIndex, MissingArgCount);
2644 bool ShowColors =
true;
2645 if (std::optional<std::string> NoColor =
2646 llvm::sys::Process::GetEnv(
"NO_COLOR");
2647 NoColor && !NoColor->empty()) {
2662 bool DefaultDiagColor) {
2663 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2664 std::optional<DiagnosticsEngine> IgnoringDiags;
2666 IgnoringDiagOpts.emplace();
2669 Diags = &*IgnoringDiags;
2678#define DIAG_OPTION_WITH_MARSHALLING(...) \
2679 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2680#include "clang/Options/Options.inc"
2681#undef DIAG_OPTION_WITH_MARSHALLING
2683 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2686 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2690 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2691 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2693 if (Args.hasArg(OPT_verify))
2698 Opts.VerifyDiagnostics =
false;
2703 "-verify-ignore-unexpected=",
2704 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2705 if (Args.hasArg(OPT_verify_ignore_unexpected))
2707 Opts.setVerifyIgnoreUnexpected(DiagMask);
2709 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2714 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2725 unsigned DefaultOpt = 0;
2728 !Args.hasArg(OPT_cl_opt_disable))
2731 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2732 if (A->getOption().matches(options::OPT_O0))
2735 if (A->getOption().matches(options::OPT_Ofast) ||
2736 A->getOption().matches(options::OPT_O4))
2739 assert(A->getOption().matches(options::OPT_O));
2741 StringRef S(A->getValue());
2742 if (S ==
"s" || S ==
"z")
2751 unsigned MaxOptLevel = 3;
2752 if (DefaultOpt > MaxOptLevel) {
2755 Diags.
Report(diag::warn_drv_optimization_value)
2756 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2757 DefaultOpt = MaxOptLevel;
2764 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2765 if (A->getOption().matches(options::OPT_O)) {
2766 switch (A->getValue()[0]) {
2784 std::string &BlockName,
2785 unsigned &MajorVersion,
2786 unsigned &MinorVersion,
2788 std::string &UserInfo) {
2790 Arg.split(Args,
':', 5);
2791 if (Args.size() < 5)
2794 BlockName = std::string(Args[0]);
2795 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2796 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2797 if (Args[3].getAsInteger(2, Hashed))
return true;
2798 if (Args.size() > 4)
2799 UserInfo = std::string(Args[4]);
2808 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2839 OPT_emit_reduced_module_interface},
2855 OPT_print_dependency_directives_minimized_source},
2862static std::optional<frontend::ActionKind>
2865 if (ActionOpt.second == Opt.getID())
2866 return ActionOpt.first;
2868 return std::nullopt;
2872static std::optional<OptSpecifier>
2875 if (ActionOpt.first == ProgramAction)
2876 return OptSpecifier(ActionOpt.second);
2878 return std::nullopt;
2884#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2885 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2886#include "clang/Options/Options.inc"
2887#undef FRONTEND_OPTION_WITH_MARSHALLING
2889 std::optional<OptSpecifier> ProgramActionOpt =
2897 if (!ProgramActionOpt) {
2900 "Frontend action without option.");
2901 GenerateProgramAction = [&]() {
2908 GenerateProgramAction = [&]() {
2916 llvm_unreachable(
"Default AST dump format.");
2923 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2936 GenerateProgramAction = [&]() {
2941 GenerateProgramAction();
2943 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2945 for (
const auto &PluginArg : PluginArgs.second)
2947 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2948 Opt.getKind(), 0, PluginArg);
2952 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2953 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2959 for (
const auto &Plugin : Opts.
Plugins)
2965 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2978 StringRef HeaderUnit =
"";
2983 HeaderUnit =
"-user";
2986 HeaderUnit =
"-system";
2989 HeaderUnit =
"-header-unit";
2992 StringRef Header = IsHeader ?
"-header" :
"";
3015 Lang =
"objective-c";
3018 Lang =
"objective-c++";
3021 Lang =
"assembler-with-cpp";
3025 "Generating -x argument for unknown language (not precompiled).");
3040 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3044 for (
const auto &Input : Opts.
Inputs)
3045 Consumer(Input.getFile());
3054#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3055 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3056#include "clang/Options/Options.inc"
3057#undef FRONTEND_OPTION_WITH_MARSHALLING
3060 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3061 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3063 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3066 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3067 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3070 .Default(std::numeric_limits<unsigned>::max());
3072 if (Val != std::numeric_limits<unsigned>::max())
3075 Diags.
Report(diag::err_drv_invalid_value)
3076 << A->getAsString(Args) << A->getValue();
3086 Args.hasArg(OPT_interface_stub_version_EQ)
3087 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3089 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3090 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3091 ArgStr ==
"experimental-tapi-elf-v1") {
3092 std::string ErrorMessage =
3093 "Invalid interface stub format: " + ArgStr.str() +
3095 Diags.
Report(diag::err_drv_invalid_value)
3096 <<
"Must specify a valid interface stub format type, ie: "
3097 "-interface-stub-version=ifs-v1"
3100 }
else if (!ArgStr.starts_with(
"ifs-")) {
3101 std::string ErrorMessage =
3102 "Invalid interface stub format: " + ArgStr.str() +
".";
3103 Diags.
Report(diag::err_drv_invalid_value)
3104 <<
"Must specify a valid interface stub format type, ie: "
3105 "-interface-stub-version=ifs-v1"
3120 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3121 const Arg *SavedAction =
nullptr;
3122 for (
const Arg *AA :
3123 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3124 if (AA->getOption().matches(OPT_main_file_name)) {
3125 SavedAction =
nullptr;
3126 }
else if (!SavedAction) {
3129 if (!A->getOption().matches(OPT_ast_dump_EQ))
3130 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3131 << SavedAction->getSpelling() << A->getSpelling();
3138 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3139 Opts.
Plugins.emplace_back(A->getValue(0));
3143 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3144 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3146 for (
const std::string &Arg :
3147 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3148 std::string BlockName;
3149 unsigned MajorVersion;
3150 unsigned MinorVersion;
3152 std::string UserInfo;
3154 MinorVersion, Hashed, UserInfo)) {
3155 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3162 std::make_shared<TestModuleFileExtension>(
3163 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3166 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3170 Diags.
Report(diag::err_drv_invalid_value)
3171 << A->getAsString(Args) << A->getValue();
3172 Diags.
Report(diag::note_command_line_code_loc_requirement);
3176 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3177 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3178 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3180 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3181 StringRef Val = A->getValue();
3182 if (!Val.contains(
'='))
3187 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3189 if (Args.hasArg(OPT_emit_cir))
3193 if (Args.hasArg(OPT_clangir_disable_passes))
3196 if (Args.hasArg(OPT_clangir_disable_verifier))
3199 if (Args.hasArg(OPT_clangir_lib_opt) || Args.hasArg(OPT_clangir_lib_opt_EQ))
3203 if (Args.hasArg(OPT_aux_target_cpu))
3204 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3205 if (Args.hasArg(OPT_aux_target_feature))
3209 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3210 StringRef XValue = A->getValue();
3215 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3216 bool ModuleMap = XValue.consume_back(
"-module-map");
3219 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3225 if (IsHeader || Preprocessed) {
3226 if (XValue.consume_back(
"-header-unit"))
3228 else if (XValue.consume_back(
"-system"))
3230 else if (XValue.consume_back(
"-user"))
3236 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3240 DashX = llvm::StringSwitch<InputKind>(XValue)
3256 DashX = llvm::StringSwitch<InputKind>(XValue)
3264 DashX = llvm::StringSwitch<InputKind>(XValue)
3267 .Cases({
"ast",
"pcm",
"precompiled-header"},
3274 Diags.
Report(diag::err_drv_invalid_value)
3275 << A->getAsString(Args) << A->getValue();
3282 IsHeaderFile =
true;
3283 }
else if (IsHeaderFile)
3290 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3293 Inputs.push_back(
"-");
3297 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3299 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3303 StringRef(Inputs[i]).rsplit(
'.').second);
3312 bool IsSystem =
false;
3321 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3338#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3339 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3340#include "clang/Options/Options.inc"
3341#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3350 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3356 GenerateArg(Consumer, OPT_fmodules_ignore_search_path, Path.val());
3360 std::optional<bool> IsFramework,
3361 std::optional<bool> IgnoreSysRoot) {
3362 return llvm::is_contained(Groups, Entry.
Group) &&
3363 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3364 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3373 OptSpecifier Opt = [It, Matches]() {
3378 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3392 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3399 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3405 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3410 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3418 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3420 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3430 ? OPT_internal_isystem
3431 : OPT_internal_externc_isystem;
3435 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3437 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3441 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3442 : OPT_no_system_header_prefix;
3456#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3457 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3458#include "clang/Options/Options.inc"
3459#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3461 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3462 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3465 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3466 StringRef Val = A->getValue();
3467 if (Val.contains(
'=')) {
3468 auto Split = Val.split(
'=');
3470 std::string(Split.first), std::string(Split.second));
3473 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3476 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3477 StringRef MacroDef = A->getValue();
3479 llvm::CachedHashString(MacroDef.split(
'=').first));
3482 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_search_path))
3486 bool IsSysrootSpecified =
3487 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3491 auto PrefixHeaderPath = [IsSysrootSpecified,
3492 &Opts](
const llvm::opt::Arg *A,
3493 bool IsFramework =
false) -> std::string {
3494 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3495 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3497 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3498 llvm::StringRef(A->getValue()).substr(1));
3499 return std::string(Buffer);
3501 return A->getValue();
3504 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3505 bool IsFramework = A->getOption().matches(OPT_F);
3511 StringRef Prefix =
"";
3512 for (
const auto *A :
3513 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3514 if (A->getOption().matches(OPT_iprefix))
3515 Prefix = A->getValue();
3516 else if (A->getOption().matches(OPT_iwithprefix))
3522 for (
const auto *A : Args.filtered(OPT_idirafter))
3524 for (
const auto *A : Args.filtered(OPT_iquote))
3527 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3528 if (A->getOption().matches(OPT_iwithsysroot)) {
3535 for (
const auto *A : Args.filtered(OPT_iframework))
3537 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3542 for (
const auto *A : Args.filtered(OPT_c_isystem))
3544 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3546 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3548 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3552 for (
const auto *A :
3553 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3555 if (A->getOption().matches(OPT_internal_externc_isystem))
3557 Opts.
AddPath(A->getValue(), Group,
false,
true);
3559 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3563 for (
const auto *A :
3564 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3566 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3568 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3577 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3581 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3586 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3588 diags.
Report(diag::err_drv_invalid_value)
3589 << A->getAsString(Args) << A->getValue();
3591 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3597 if (Opts.PointerAuthIntrinsics)
3599 if (Opts.PointerAuthCalls)
3601 if (Opts.PointerAuthReturns)
3603 if (Opts.PointerAuthIndirectGotos)
3604 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3605 if (Opts.PointerAuthAuthTraps)
3607 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3608 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3609 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3610 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3611 if (Opts.PointerAuthVTTVTPtrDiscrimination)
3612 GenerateArg(Consumer, OPT_fptrauth_vtt_vtable_pointer_discrimination);
3613 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3614 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3615 if (Opts.PointerAuthFunctionTypeDiscrimination)
3616 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3617 if (Opts.PointerAuthInitFini)
3619 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3620 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3621 if (Opts.PointerAuthELFGOT)
3623 if (Opts.AArch64JumpTableHardening)
3624 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3625 if (Opts.PointerAuthObjcIsa)
3627 if (Opts.PointerAuthObjcInterfaceSel)
3628 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3629 if (Opts.PointerAuthObjcClassROPointers)
3630 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3631 if (Opts.PointerAuthBlockDescriptorPointers)
3632 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3637 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3638 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3639 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3640 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3641 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3642 Opts.PointerAuthVTPtrAddressDiscrimination =
3643 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3644 Opts.PointerAuthVTPtrTypeDiscrimination =
3645 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3646 Opts.PointerAuthVTTVTPtrDiscrimination =
3647 Args.hasArg(OPT_fptrauth_vtt_vtable_pointer_discrimination);
3648 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3649 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3650 Opts.PointerAuthFunctionTypeDiscrimination =
3651 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3652 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3653 Opts.PointerAuthInitFiniAddressDiscrimination =
3654 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3655 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3656 Opts.AArch64JumpTableHardening =
3657 Args.hasArg(OPT_faarch64_jump_table_hardening);
3658 Opts.PointerAuthBlockDescriptorPointers =
3659 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3660 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3661 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3662 Opts.PointerAuthObjcInterfaceSel =
3663 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3665 if (Opts.PointerAuthObjcInterfaceSel)
3666 Opts.PointerAuthObjcInterfaceSelKey =
3677 llvm_unreachable(
"should not parse language flags for this input");
3712 llvm_unreachable(
"unexpected input language");
3721 return "Objective-C";
3725 return "Objective-C++";
3729 return "C++ for OpenCL";
3748 llvm_unreachable(
"unknown input language");
3751void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3753 const llvm::Triple &
T,
3758 if (Opts.ObjCAutoRefCount)
3760 if (Opts.PICLevel != 0)
3761 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3765 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3766 for (StringRef Sanitizer :
3768 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3774 OptSpecifier StdOpt;
3776 case LangStandard::lang_opencl10:
3777 case LangStandard::lang_opencl11:
3778 case LangStandard::lang_opencl12:
3779 case LangStandard::lang_opencl20:
3780 case LangStandard::lang_opencl30:
3781 case LangStandard::lang_openclcpp10:
3782 case LangStandard::lang_openclcpp2021:
3783 StdOpt = OPT_cl_std_EQ;
3786 StdOpt = OPT_std_EQ;
3791 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3793 if (Opts.IncludeDefaultHeader)
3794 GenerateArg(Consumer, OPT_finclude_default_header);
3795 if (Opts.DeclareOpenCLBuiltins)
3796 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3798 const LangOptions *
LangOpts = &Opts;
3800#define LANG_OPTION_WITH_MARSHALLING(...) \
3801 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3802#include "clang/Options/Options.inc"
3803#undef LANG_OPTION_WITH_MARSHALLING
3814 else if (Opts.ObjCAutoRefCount == 1)
3817 if (Opts.ObjCWeakRuntime)
3818 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3823 if (Opts.ObjCSubscriptingLegacyRuntime)
3824 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3827 if (Opts.GNUCVersion != 0) {
3828 unsigned Major = Opts.GNUCVersion / 100 / 100;
3829 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3830 unsigned Patch = Opts.GNUCVersion % 100;
3832 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3835 if (Opts.IgnoreXCOFFVisibility)
3836 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3842 if (!Opts.MSVCCompat)
3844 }
else if (Opts.MSVCCompat) {
3847 if (Opts.PointerOverflowDefined)
3850 if (Opts.MSCompatibilityVersion != 0) {
3851 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3852 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3853 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3854 GenerateArg(Consumer, OPT_fms_compatibility_version,
3855 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3858 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3860 if (!Opts.Trigraphs)
3867 if (
T.isOSzOS() && !Opts.ZOSExt)
3869 else if (Opts.ZOSExt)
3872 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3875 if (Opts.ConvergentFunctions)
3878 GenerateArg(Consumer, OPT_fno_convergent_functions);
3880 if (Opts.NoBuiltin && !Opts.Freestanding)
3883 if (!Opts.NoBuiltin)
3887 if (Opts.LongDoubleSize == 128)
3889 else if (Opts.LongDoubleSize == 64)
3891 else if (Opts.LongDoubleSize == 80)
3898 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3901 if (Opts.OpenMP != 51)
3902 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3904 if (!Opts.OpenMPUseTLS)
3907 if (Opts.OpenMPIsTargetDevice)
3908 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3910 if (Opts.OpenMPIRBuilder)
3911 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3914 if (Opts.OpenMPSimd) {
3917 if (Opts.OpenMP != 51)
3918 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3921 if (Opts.OpenMPThreadSubscription)
3922 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3924 if (Opts.OpenMPTeamSubscription)
3925 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3927 if (Opts.OpenMPTargetDebug != 0)
3928 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3929 Twine(Opts.OpenMPTargetDebug));
3931 if (Opts.OpenMPCUDANumSMs != 0)
3932 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3933 Twine(Opts.OpenMPCUDANumSMs));
3935 if (Opts.OpenMPCUDABlocksPerSM != 0)
3936 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3937 Twine(Opts.OpenMPCUDABlocksPerSM));
3940 std::string Targets;
3941 llvm::raw_string_ostream
OS(Targets);
3944 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3945 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3948 if (Opts.OpenMPCUDAMode)
3964 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3967 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3968 for (StringRef Sanitizer :
3970 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3974 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3976 switch (Opts.getClangABICompat()) {
3977#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3978 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3979 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3981#define ABI_VER_MAJOR(Major) \
3982 case LangOptions::ClangABI::Ver##Major: \
3983 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3985#define ABI_VER_LATEST(Latest) \
3986 case LangOptions::ClangABI::Latest: \
3988#include "clang/Basic/ABIVersions.def"
3991 if (Opts.getSignReturnAddressScope() ==
3993 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3994 else if (Opts.getSignReturnAddressScope() ==
3996 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3998 if (Opts.getSignReturnAddressKey() ==
4000 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
4006 if (Opts.RelativeCXXABIVTables)
4007 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
4009 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
4017 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
4027 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
4028 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
4031 if (Opts.MatrixTypes) {
4032 if (Opts.getDefaultMatrixMemoryLayout() ==
4034 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
4035 if (Opts.getDefaultMatrixMemoryLayout() ==
4037 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4041bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4043 std::vector<std::string> &Includes,
4053 if (Args.hasArg(OPT_fobjc_arc))
4054 Opts.ObjCAutoRefCount = 1;
4058 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4062 "-fsanitize-ignore-for-ubsan-feature=",
4063 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4074 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4077 Diags.
Report(diag::err_drv_invalid_value)
4078 << A->getAsString(Args) << A->getValue();
4080 for (
unsigned KindValue = 0;
4086 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4088 unsigned NumAliases = 0;
4089#define LANGSTANDARD(id, name, lang, desc, features, version)
4090#define LANGSTANDARD_ALIAS(id, alias) \
4091 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4092#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4093#include "clang/Basic/LangStandards.def"
4095#define LANGSTANDARD(id, name, lang, desc, features, version)
4096#define LANGSTANDARD_ALIAS(id, alias) \
4097 if (KindValue == LangStandard::lang_##id) Diag << alias;
4098#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4099#include "clang/Basic/LangStandards.def"
4107 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4115 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4117 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4118 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4119 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4120 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4121 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4122 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4123 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4124 .Cases({
"cl3.1",
"CL3.1"}, LangStandard::lang_opencl31)
4125 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4126 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4127 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4131 Diags.
Report(diag::err_drv_invalid_value)
4132 << A->getAsString(Args) << A->getValue();
4135 LangStd = OpenCLLangStd;
4139 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4140 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4148#define LANG_OPTION_WITH_MARSHALLING(...) \
4149 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4150#include "clang/Options/Options.inc"
4151#undef LANG_OPTION_WITH_MARSHALLING
4156 Opts.Modules = Opts.ClangModules || Opts.CPlusPlusModules;
4158 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4159 StringRef Name = A->getValue();
4160 if (Name ==
"full") {
4161 Opts.CFProtectionBranch = 1;
4162 Opts.CFProtectionReturn = 1;
4163 }
else if (Name ==
"branch") {
4164 Opts.CFProtectionBranch = 1;
4165 }
else if (Name ==
"return") {
4166 Opts.CFProtectionReturn = 1;
4170 if (Opts.CFProtectionBranch) {
4171 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4173 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4174#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4175 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4176#include "clang/Basic/CFProtectionOptions.def"
4178 Opts.setCFBranchLabelScheme(Scheme);
4182 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4183 !Args.hasArg(OPT_sycl_std_EQ)) {
4193 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4194 StringRef value =
arg->getValue();
4196 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4199 if (Args.hasArg(OPT_fobjc_gc_only))
4201 else if (Args.hasArg(OPT_fobjc_gc))
4203 else if (Args.hasArg(OPT_fobjc_arc)) {
4204 Opts.ObjCAutoRefCount = 1;
4206 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4213 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4214 Opts.ObjCWeakRuntime = 1;
4220 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4221 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4222 assert(!Opts.ObjCWeak);
4224 Diags.
Report(diag::err_objc_weak_with_gc);
4225 }
else if (!Opts.ObjCWeakRuntime) {
4226 Diags.
Report(diag::err_objc_weak_unsupported);
4230 }
else if (Opts.ObjCAutoRefCount) {
4231 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4234 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4235 Opts.ObjCSubscriptingLegacyRuntime =
4239 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4242 VersionTuple GNUCVer;
4243 bool Invalid = GNUCVer.tryParse(A->getValue());
4244 unsigned Major = GNUCVer.getMajor();
4245 unsigned Minor = GNUCVer.getMinor().value_or(0);
4246 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4247 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4248 Diags.
Report(diag::err_drv_invalid_value)
4249 << A->getAsString(Args) << A->getValue();
4251 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4254 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4255 Opts.IgnoreXCOFFVisibility = 1;
4257 if (Args.hasArg(OPT_ftrapv)) {
4261 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4262 }
else if (Args.hasFlag(OPT_fwrapv, OPT_fno_wrapv, Opts.MSVCCompat)) {
4265 if (Args.hasArg(OPT_fwrapv_pointer))
4266 Opts.PointerOverflowDefined =
true;
4268 Opts.MSCompatibilityVersion = 0;
4269 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4271 if (VT.tryParse(A->getValue()))
4272 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4274 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4275 VT.getMinor().value_or(0) * 100000 +
4276 VT.getSubminor().value_or(0);
4284 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4287 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4290 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4292 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4293 && Opts.OpenCLVersion == 200);
4295 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4296 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4297 Opts.ConvergentFunctions =
4298 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4299 HasConvergentOperations);
4301 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4302 if (!Opts.NoBuiltin)
4304 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4305 if (A->getOption().matches(options::OPT_mlong_double_64))
4306 Opts.LongDoubleSize = 64;
4307 else if (A->getOption().matches(options::OPT_mlong_double_80))
4308 Opts.LongDoubleSize = 80;
4309 else if (A->getOption().matches(options::OPT_mlong_double_128))
4310 Opts.LongDoubleSize = 128;
4312 Opts.LongDoubleSize = 0;
4314 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4320 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4322 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4323 << A->getSpelling() <<
"-fdefault-calling-conv";
4325 switch (
T.getArch()) {
4326 case llvm::Triple::x86:
4329 case llvm::Triple::m68k:
4333 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4334 << A->getSpelling() <<
T.getTriple();
4340 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4342 bool IsSimdSpecified =
4343 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4345 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4347 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4348 Opts.OpenMPIsTargetDevice =
4349 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4350 Opts.OpenMPIRBuilder =
4351 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4352 bool IsTargetSpecified =
4353 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4355 if (Opts.OpenMP || Opts.OpenMPSimd) {
4357 Args, OPT_fopenmp_version_EQ,
4358 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4359 Opts.OpenMP = Version;
4362 if (!Opts.OpenMPIsTargetDevice) {
4363 switch (
T.getArch()) {
4367 case llvm::Triple::nvptx:
4368 case llvm::Triple::nvptx64:
4369 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4377 if ((Opts.OpenMPIsTargetDevice &&
T.isGPU()) || Opts.OpenCLCPlusPlus) {
4379 Opts.Exceptions = 0;
4380 Opts.CXXExceptions = 0;
4382 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4383 Opts.OpenMPCUDANumSMs =
4385 Opts.OpenMPCUDANumSMs, Diags);
4386 Opts.OpenMPCUDABlocksPerSM =
4388 Opts.OpenMPCUDABlocksPerSM, Diags);
4393 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4394 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4396 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4397 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4398 Opts.OpenMPTargetDebug = 1;
4401 if (Opts.OpenMPIsTargetDevice) {
4402 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4403 Opts.OpenMPTeamSubscription =
true;
4404 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4405 Opts.OpenMPThreadSubscription =
true;
4409 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4410 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4411 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4412 if (
T.isArch16Bit())
4414 if (
T.isArch32Bit())
4416 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4420 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4421 llvm::Triple TT(A->getValue(i));
4423 if (TT.getArch() == llvm::Triple::UnknownArch ||
4424 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4425 TT.getArch() == llvm::Triple::spirv64 ||
4426 TT.getArch() == llvm::Triple::systemz ||
4427 TT.getArch() == llvm::Triple::loongarch64 ||
4428 TT.getArch() == llvm::Triple::nvptx ||
4429 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4430 TT.getArch() == llvm::Triple::x86 ||
4431 TT.getArch() == llvm::Triple::x86_64))
4432 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4433 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4434 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4435 << A->getValue(i) <<
T.str();
4442 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4443 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4444 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4447 if (Args.hasArg(options::OPT_fopenacc))
4448 Opts.OpenACC =
true;
4450 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4451 StringRef Val = A->getValue();
4454 else if (Val ==
"on")
4456 else if (Val ==
"off")
4458 else if (Val ==
"fast-honor-pragmas")
4461 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4465 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4466 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4468 llvm::StringSwitch<unsigned>(A->getValue(i))
4471 .Case(
"add-unsigned-overflow-test",
4473 .Case(
"add-signed-overflow-test",
4476 .Case(
"unsigned-post-decr-while",
4486 "-fsanitize-ignore-for-ubsan-feature=",
4487 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4489 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4490 std::vector<std::string> systemIgnorelists =
4491 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4493 systemIgnorelists.begin(),
4494 systemIgnorelists.end());
4496 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4497 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4499 StringRef Ver = A->getValue();
4500 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4501 int Major, Minor = 0;
4505 if (!VerParts.first.starts_with(
"0") &&
4506 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4507 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4509 ? VerParts.second.size() == 1 &&
4510 !VerParts.second.getAsInteger(10, Minor)
4511 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4513#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4514 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4515 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4517#define ABI_VER_MAJOR(Major_) \
4518 if (Major <= Major_) \
4519 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4521#define ABI_VER_LATEST(Latest) \
4524#include "clang/Basic/ABIVersions.def"
4525 }
else if (Ver !=
"latest") {
4526 Diags.
Report(diag::err_drv_invalid_value)
4527 << A->getAsString(Args) << A->getValue();
4531 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4532 StringRef SignScope = A->getValue();
4534 if (SignScope.equals_insensitive(
"none"))
4535 Opts.setSignReturnAddressScope(
4537 else if (SignScope.equals_insensitive(
"all"))
4538 Opts.setSignReturnAddressScope(
4540 else if (SignScope.equals_insensitive(
"non-leaf"))
4541 Opts.setSignReturnAddressScope(
4544 Diags.
Report(diag::err_drv_invalid_value)
4545 << A->getAsString(Args) << SignScope;
4547 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4548 StringRef SignKey = A->getValue();
4549 if (!SignScope.empty() && !SignKey.empty()) {
4550 if (SignKey ==
"a_key")
4551 Opts.setSignReturnAddressKey(
4553 else if (SignKey ==
"b_key")
4554 Opts.setSignReturnAddressKey(
4557 Diags.
Report(diag::err_drv_invalid_value)
4558 << A->getAsString(Args) << SignKey;
4564 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4571 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4577 Opts.RelativeCXXABIVTables =
4578 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4579 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4583 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4584 Opts.OmitVTableRTTI =
4585 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4586 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4587 if (Opts.OmitVTableRTTI && HasRTTI)
4588 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4590 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4591 auto Split = StringRef(A).split(
'=');
4593 {std::string(
Split.first), std::string(
Split.second)});
4597 !Args.getLastArg(OPT_fno_file_reproducible) &&
4598 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4599 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4600 Args.getLastArg(OPT_ffile_reproducible));
4603 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4605 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4606 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4608 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4610 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4611 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4614 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4615 std::ifstream SeedFile(A->getValue(0));
4617 if (!SeedFile.is_open())
4618 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4624 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4627 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4628 StringRef S = Arg->getValue();
4630 if (S.getAsInteger(0,
Value))
4631 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4636 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4637 StringRef S = Arg->getValue();
4638 if (
auto Mode = getAllocTokenModeFromString(S))
4641 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4645 if (Opts.MatrixTypes) {
4646 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4647 StringRef ClangValue = A->getValue();
4648 if (ClangValue ==
"row-major")
4649 Opts.setDefaultMatrixMemoryLayout(
4652 Opts.setDefaultMatrixMemoryLayout(
4655 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4656 StringRef OptValue = A->getValue();
4657 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4658 ClangValue != OptValue)
4659 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4660 << ClangValue << OptValue;
4669 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4671 enum {
OS, Environment };
4673 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4675 if (
T.getOSName().empty()) {
4676 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4677 << ExpectedOS <<
OS <<
T.str();
4678 }
else if (
T.getEnvironmentName().empty()) {
4679 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4681 }
else if (!
T.isShaderStageEnvironment()) {
4682 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4687 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4688 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4689 << ShaderModel <<
T.getOSName() <<
T.str();
4694 if (Args.getLastArg(OPT_fnative_half_type) ||
4695 Args.getLastArg(OPT_fnative_int16_type)) {
4696 const LangStandard &Std =
4698 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4699 T.getOSVersion() >= VersionTuple(6, 2)))
4700 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4701 <<
"-enable-16bit-types" <<
true << Std.
getName()
4702 <<
T.getOSVersion().getAsString();
4704 }
else if (
T.isSPIRVLogical()) {
4705 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4706 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4707 << VulkanEnv <<
T.getOSName() <<
T.str();
4709 if (Args.getLastArg(OPT_fnative_half_type) ||
4710 Args.getLastArg(OPT_fnative_int16_type)) {
4711 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4712 ?
"-fnative-half-type"
4713 :
"-fnative-int16-type";
4714 const LangStandard &Std =
4716 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4717 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4718 << Str <<
false << Std.
getName();
4721 llvm_unreachable(
"expected DXIL or SPIR-V target");
4724 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4726 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4727 const LangStandard &Requested =
4729 const LangStandard &Recommended =
4731 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4781 llvm_unreachable(
"invalid frontend action");
4825 llvm_unreachable(
"invalid frontend action");
4835#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4836 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4837#include "clang/Options/Options.inc"
4838#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4841 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4844 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4851 for (
const auto &M : Opts.
Macros) {
4854 if (M.first ==
"__CET__=1" && !M.second &&
4855 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4857 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4858 !CodeGenOpts.CFProtectionBranch)
4860 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4861 CodeGenOpts.CFProtectionBranch)
4864 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4867 for (
const auto &I : Opts.
Includes) {
4870 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4871 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4876 if (LangOpts.HLSL && I ==
"hlsl.h")
4886 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4892 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4895 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4909#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4910 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4911#include "clang/Options/Options.inc"
4912#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4914 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4915 Args.hasArg(OPT_pch_through_hdrstop_use);
4917 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4920 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4921 StringRef
Value(A->getValue());
4922 size_t Comma =
Value.find(
',');
4924 unsigned EndOfLine = 0;
4926 if (Comma == StringRef::npos ||
4927 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4928 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4929 Diags.
Report(diag::err_drv_preamble_format);
4937 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4938 if (A->getOption().matches(OPT_D))
4945 for (
const auto *A : Args.filtered(OPT_include))
4946 Opts.
Includes.emplace_back(A->getValue());
4948 for (
const auto *A : Args.filtered(OPT_chain_include))
4951 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4952 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4954 if (Split.second.empty()) {
4955 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4962 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4963 StringRef Epoch = A->getValue();
4967 const uint64_t MaxTimestamp =
4968 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4970 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4971 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4972 << Epoch << MaxTimestamp;
4978 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4979 StringRef Val = A->getValue();
4990 Args.hasFlag(OPT_fdefine_target_os_macros,
5002#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5003 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5004#include "clang/Options/Options.inc"
5005#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5023#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5024 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5025#include "clang/Options/Options.inc"
5026#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5029 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
5038#define TARGET_OPTION_WITH_MARSHALLING(...) \
5039 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5040#include "clang/Options/Options.inc"
5041#undef TARGET_OPTION_WITH_MARSHALLING
5047 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5069#define TARGET_OPTION_WITH_MARSHALLING(...) \
5070 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5071#include "clang/Options/Options.inc"
5072#undef TARGET_OPTION_WITH_MARSHALLING
5074 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5075 llvm::VersionTuple Version;
5076 if (Version.tryParse(A->getValue()))
5077 Diags.
Report(diag::err_drv_invalid_value)
5078 << A->getAsString(Args) << A->getValue();
5083 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5084 llvm::VersionTuple Version;
5085 if (Version.tryParse(A->getValue()))
5086 Diags.
Report(diag::err_drv_invalid_value)
5087 << A->getAsString(Args) << A->getValue();
5092 if (Arg *A = Args.getLastArg(options::OPT_mxnack, options::OPT_mno_xnack)) {
5093 bool IsEnabled = A->getOption().matches(options::OPT_mxnack);
5100 Args.getLastArg(options::OPT_msramecc, options::OPT_mno_sramecc)) {
5101 bool IsEnabled = A->getOption().matches(options::OPT_msramecc);
5110bool CompilerInvocation::CreateFromArgsImpl(
5118 unsigned MissingArgIndex, MissingArgCount;
5119 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5120 MissingArgCount, VisibilityMask);
5124 if (MissingArgCount)
5125 Diags.
Report(diag::err_drv_missing_argument)
5126 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5129 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5130 auto ArgString = A->getAsString(Args);
5131 std::string Nearest;
5132 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5133 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5135 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5136 << ArgString << Nearest;
5169 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5183 Diags.
Report(diag::warn_drv_openacc_without_cir);
5191 if (!Args.hasArg(options::OPT_triple))
5203 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5204 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5205 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5206 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5219 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5225 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5236 llvm::driver::ProfileInstrKind::ProfileNone)
5237 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5247 const char *Argv0) {
5253 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5257 Args.push_back(
"-cc1");
5260 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5265 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5278 const unsigned LanguageOptionValues[] = {
5279#define HASH_LANGOPT_Benign(Value)
5280#define HASH_LANGOPT_Compatible(Value) Value,
5281#define HASH_LANGOPT_NotCompatible(Value) Value,
5282#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5283 HASH_LANGOPT_##Compatibility(LangOpts->Name)
5284#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5285 HASH_LANGOPT_##Compatibility(static_cast<unsigned>(LangOpts->get##Name()))
5286#include "clang/Basic/LangOptions.def"
5288#undef HASH_LANGOPT_Benign
5289#undef HASH_LANGOPT_Compatible
5290#undef HASH_LANGOPT_NotCompatible
5293 HBuilder.addRangeElements(LanguageOptionValues);
5298 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5315 StringRef MacroDef =
Macro.first;
5317 llvm::CachedHashString(MacroDef.split(
'=').first)))
5321 HBuilder.add(
Macro);
5334 for (
const auto &UserEntry : hsOpts.
UserEntries) {
5339 StringRef Path = UserEntry.Path;
5344 HBuilder.add(UserEntry);
5350#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5351#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5352 HBuilder.add(diagOpts.get##Name());
5353#include "clang/Basic/DiagnosticOptions.def"
5363 ext->hashExtension(HBuilder);
5370 HBuilder.add(*Minor);
5371 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5372 HBuilder.add(*Subminor);
5374 HBuilder.add(*Build);
5380#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5381 if constexpr (CK::Compatibility != CK::Benign) \
5382 HBuilder.add(CodeGenOpts->Name);
5383#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5384 if constexpr (CK::Compatibility != CK::Benign) \
5385 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5386#define DEBUGOPT(Name, Bits, Default, Compatibility)
5387#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5388#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5389#include "clang/Basic/CodeGenOptions.def"
5401#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5402 if constexpr (CK::Compatibility != CK::Benign) \
5403 HBuilder.add(CodeGenOpts->Name);
5404#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5405 if constexpr (CK::Compatibility != CK::Benign) \
5406 HBuilder.add(CodeGenOpts->Name);
5407#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5408 if constexpr (CK::Compatibility != CK::Benign) \
5409 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5410#include "clang/Basic/DebugOptions.def"
5417 if (!SanHash.
empty())
5418 HBuilder.add(SanHash.
Mask);
5420 llvm::MD5::MD5Result
Result;
5421 HBuilder.getHasher().final(
Result);
5423 return toString(llvm::APInt(64, Hash), 36,
false);
5427 llvm::function_ref<
VisitMutResult(StringRef, std::string &)> Cb) {
5428 std::string NewValue;
5430#define RETURN_IF(OPTS, PATH) \
5432 VisitMutResult Res = Cb(PATH, NewValue); \
5433 if (Res.Replace) { \
5434 (void)ensureOwned(OPTS); \
5436 std::swap(PATH, NewValue); \
5438 if (Res.Terminate) \
5442#define RETURN_IF_MANY(OPTS, PATHS) \
5444 for (unsigned I = 0, E = PATHS.size(); I != E; ++I) \
5445 RETURN_IF(OPTS, PATHS[I]); \
5450 for (
auto &Entry :
HSOpts->UserEntries)
5451 if (Entry.IgnoreSysRoot)
5456 for (
auto &[Name,
File] :
HSOpts->PrebuiltModuleFiles)
5468 if (Input.isBuffer())
5506 [&Cb](StringRef Path, std::string &) {
return Cb(Path); });
5535 std::vector<std::string> Args{
"-cc1"};
5537 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5563 llvm::vfs::getRealFileSystem());
5571 Diags, std::move(BaseFS));
5577 if (VFSOverlayFiles.empty())
5582 for (
const auto &
File : VFSOverlayFiles) {
5583 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5586 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5591 std::move(Buffer.get()),
nullptr,
File,
5594 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)