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)
1492 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1511 if (
LangOpts.PointerAuthObjcClassROPointers)
1524 const llvm::Triple &Triple,
1526 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1527 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1528 !LangOpts.AArch64JumpTableHardening)
1534void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1536 const llvm::Triple &T,
1537 const std::string &OutputFile,
1541 if (Opts.OptimizationLevel == 0)
1544 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1546#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1547 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1548#include "clang/Options/Options.inc"
1549#undef CODEGEN_OPTION_WITH_MARSHALLING
1551 if (Opts.OptimizationLevel > 0) {
1555 GenerateArg(Consumer, OPT_finline_hint_functions);
1560 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1561 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1562 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1563 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1565 std::optional<StringRef> DebugInfoVal;
1566 switch (Opts.DebugInfo) {
1567 case llvm::codegenoptions::DebugLineTablesOnly:
1568 DebugInfoVal =
"line-tables-only";
1570 case llvm::codegenoptions::DebugDirectivesOnly:
1571 DebugInfoVal =
"line-directives-only";
1573 case llvm::codegenoptions::DebugInfoConstructor:
1574 DebugInfoVal =
"constructor";
1576 case llvm::codegenoptions::LimitedDebugInfo:
1577 DebugInfoVal =
"limited";
1579 case llvm::codegenoptions::FullDebugInfo:
1580 DebugInfoVal =
"standalone";
1582 case llvm::codegenoptions::UnusedTypeInfo:
1583 DebugInfoVal =
"unused-types";
1585 case llvm::codegenoptions::NoDebugInfo:
1586 DebugInfoVal = std::nullopt;
1588 case llvm::codegenoptions::LocTrackingOnly:
1589 DebugInfoVal = std::nullopt;
1593 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1597 Prefix.first +
"=" + Prefix.second);
1600 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1601 Prefix.first +
"=" + Prefix.second);
1603 if (Opts.NewStructPathTBAA)
1606 if (Opts.OptimizeSize == 1)
1608 else if (Opts.OptimizeSize == 2)
1616 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1618 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1621 if (Opts.InterchangeLoops)
1627 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1632 if (Opts.DebugNameTable ==
1633 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1635 else if (Opts.DebugNameTable ==
1636 static_cast<unsigned>(
1637 llvm::DICompileUnit::DebugNameTableKind::Default))
1640 if (Opts.DebugTemplateAlias)
1643 auto TNK = Opts.getDebugSimpleTemplateNames();
1644 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1645 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1646 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1647 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1648 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1653 if (Opts.TimePasses) {
1654 if (Opts.TimePassesPerRun)
1655 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1659 if (Opts.TimePassesJson)
1663 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1666 if (Opts.PrepareForThinLTO)
1675 StringRef MemProfileBasename(
"memprof.profraw");
1696 std::string InstrBundle =
1698 if (!InstrBundle.empty())
1699 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1702 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1703 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1704 else if (Opts.CFProtectionReturn)
1705 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1706 else if (Opts.CFProtectionBranch)
1707 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1709 if (Opts.CFProtectionBranch) {
1710 switch (Opts.getCFBranchLabelScheme()) {
1713#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1714 case CFBranchLabelSchemeKind::Kind: \
1715 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1717#include "clang/Basic/CFProtectionOptions.def"
1721 if (Opts.FunctionReturnThunks)
1722 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1725 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1726 F.PropagateAttrs && F.Internalize;
1728 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1732 if (Opts.EmulatedTLS)
1740 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1745 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1749 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1753 if (Opts.EnableAIXExtendedAltivecABI)
1756 if (Opts.XCOFFReadOnlyPointers)
1774 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1779 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1783 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1786 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1788 for (StringRef Sanitizer :
1790 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1792 SmallVector<std::string, 4> Values;
1794 for (std::string Sanitizer : Values)
1795 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1798 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1802 for (StringRef Sanitizer :
1804 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1806 if (!Opts.EmitVersionIdentMetadata)
1809 switch (Opts.FiniteLoops) {
1820 if (Opts.StaticClosure)
1824bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1827 const llvm::Triple &T,
1828 const std::string &OutputFile,
1839 const LangOptions *
LangOpts = &LangOptsRef;
1841#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1842 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1843#include "clang/Options/Options.inc"
1844#undef CODEGEN_OPTION_WITH_MARSHALLING
1848 if (Opts.OptimizationLevel == 0) {
1850 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1851 options::OPT_finline_hint_functions,
1852 options::OPT_fno_inline_functions,
1853 options::OPT_fno_inline)) {
1856 if (A->getOption().matches(options::OPT_finline_functions))
1858 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1868 Opts.DirectAccessExternalData =
1869 Args.hasArg(OPT_fdirect_access_external_data) ||
1870 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1873 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1875 llvm::StringSwitch<unsigned>(A->getValue())
1876 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1877 .Case(
"line-directives-only",
1878 llvm::codegenoptions::DebugDirectivesOnly)
1879 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1880 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1881 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1882 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1885 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1888 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1894 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1895 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1896 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1897 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1898 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1899 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1900 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1903 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1904 auto Split = StringRef(Arg).split(
'=');
1908 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1909 auto Split = StringRef(Arg).split(
'=');
1913 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1914 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1915 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1916 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el,
1917 llvm::Triple::riscv32, llvm::Triple::riscv64};
1920 llvm::is_contained(DebugEntryValueArchs, T.getArch()))
1921 Opts.EmitCallSiteInfo =
true;
1924 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1929 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1930 Args.hasArg(OPT_new_struct_path_tbaa);
1932 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1933 if (Opts.SimplifyLibCalls)
1936 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1937 (Opts.OptimizationLevel > 1));
1938 Opts.InterchangeLoops =
1939 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
false);
1940 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1941 OPT_fno_experimental_loop_fusion,
false);
1943 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1945 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1947 Opts.DebugNameTable =
static_cast<unsigned>(
1948 Args.hasArg(OPT_ggnu_pubnames)
1949 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1950 : Args.hasArg(OPT_gpubnames)
1951 ? llvm::DICompileUnit::DebugNameTableKind::Default
1952 : llvm::DICompileUnit::DebugNameTableKind::None);
1953 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1954 StringRef
Value = A->getValue();
1956 Diags.
Report(diag::err_drv_unsupported_option_argument)
1957 << A->getSpelling() << A->getValue();
1958 Opts.setDebugSimpleTemplateNames(
1959 StringRef(A->getValue()) ==
"simple"
1960 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1961 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1964 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1965 OPT_stats_file_timers)) {
1966 Opts.TimePasses =
true;
1969 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1970 StringRef Val =
EQ->getValue();
1971 if (Val ==
"per-pass")
1972 Opts.TimePassesPerRun =
false;
1973 else if (Val ==
"per-pass-run")
1974 Opts.TimePassesPerRun =
true;
1976 Diags.
Report(diag::err_drv_invalid_value)
1977 <<
EQ->getAsString(Args) <<
EQ->getValue();
1980 if (Args.getLastArg(OPT_ftime_report_json))
1981 Opts.TimePassesJson =
true;
1984 Opts.PrepareForLTO =
false;
1985 Opts.PrepareForThinLTO =
false;
1986 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1987 Opts.PrepareForLTO =
true;
1988 StringRef S = A->getValue();
1990 Opts.PrepareForThinLTO =
true;
1991 else if (S !=
"full")
1992 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1993 if (Args.hasArg(OPT_funified_lto))
1994 Opts.PrepareForThinLTO =
true;
1996 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
1998 Diags.
Report(diag::err_drv_argument_only_allowed_with)
1999 << A->getAsString(Args) <<
"-x ir";
2001 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2003 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2005 llvm::StringSwitch<std::string>(A->getValue())
2006 .Case(
"obj", OutputFile)
2007 .Default(llvm::sys::path::filename(OutputFile).str());
2010 const char *MemProfileBasename =
"memprof.profraw";
2011 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2012 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2013 llvm::sys::path::append(Path, MemProfileBasename);
2015 }
else if (Args.hasArg(OPT_fmemory_profile))
2019 if (Args.hasArg(OPT_coverage_version_EQ)) {
2020 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2021 if (CoverageVersion.size() != 4) {
2022 Diags.
Report(diag::err_drv_invalid_value)
2023 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2033 for (
const auto &A : Args) {
2035 if (A->getOption().getID() == options::OPT_o ||
2036 A->getOption().getID() == options::OPT_INPUT ||
2037 A->getOption().getID() == options::OPT_x ||
2038 A->getOption().getID() == options::OPT_fembed_bitcode ||
2039 A->getOption().matches(options::OPT_W_Group))
2042 A->render(Args, ASL);
2043 for (
const auto &arg : ASL) {
2044 StringRef ArgStr(arg);
2045 llvm::append_range(Opts.
CmdArgs, ArgStr);
2051 auto XRayInstrBundles =
2052 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2053 if (XRayInstrBundles.empty())
2056 for (
const auto &A : XRayInstrBundles)
2060 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2061 StringRef Name = A->getValue();
2062 if (Name ==
"full") {
2063 Opts.CFProtectionReturn = 1;
2064 Opts.CFProtectionBranch = 1;
2065 }
else if (Name ==
"return")
2066 Opts.CFProtectionReturn = 1;
2067 else if (Name ==
"branch")
2068 Opts.CFProtectionBranch = 1;
2069 else if (Name !=
"none")
2070 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2073 if (Opts.CFProtectionBranch && T.isRISCV()) {
2074 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2076 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2077#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2078 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2079#include "clang/Basic/CFProtectionOptions.def"
2082 Opts.setCFBranchLabelScheme(Scheme);
2084 Diags.
Report(diag::err_drv_invalid_value)
2085 << A->getAsString(Args) << A->getValue();
2089 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2090 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2091 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2092 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2093 .Default(llvm::FunctionReturnThunksKind::Invalid);
2096 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2097 << A->getSpelling() << T.getTriple();
2098 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2099 Diags.
Report(diag::err_drv_invalid_value)
2100 << A->getAsString(Args) << A->getValue();
2101 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2102 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2103 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2104 << A->getAsString(Args)
2105 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2107 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2111 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2112 CodeGenOptions::BitcodeFileToLink F;
2114 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2115 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2124 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2125 StringRef Val = A->getValue();
2129 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2132 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2133 StringRef Val = A->getValue();
2136 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2142 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2143 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2147 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2148 << A->getSpelling() << T.str();
2150 const Option &O = A->getOption();
2151 if (O.matches(OPT_fpcc_struct_return) ||
2152 O.matches(OPT_maix_struct_return)) {
2155 assert(O.matches(OPT_freg_struct_return) ||
2156 O.matches(OPT_msvr4_struct_return));
2161 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2163 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2164 << A->getSpelling() << T.str();
2174 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2175 Diags.
Report(diag::err_roptr_requires_data_sections);
2177 Opts.XCOFFReadOnlyPointers =
true;
2180 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2181 if (!T.isOSAIX() || T.isPPC32())
2182 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2183 << A->getSpelling() << T.str();
2186 bool NeedLocTracking =
false;
2189 NeedLocTracking =
true;
2191 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2193 NeedLocTracking =
true;
2196 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2198 NeedLocTracking =
true;
2208 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2218 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2221 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2222 <<
"-fdiagnostics-show-hotness";
2226 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2228 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2231 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2232 <<
"-fdiagnostics-hotness-threshold=";
2238 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2239 <<
"-fdiagnostics-hotness-threshold=";
2244 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2248 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2249 <<
"-fdiagnostics-misexpect-tolerance=";
2255 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2256 <<
"-fdiagnostics-misexpect-tolerance=";
2263 if (UsingSampleProfile)
2264 NeedLocTracking =
true;
2267 NeedLocTracking =
true;
2271 if (NeedLocTracking &&
2272 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2273 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2278 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2281 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2284 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2289 "-fsanitize-skip-hot-cutoff=",
2290 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2293 "-fsanitize-annotate-debug-info=",
2294 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2298 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2301 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2302 Diags.
Report(diag::err_drv_invalid_value)
2303 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2309 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2314 if (Args.hasArg(options::OPT_ffinite_loops))
2316 else if (Args.hasArg(options::OPT_fno_finite_loops))
2319 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2320 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2321 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2322 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2324 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2330 Diags.
Report(diag::err_drv_invalid_escaped_command_line)
2331 << llvm::toString(ParsedArgs.takeError());
2342#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2343 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2344#include "clang/Options/Options.inc"
2345#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2350 for (
const auto &Dep : Opts.
ExtraDeps) {
2351 switch (Dep.second) {
2364 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2373 bool ShowLineMarkers) {
2377#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2378 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2379#include "clang/Options/Options.inc"
2380#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2382 if (Args.hasArg(OPT_show_includes)) {
2397 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2398 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2399 StringRef Val = A->getValue();
2400 if (!Val.contains(
'='))
2404 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2405 StringRef Val = A->getValue();
2406 if (!Val.contains(
'='))
2413 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2417 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2421 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2422 StringRef Val = A->getValue();
2423 if (!Val.contains(
'='))
2431 if (Args.hasArg(OPT_header_include_format_EQ))
2432 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2436 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2440 if (Args.hasArg(OPT_header_include_filtering_EQ))
2441 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2445 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2453 bool DefaultColor) {
2460 for (
auto *A : Args) {
2461 const Option &O = A->getOption();
2462 if (O.matches(options::OPT_fcolor_diagnostics)) {
2464 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2466 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2467 StringRef
Value(A->getValue());
2468 if (
Value ==
"always")
2470 else if (
Value ==
"never")
2472 else if (
Value ==
"auto")
2482 for (
const auto &Prefix : VerifyPrefixes) {
2485 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2488 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2490 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2491 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2501#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2502 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2503#include "clang/Options/Options.inc"
2504#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2513#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2514 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2515#include "clang/Options/Options.inc"
2516#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2524#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2525 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2526#include "clang/Options/Options.inc"
2527#undef MIGRATOR_OPTION_WITH_MARSHALLING
2536#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2537 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2538#include "clang/Options/Options.inc"
2539#undef MIGRATOR_OPTION_WITH_MARSHALLING
2544void CompilerInvocationBase::GenerateDiagnosticArgs(
2546 bool DefaultDiagColor) {
2548#define DIAG_OPTION_WITH_MARSHALLING(...) \
2549 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2550#include "clang/Options/Options.inc"
2551#undef DIAG_OPTION_WITH_MARSHALLING
2554 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2557 switch (Opts.getShowColors()) {
2568 if (Opts.VerifyDiagnostics &&
2573 if (Prefix !=
"expected")
2576 if (Opts.VerifyDirectives) {
2584 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2587 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2589 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2591 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2593 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2598 if (
Warning ==
"undef-prefix")
2601 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2603 Consumer(StringRef(
"-W") +
Warning);
2609 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2610 "pass-analysis",
"no-pass-analysis",
2611 "pass-missed",
"no-pass-missed"};
2612 if (llvm::is_contained(IgnoredRemarks,
Remark))
2615 Consumer(StringRef(
"-R") +
Remark);
2619 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2624std::unique_ptr<DiagnosticOptions>
2626 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2627 unsigned MissingArgIndex, MissingArgCount;
2629 Argv.slice(1), MissingArgIndex, MissingArgCount);
2631 bool ShowColors =
true;
2632 if (std::optional<std::string> NoColor =
2633 llvm::sys::Process::GetEnv(
"NO_COLOR");
2634 NoColor && !NoColor->empty()) {
2649 bool DefaultDiagColor) {
2650 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2651 std::optional<DiagnosticsEngine> IgnoringDiags;
2653 IgnoringDiagOpts.emplace();
2656 Diags = &*IgnoringDiags;
2665#define DIAG_OPTION_WITH_MARSHALLING(...) \
2666 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2667#include "clang/Options/Options.inc"
2668#undef DIAG_OPTION_WITH_MARSHALLING
2670 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2673 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2677 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2678 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2680 if (Args.hasArg(OPT_verify))
2685 Opts.VerifyDiagnostics =
false;
2690 "-verify-ignore-unexpected=",
2691 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2692 if (Args.hasArg(OPT_verify_ignore_unexpected))
2694 Opts.setVerifyIgnoreUnexpected(DiagMask);
2696 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2701 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2712 unsigned DefaultOpt = 0;
2715 !Args.hasArg(OPT_cl_opt_disable))
2718 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2719 if (A->getOption().matches(options::OPT_O0))
2722 if (A->getOption().matches(options::OPT_Ofast))
2725 assert(A->getOption().matches(options::OPT_O));
2727 StringRef S(A->getValue());
2728 if (S ==
"s" || S ==
"z")
2737 unsigned MaxOptLevel = 3;
2738 if (DefaultOpt > MaxOptLevel) {
2741 Diags.
Report(diag::warn_drv_optimization_value)
2742 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2743 DefaultOpt = MaxOptLevel;
2750 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2751 if (A->getOption().matches(options::OPT_O)) {
2752 switch (A->getValue()[0]) {
2770 std::string &BlockName,
2771 unsigned &MajorVersion,
2772 unsigned &MinorVersion,
2774 std::string &UserInfo) {
2776 Arg.split(Args,
':', 5);
2777 if (Args.size() < 5)
2780 BlockName = std::string(Args[0]);
2781 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2782 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2783 if (Args[3].getAsInteger(2, Hashed))
return true;
2784 if (Args.size() > 4)
2785 UserInfo = std::string(Args[4]);
2794 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2825 OPT_emit_reduced_module_interface},
2842 OPT_print_dependency_directives_minimized_source},
2849static std::optional<frontend::ActionKind>
2852 if (ActionOpt.second == Opt.getID())
2853 return ActionOpt.first;
2855 return std::nullopt;
2859static std::optional<OptSpecifier>
2862 if (ActionOpt.first == ProgramAction)
2863 return OptSpecifier(ActionOpt.second);
2865 return std::nullopt;
2871#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2872 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2873#include "clang/Options/Options.inc"
2874#undef FRONTEND_OPTION_WITH_MARSHALLING
2876 std::optional<OptSpecifier> ProgramActionOpt =
2884 if (!ProgramActionOpt) {
2887 "Frontend action without option.");
2888 GenerateProgramAction = [&]() {
2895 GenerateProgramAction = [&]() {
2903 llvm_unreachable(
"Default AST dump format.");
2910 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2923 GenerateProgramAction = [&]() {
2928 GenerateProgramAction();
2930 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2932 for (
const auto &PluginArg : PluginArgs.second)
2934 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2935 Opt.getKind(), 0, PluginArg);
2939 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2940 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2946 for (
const auto &Plugin : Opts.
Plugins)
2952 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2965 StringRef HeaderUnit =
"";
2970 HeaderUnit =
"-user";
2973 HeaderUnit =
"-system";
2976 HeaderUnit =
"-header-unit";
2979 StringRef Header = IsHeader ?
"-header" :
"";
3002 Lang =
"objective-c";
3005 Lang =
"objective-c++";
3008 Lang =
"assembler-with-cpp";
3012 "Generating -x argument for unknown language (not precompiled).");
3027 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3031 for (
const auto &Input : Opts.
Inputs)
3032 Consumer(Input.getFile());
3041#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3042 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3043#include "clang/Options/Options.inc"
3044#undef FRONTEND_OPTION_WITH_MARSHALLING
3047 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3048 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3050 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3053 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3054 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3057 .Default(std::numeric_limits<unsigned>::max());
3059 if (Val != std::numeric_limits<unsigned>::max())
3062 Diags.
Report(diag::err_drv_invalid_value)
3063 << A->getAsString(Args) << A->getValue();
3073 Args.hasArg(OPT_interface_stub_version_EQ)
3074 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3076 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3077 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3078 ArgStr ==
"experimental-tapi-elf-v1") {
3079 std::string ErrorMessage =
3080 "Invalid interface stub format: " + ArgStr.str() +
3082 Diags.
Report(diag::err_drv_invalid_value)
3083 <<
"Must specify a valid interface stub format type, ie: "
3084 "-interface-stub-version=ifs-v1"
3087 }
else if (!ArgStr.starts_with(
"ifs-")) {
3088 std::string ErrorMessage =
3089 "Invalid interface stub format: " + ArgStr.str() +
".";
3090 Diags.
Report(diag::err_drv_invalid_value)
3091 <<
"Must specify a valid interface stub format type, ie: "
3092 "-interface-stub-version=ifs-v1"
3107 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3108 const Arg *SavedAction =
nullptr;
3109 for (
const Arg *AA :
3110 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3111 if (AA->getOption().matches(OPT_main_file_name)) {
3112 SavedAction =
nullptr;
3113 }
else if (!SavedAction) {
3116 if (!A->getOption().matches(OPT_ast_dump_EQ))
3117 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3118 << SavedAction->getSpelling() << A->getSpelling();
3125 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3126 Opts.
Plugins.emplace_back(A->getValue(0));
3130 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3131 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3133 for (
const std::string &Arg :
3134 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3135 std::string BlockName;
3136 unsigned MajorVersion;
3137 unsigned MinorVersion;
3139 std::string UserInfo;
3141 MinorVersion, Hashed, UserInfo)) {
3142 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3149 std::make_shared<TestModuleFileExtension>(
3150 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3153 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3157 Diags.
Report(diag::err_drv_invalid_value)
3158 << A->getAsString(Args) << A->getValue();
3159 Diags.
Report(diag::note_command_line_code_loc_requirement);
3163 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3164 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3165 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3167 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3168 StringRef Val = A->getValue();
3169 if (!Val.contains(
'='))
3174 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3176 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3180 if (Args.hasArg(OPT_clangir_disable_passes))
3183 if (Args.hasArg(OPT_clangir_disable_verifier))
3186 if (Args.hasArg(OPT_clangir_lib_opt) || Args.hasArg(OPT_clangir_lib_opt_EQ))
3190 if (Args.hasArg(OPT_aux_target_cpu))
3191 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3192 if (Args.hasArg(OPT_aux_target_feature))
3196 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3197 StringRef XValue = A->getValue();
3202 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3203 bool ModuleMap = XValue.consume_back(
"-module-map");
3206 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3212 if (IsHeader || Preprocessed) {
3213 if (XValue.consume_back(
"-header-unit"))
3215 else if (XValue.consume_back(
"-system"))
3217 else if (XValue.consume_back(
"-user"))
3223 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3227 DashX = llvm::StringSwitch<InputKind>(XValue)
3243 DashX = llvm::StringSwitch<InputKind>(XValue)
3251 DashX = llvm::StringSwitch<InputKind>(XValue)
3254 .Cases({
"ast",
"pcm",
"precompiled-header"},
3261 Diags.
Report(diag::err_drv_invalid_value)
3262 << A->getAsString(Args) << A->getValue();
3269 IsHeaderFile =
true;
3270 }
else if (IsHeaderFile)
3277 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3280 Inputs.push_back(
"-");
3284 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3286 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3290 StringRef(Inputs[i]).rsplit(
'.').second);
3299 bool IsSystem =
false;
3308 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3325#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3326 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3327#include "clang/Options/Options.inc"
3328#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3337 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3344 std::optional<bool> IsFramework,
3345 std::optional<bool> IgnoreSysRoot) {
3346 return llvm::is_contained(Groups, Entry.
Group) &&
3347 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3348 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3357 OptSpecifier Opt = [It, Matches]() {
3362 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3376 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3383 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3389 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3394 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3402 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3404 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3414 ? OPT_internal_isystem
3415 : OPT_internal_externc_isystem;
3419 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3421 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3425 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3426 : OPT_no_system_header_prefix;
3440#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3441 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3442#include "clang/Options/Options.inc"
3443#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3445 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3446 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3449 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3450 StringRef Val = A->getValue();
3451 if (Val.contains(
'=')) {
3452 auto Split = Val.split(
'=');
3454 std::string(Split.first), std::string(Split.second));
3457 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3460 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3461 StringRef MacroDef = A->getValue();
3463 llvm::CachedHashString(MacroDef.split(
'=').first));
3467 bool IsSysrootSpecified =
3468 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3472 auto PrefixHeaderPath = [IsSysrootSpecified,
3473 &Opts](
const llvm::opt::Arg *A,
3474 bool IsFramework =
false) -> std::string {
3475 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3476 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3478 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3479 llvm::StringRef(A->getValue()).substr(1));
3480 return std::string(Buffer);
3482 return A->getValue();
3485 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3486 bool IsFramework = A->getOption().matches(OPT_F);
3492 StringRef Prefix =
"";
3493 for (
const auto *A :
3494 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3495 if (A->getOption().matches(OPT_iprefix))
3496 Prefix = A->getValue();
3497 else if (A->getOption().matches(OPT_iwithprefix))
3503 for (
const auto *A : Args.filtered(OPT_idirafter))
3505 for (
const auto *A : Args.filtered(OPT_iquote))
3508 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3509 if (A->getOption().matches(OPT_iwithsysroot)) {
3516 for (
const auto *A : Args.filtered(OPT_iframework))
3518 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3523 for (
const auto *A : Args.filtered(OPT_c_isystem))
3525 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3527 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3529 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3533 for (
const auto *A :
3534 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3536 if (A->getOption().matches(OPT_internal_externc_isystem))
3538 Opts.
AddPath(A->getValue(), Group,
false,
true);
3540 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3544 for (
const auto *A :
3545 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3547 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3549 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3558 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3562 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3567 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3569 diags.
Report(diag::err_drv_invalid_value)
3570 << A->getAsString(Args) << A->getValue();
3572 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3578 if (Opts.PointerAuthIntrinsics)
3580 if (Opts.PointerAuthCalls)
3582 if (Opts.PointerAuthReturns)
3584 if (Opts.PointerAuthIndirectGotos)
3585 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3586 if (Opts.PointerAuthAuthTraps)
3588 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3589 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3590 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3591 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3592 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3593 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3594 if (Opts.PointerAuthFunctionTypeDiscrimination)
3595 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3596 if (Opts.PointerAuthInitFini)
3598 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3599 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3600 if (Opts.PointerAuthELFGOT)
3602 if (Opts.AArch64JumpTableHardening)
3603 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3604 if (Opts.PointerAuthObjcIsa)
3606 if (Opts.PointerAuthObjcInterfaceSel)
3607 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3608 if (Opts.PointerAuthObjcClassROPointers)
3609 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3610 if (Opts.PointerAuthBlockDescriptorPointers)
3611 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3616 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3617 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3618 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3619 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3620 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3621 Opts.PointerAuthVTPtrAddressDiscrimination =
3622 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3623 Opts.PointerAuthVTPtrTypeDiscrimination =
3624 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3625 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3626 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3627 Opts.PointerAuthFunctionTypeDiscrimination =
3628 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3629 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3630 Opts.PointerAuthInitFiniAddressDiscrimination =
3631 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3632 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3633 Opts.AArch64JumpTableHardening =
3634 Args.hasArg(OPT_faarch64_jump_table_hardening);
3635 Opts.PointerAuthBlockDescriptorPointers =
3636 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3637 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3638 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3639 Opts.PointerAuthObjcInterfaceSel =
3640 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3642 if (Opts.PointerAuthObjcInterfaceSel)
3643 Opts.PointerAuthObjcInterfaceSelKey =
3654 llvm_unreachable(
"should not parse language flags for this input");
3689 llvm_unreachable(
"unexpected input language");
3698 return "Objective-C";
3702 return "Objective-C++";
3706 return "C++ for OpenCL";
3725 llvm_unreachable(
"unknown input language");
3728void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3730 const llvm::Triple &T,
3735 if (Opts.ObjCAutoRefCount)
3737 if (Opts.PICLevel != 0)
3738 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3742 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3743 for (StringRef Sanitizer :
3745 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3751 OptSpecifier StdOpt;
3753 case LangStandard::lang_opencl10:
3754 case LangStandard::lang_opencl11:
3755 case LangStandard::lang_opencl12:
3756 case LangStandard::lang_opencl20:
3757 case LangStandard::lang_opencl30:
3758 case LangStandard::lang_openclcpp10:
3759 case LangStandard::lang_openclcpp2021:
3760 StdOpt = OPT_cl_std_EQ;
3763 StdOpt = OPT_std_EQ;
3768 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3770 if (Opts.IncludeDefaultHeader)
3771 GenerateArg(Consumer, OPT_finclude_default_header);
3772 if (Opts.DeclareOpenCLBuiltins)
3773 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3775 const LangOptions *
LangOpts = &Opts;
3777#define LANG_OPTION_WITH_MARSHALLING(...) \
3778 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3779#include "clang/Options/Options.inc"
3780#undef LANG_OPTION_WITH_MARSHALLING
3791 else if (Opts.ObjCAutoRefCount == 1)
3794 if (Opts.ObjCWeakRuntime)
3795 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3800 if (Opts.ObjCSubscriptingLegacyRuntime)
3801 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3804 if (Opts.GNUCVersion != 0) {
3805 unsigned Major = Opts.GNUCVersion / 100 / 100;
3806 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3807 unsigned Patch = Opts.GNUCVersion % 100;
3809 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3812 if (Opts.IgnoreXCOFFVisibility)
3813 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3819 if (!Opts.MSVCCompat)
3821 }
else if (Opts.MSVCCompat) {
3824 if (Opts.PointerOverflowDefined)
3827 if (Opts.MSCompatibilityVersion != 0) {
3828 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3829 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3830 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3831 GenerateArg(Consumer, OPT_fms_compatibility_version,
3832 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3835 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3837 if (!Opts.Trigraphs)
3844 if (T.isOSzOS() && !Opts.ZOSExt)
3846 else if (Opts.ZOSExt)
3849 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3852 if (Opts.ConvergentFunctions)
3855 GenerateArg(Consumer, OPT_fno_convergent_functions);
3857 if (Opts.NoBuiltin && !Opts.Freestanding)
3860 if (!Opts.NoBuiltin)
3864 if (Opts.LongDoubleSize == 128)
3866 else if (Opts.LongDoubleSize == 64)
3868 else if (Opts.LongDoubleSize == 80)
3875 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3878 if (Opts.OpenMP != 51)
3879 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3881 if (!Opts.OpenMPUseTLS)
3884 if (Opts.OpenMPIsTargetDevice)
3885 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3887 if (Opts.OpenMPIRBuilder)
3888 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3891 if (Opts.OpenMPSimd) {
3894 if (Opts.OpenMP != 51)
3895 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3898 if (Opts.OpenMPThreadSubscription)
3899 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3901 if (Opts.OpenMPTeamSubscription)
3902 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3904 if (Opts.OpenMPTargetDebug != 0)
3905 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3906 Twine(Opts.OpenMPTargetDebug));
3908 if (Opts.OpenMPCUDANumSMs != 0)
3909 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3910 Twine(Opts.OpenMPCUDANumSMs));
3912 if (Opts.OpenMPCUDABlocksPerSM != 0)
3913 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3914 Twine(Opts.OpenMPCUDABlocksPerSM));
3917 std::string Targets;
3918 llvm::raw_string_ostream
OS(Targets);
3921 [&OS](
const llvm::Triple &T) { OS << T.str(); },
",");
3922 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3925 if (Opts.OpenMPCUDAMode)
3941 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3944 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3945 for (StringRef Sanitizer :
3947 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3951 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3953 switch (Opts.getClangABICompat()) {
3954#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3955 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3956 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3958#define ABI_VER_MAJOR(Major) \
3959 case LangOptions::ClangABI::Ver##Major: \
3960 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3962#define ABI_VER_LATEST(Latest) \
3963 case LangOptions::ClangABI::Latest: \
3965#include "clang/Basic/ABIVersions.def"
3968 if (Opts.getSignReturnAddressScope() ==
3970 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3971 else if (Opts.getSignReturnAddressScope() ==
3973 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3975 if (Opts.getSignReturnAddressKey() ==
3977 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3983 if (Opts.RelativeCXXABIVTables)
3984 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3986 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3994 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
4004 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
4005 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
4008 if (Opts.MatrixTypes) {
4009 if (Opts.getDefaultMatrixMemoryLayout() ==
4011 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
4012 if (Opts.getDefaultMatrixMemoryLayout() ==
4014 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4018bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4020 std::vector<std::string> &Includes,
4030 if (Args.hasArg(OPT_fobjc_arc))
4031 Opts.ObjCAutoRefCount = 1;
4035 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4039 "-fsanitize-ignore-for-ubsan-feature=",
4040 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4051 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4054 Diags.
Report(diag::err_drv_invalid_value)
4055 << A->getAsString(Args) << A->getValue();
4057 for (
unsigned KindValue = 0;
4063 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4065 unsigned NumAliases = 0;
4066#define LANGSTANDARD(id, name, lang, desc, features, version)
4067#define LANGSTANDARD_ALIAS(id, alias) \
4068 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4069#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4070#include "clang/Basic/LangStandards.def"
4072#define LANGSTANDARD(id, name, lang, desc, features, version)
4073#define LANGSTANDARD_ALIAS(id, alias) \
4074 if (KindValue == LangStandard::lang_##id) Diag << alias;
4075#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4076#include "clang/Basic/LangStandards.def"
4084 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4092 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4094 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4095 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4096 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4097 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4098 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4099 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4100 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4101 .Cases({
"cl3.1",
"CL3.1"}, LangStandard::lang_opencl31)
4102 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4103 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4104 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4108 Diags.
Report(diag::err_drv_invalid_value)
4109 << A->getAsString(Args) << A->getValue();
4112 LangStd = OpenCLLangStd;
4116 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4117 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4125#define LANG_OPTION_WITH_MARSHALLING(...) \
4126 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4127#include "clang/Options/Options.inc"
4128#undef LANG_OPTION_WITH_MARSHALLING
4133 Opts.Modules = Opts.ClangModules || Opts.CPlusPlusModules;
4135 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4136 StringRef Name = A->getValue();
4137 if (Name ==
"full") {
4138 Opts.CFProtectionBranch = 1;
4139 Opts.CFProtectionReturn = 1;
4140 }
else if (Name ==
"branch") {
4141 Opts.CFProtectionBranch = 1;
4142 }
else if (Name ==
"return") {
4143 Opts.CFProtectionReturn = 1;
4147 if (Opts.CFProtectionBranch) {
4148 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4150 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4151#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4152 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4153#include "clang/Basic/CFProtectionOptions.def"
4155 Opts.setCFBranchLabelScheme(Scheme);
4159 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4160 !Args.hasArg(OPT_sycl_std_EQ)) {
4170 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4171 StringRef value =
arg->getValue();
4173 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4176 if (Args.hasArg(OPT_fobjc_gc_only))
4178 else if (Args.hasArg(OPT_fobjc_gc))
4180 else if (Args.hasArg(OPT_fobjc_arc)) {
4181 Opts.ObjCAutoRefCount = 1;
4183 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4190 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4191 Opts.ObjCWeakRuntime = 1;
4197 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4198 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4199 assert(!Opts.ObjCWeak);
4201 Diags.
Report(diag::err_objc_weak_with_gc);
4202 }
else if (!Opts.ObjCWeakRuntime) {
4203 Diags.
Report(diag::err_objc_weak_unsupported);
4207 }
else if (Opts.ObjCAutoRefCount) {
4208 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4211 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4212 Opts.ObjCSubscriptingLegacyRuntime =
4216 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4219 VersionTuple GNUCVer;
4220 bool Invalid = GNUCVer.tryParse(A->getValue());
4221 unsigned Major = GNUCVer.getMajor();
4222 unsigned Minor = GNUCVer.getMinor().value_or(0);
4223 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4224 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4225 Diags.
Report(diag::err_drv_invalid_value)
4226 << A->getAsString(Args) << A->getValue();
4228 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4231 if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4232 Opts.IgnoreXCOFFVisibility = 1;
4234 if (Args.hasArg(OPT_ftrapv)) {
4238 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4239 }
else if (Args.hasFlag(OPT_fwrapv, OPT_fno_wrapv, Opts.MSVCCompat)) {
4242 if (Args.hasArg(OPT_fwrapv_pointer))
4243 Opts.PointerOverflowDefined =
true;
4245 Opts.MSCompatibilityVersion = 0;
4246 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4248 if (VT.tryParse(A->getValue()))
4249 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4251 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4252 VT.getMinor().value_or(0) * 100000 +
4253 VT.getSubminor().value_or(0);
4261 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4264 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4267 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions, T.isOSzOS());
4269 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4270 && Opts.OpenCLVersion == 200);
4272 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4273 Opts.HLSL || T.isAMDGPU() || T.isNVPTX();
4274 Opts.ConvergentFunctions =
4275 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4276 HasConvergentOperations);
4278 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4279 if (!Opts.NoBuiltin)
4281 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4282 if (A->getOption().matches(options::OPT_mlong_double_64))
4283 Opts.LongDoubleSize = 64;
4284 else if (A->getOption().matches(options::OPT_mlong_double_80))
4285 Opts.LongDoubleSize = 80;
4286 else if (A->getOption().matches(options::OPT_mlong_double_128))
4287 Opts.LongDoubleSize = 128;
4289 Opts.LongDoubleSize = 0;
4291 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4297 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4299 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4300 << A->getSpelling() <<
"-fdefault-calling-conv";
4302 switch (T.getArch()) {
4303 case llvm::Triple::x86:
4306 case llvm::Triple::m68k:
4310 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4311 << A->getSpelling() << T.getTriple();
4317 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4319 bool IsSimdSpecified =
4320 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4322 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4324 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4325 Opts.OpenMPIsTargetDevice =
4326 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4327 Opts.OpenMPIRBuilder =
4328 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4329 bool IsTargetSpecified =
4330 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4332 if (Opts.OpenMP || Opts.OpenMPSimd) {
4334 Args, OPT_fopenmp_version_EQ,
4335 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4336 Opts.OpenMP = Version;
4339 if (!Opts.OpenMPIsTargetDevice) {
4340 switch (T.getArch()) {
4344 case llvm::Triple::nvptx:
4345 case llvm::Triple::nvptx64:
4346 Diags.
Report(diag::err_drv_omp_host_target_not_supported) << T.str();
4354 if ((Opts.OpenMPIsTargetDevice && T.isGPU()) || Opts.OpenCLCPlusPlus) {
4356 Opts.Exceptions = 0;
4357 Opts.CXXExceptions = 0;
4359 if (Opts.OpenMPIsTargetDevice && T.isNVPTX()) {
4360 Opts.OpenMPCUDANumSMs =
4362 Opts.OpenMPCUDANumSMs, Diags);
4363 Opts.OpenMPCUDABlocksPerSM =
4365 Opts.OpenMPCUDABlocksPerSM, Diags);
4370 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4371 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4373 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4374 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4375 Opts.OpenMPTargetDebug = 1;
4378 if (Opts.OpenMPIsTargetDevice) {
4379 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4380 Opts.OpenMPTeamSubscription =
true;
4381 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4382 Opts.OpenMPThreadSubscription =
true;
4386 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4387 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4388 auto getArchPtrSize = [](
const llvm::Triple &T) {
4389 if (T.isArch16Bit())
4391 if (T.isArch32Bit())
4393 assert(T.isArch64Bit() &&
"Expected 64-bit architecture");
4397 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4398 llvm::Triple TT(A->getValue(i));
4400 if (TT.getArch() == llvm::Triple::UnknownArch ||
4401 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4402 TT.getArch() == llvm::Triple::spirv64 ||
4403 TT.getArch() == llvm::Triple::systemz ||
4404 TT.getArch() == llvm::Triple::loongarch64 ||
4405 TT.getArch() == llvm::Triple::nvptx ||
4406 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4407 TT.getArch() == llvm::Triple::x86 ||
4408 TT.getArch() == llvm::Triple::x86_64))
4409 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4410 else if (getArchPtrSize(T) != getArchPtrSize(TT))
4411 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4412 << A->getValue(i) << T.str();
4419 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4420 (T.isNVPTX() || T.isAMDGCN()) &&
4421 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4424 if (Args.hasArg(options::OPT_fopenacc))
4425 Opts.OpenACC =
true;
4427 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4428 StringRef Val = A->getValue();
4431 else if (Val ==
"on")
4433 else if (Val ==
"off")
4435 else if (Val ==
"fast-honor-pragmas")
4438 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4442 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4443 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4445 llvm::StringSwitch<unsigned>(A->getValue(i))
4448 .Case(
"add-unsigned-overflow-test",
4450 .Case(
"add-signed-overflow-test",
4453 .Case(
"unsigned-post-decr-while",
4463 "-fsanitize-ignore-for-ubsan-feature=",
4464 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4466 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4467 std::vector<std::string> systemIgnorelists =
4468 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4470 systemIgnorelists.begin(),
4471 systemIgnorelists.end());
4473 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4474 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4476 StringRef Ver = A->getValue();
4477 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4478 int Major, Minor = 0;
4482 if (!VerParts.first.starts_with(
"0") &&
4483 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4484 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4486 ? VerParts.second.size() == 1 &&
4487 !VerParts.second.getAsInteger(10, Minor)
4488 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4490#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4491 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4492 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4494#define ABI_VER_MAJOR(Major_) \
4495 if (Major <= Major_) \
4496 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4498#define ABI_VER_LATEST(Latest) \
4501#include "clang/Basic/ABIVersions.def"
4502 }
else if (Ver !=
"latest") {
4503 Diags.
Report(diag::err_drv_invalid_value)
4504 << A->getAsString(Args) << A->getValue();
4508 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4509 StringRef SignScope = A->getValue();
4511 if (SignScope.equals_insensitive(
"none"))
4512 Opts.setSignReturnAddressScope(
4514 else if (SignScope.equals_insensitive(
"all"))
4515 Opts.setSignReturnAddressScope(
4517 else if (SignScope.equals_insensitive(
"non-leaf"))
4518 Opts.setSignReturnAddressScope(
4521 Diags.
Report(diag::err_drv_invalid_value)
4522 << A->getAsString(Args) << SignScope;
4524 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4525 StringRef SignKey = A->getValue();
4526 if (!SignScope.empty() && !SignKey.empty()) {
4527 if (SignKey ==
"a_key")
4528 Opts.setSignReturnAddressKey(
4530 else if (SignKey ==
"b_key")
4531 Opts.setSignReturnAddressKey(
4534 Diags.
Report(diag::err_drv_invalid_value)
4535 << A->getAsString(Args) << SignKey;
4541 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4548 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI << T.str();
4554 Opts.RelativeCXXABIVTables =
4555 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4556 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4560 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4561 Opts.OmitVTableRTTI =
4562 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4563 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4564 if (Opts.OmitVTableRTTI && HasRTTI)
4565 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4567 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4568 auto Split = StringRef(A).split(
'=');
4570 {std::string(
Split.first), std::string(
Split.second)});
4574 !Args.getLastArg(OPT_fno_file_reproducible) &&
4575 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4576 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4577 Args.getLastArg(OPT_ffile_reproducible));
4580 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4582 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4583 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4585 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4587 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4588 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4591 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4592 std::ifstream SeedFile(A->getValue(0));
4594 if (!SeedFile.is_open())
4595 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4601 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4604 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4605 StringRef S = Arg->getValue();
4607 if (S.getAsInteger(0,
Value))
4608 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4613 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4614 StringRef S = Arg->getValue();
4615 if (
auto Mode = getAllocTokenModeFromString(S))
4618 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4622 if (Opts.MatrixTypes) {
4623 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4624 StringRef ClangValue = A->getValue();
4625 if (ClangValue ==
"row-major")
4626 Opts.setDefaultMatrixMemoryLayout(
4629 Opts.setDefaultMatrixMemoryLayout(
4632 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4633 StringRef OptValue = A->getValue();
4634 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4635 ClangValue != OptValue)
4636 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4637 << ClangValue << OptValue;
4646 if (T.isDXIL() || T.isSPIRVLogical()) {
4648 enum {
OS, Environment };
4650 int ExpectedOS = T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4652 if (T.getOSName().empty()) {
4653 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4654 << ExpectedOS <<
OS << T.str();
4655 }
else if (T.getEnvironmentName().empty()) {
4656 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4658 }
else if (!T.isShaderStageEnvironment()) {
4659 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4660 <<
ShaderStage << T.getEnvironmentName() << T.str();
4664 if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
4665 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4666 << ShaderModel << T.getOSName() << T.str();
4671 if (Args.getLastArg(OPT_fnative_half_type) ||
4672 Args.getLastArg(OPT_fnative_int16_type)) {
4673 const LangStandard &Std =
4675 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4676 T.getOSVersion() >= VersionTuple(6, 2)))
4677 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4678 <<
"-enable-16bit-types" <<
true << Std.
getName()
4679 << T.getOSVersion().getAsString();
4681 }
else if (T.isSPIRVLogical()) {
4682 if (!T.isVulkanOS() || T.getVulkanVersion() == VersionTuple(0)) {
4683 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4684 << VulkanEnv << T.getOSName() << T.str();
4686 if (Args.getLastArg(OPT_fnative_half_type) ||
4687 Args.getLastArg(OPT_fnative_int16_type)) {
4688 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4689 ?
"-fnative-half-type"
4690 :
"-fnative-int16-type";
4691 const LangStandard &Std =
4693 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4694 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4695 << Str <<
false << Std.
getName();
4698 llvm_unreachable(
"expected DXIL or SPIR-V target");
4701 Diags.
Report(diag::err_drv_hlsl_unsupported_target) << T.str();
4703 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4704 const LangStandard &Requested =
4706 const LangStandard &Recommended =
4708 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4759 llvm_unreachable(
"invalid frontend action");
4804 llvm_unreachable(
"invalid frontend action");
4814#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4815 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4816#include "clang/Options/Options.inc"
4817#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4820 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4823 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4830 for (
const auto &M : Opts.
Macros) {
4833 if (M.first ==
"__CET__=1" && !M.second &&
4834 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4836 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4837 !CodeGenOpts.CFProtectionBranch)
4839 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4840 CodeGenOpts.CFProtectionBranch)
4843 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4846 for (
const auto &I : Opts.
Includes) {
4849 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4850 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4855 if (LangOpts.HLSL && I ==
"hlsl.h")
4865 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4871 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4874 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4888#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4889 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4890#include "clang/Options/Options.inc"
4891#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4893 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4894 Args.hasArg(OPT_pch_through_hdrstop_use);
4896 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4899 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4900 StringRef
Value(A->getValue());
4901 size_t Comma =
Value.find(
',');
4903 unsigned EndOfLine = 0;
4905 if (Comma == StringRef::npos ||
4906 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4907 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4908 Diags.
Report(diag::err_drv_preamble_format);
4916 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4917 if (A->getOption().matches(OPT_D))
4924 for (
const auto *A : Args.filtered(OPT_include))
4925 Opts.
Includes.emplace_back(A->getValue());
4927 for (
const auto *A : Args.filtered(OPT_chain_include))
4930 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4931 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4933 if (Split.second.empty()) {
4934 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4941 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4942 StringRef Epoch = A->getValue();
4946 const uint64_t MaxTimestamp =
4947 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4949 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4950 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4951 << Epoch << MaxTimestamp;
4957 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4958 StringRef Val = A->getValue();
4969 Args.hasFlag(OPT_fdefine_target_os_macros,
4981#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4982 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4983#include "clang/Options/Options.inc"
4984#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5002#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5003 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5004#include "clang/Options/Options.inc"
5005#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5008 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
5017#define TARGET_OPTION_WITH_MARSHALLING(...) \
5018 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5019#include "clang/Options/Options.inc"
5020#undef TARGET_OPTION_WITH_MARSHALLING
5026 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5036#define TARGET_OPTION_WITH_MARSHALLING(...) \
5037 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5038#include "clang/Options/Options.inc"
5039#undef TARGET_OPTION_WITH_MARSHALLING
5041 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5042 llvm::VersionTuple Version;
5043 if (Version.tryParse(A->getValue()))
5044 Diags.
Report(diag::err_drv_invalid_value)
5045 << A->getAsString(Args) << A->getValue();
5050 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5051 llvm::VersionTuple Version;
5052 if (Version.tryParse(A->getValue()))
5053 Diags.
Report(diag::err_drv_invalid_value)
5054 << A->getAsString(Args) << A->getValue();
5062bool CompilerInvocation::CreateFromArgsImpl(
5070 unsigned MissingArgIndex, MissingArgCount;
5071 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5072 MissingArgCount, VisibilityMask);
5076 if (MissingArgCount)
5077 Diags.
Report(diag::err_drv_missing_argument)
5078 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5081 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5082 auto ArgString = A->getAsString(Args);
5083 std::string Nearest;
5084 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5085 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5087 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5088 << ArgString << Nearest;
5121 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5135 Diags.
Report(diag::warn_drv_openacc_without_cir);
5143 if (!Args.hasArg(options::OPT_triple))
5155 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5156 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5157 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5158 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5171 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5177 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5188 llvm::driver::ProfileInstrKind::ProfileNone)
5189 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5199 const char *Argv0) {
5205 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5209 Args.push_back(
"-cc1");
5212 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5217 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5230 const unsigned LanguageOptionValues[] = {
5231#define HASH_LANGOPT_Benign(Value)
5232#define HASH_LANGOPT_Compatible(Value) Value,
5233#define HASH_LANGOPT_NotCompatible(Value) Value,
5234#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5235 HASH_LANGOPT_##Compatibility(LangOpts->Name)
5236#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5237 HASH_LANGOPT_##Compatibility(static_cast<unsigned>(LangOpts->get##Name()))
5238#include "clang/Basic/LangOptions.def"
5240#undef HASH_LANGOPT_Benign
5241#undef HASH_LANGOPT_Compatible
5242#undef HASH_LANGOPT_NotCompatible
5245 HBuilder.addRangeElements(LanguageOptionValues);
5250 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5267 StringRef MacroDef =
Macro.first;
5269 llvm::CachedHashString(MacroDef.split(
'=').first)))
5273 HBuilder.add(
Macro);
5289#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5290#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5291 HBuilder.add(diagOpts.get##Name());
5292#include "clang/Basic/DiagnosticOptions.def"
5302 ext->hashExtension(HBuilder);
5309 HBuilder.add(*Minor);
5310 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5311 HBuilder.add(*Subminor);
5313 HBuilder.add(*Build);
5319#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5320 if constexpr (CK::Compatibility != CK::Benign) \
5321 HBuilder.add(CodeGenOpts->Name);
5322#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5323 if constexpr (CK::Compatibility != CK::Benign) \
5324 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5325#define DEBUGOPT(Name, Bits, Default, Compatibility)
5326#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5327#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5328#include "clang/Basic/CodeGenOptions.def"
5340#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5341 if constexpr (CK::Compatibility != CK::Benign) \
5342 HBuilder.add(CodeGenOpts->Name);
5343#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5344 if constexpr (CK::Compatibility != CK::Benign) \
5345 HBuilder.add(CodeGenOpts->Name);
5346#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5347 if constexpr (CK::Compatibility != CK::Benign) \
5348 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5349#include "clang/Basic/DebugOptions.def"
5356 if (!SanHash.
empty())
5357 HBuilder.add(SanHash.
Mask);
5359 llvm::MD5::MD5Result
Result;
5360 HBuilder.getHasher().final(
Result);
5362 return toString(llvm::APInt(64, Hash), 36,
false);
5366 llvm::function_ref<
VisitMutResult(StringRef, std::string &)> Cb) {
5367 std::string NewValue;
5369#define RETURN_IF(OPTS, PATH) \
5371 VisitMutResult Res = Cb(PATH, NewValue); \
5372 if (Res.Replace) { \
5373 (void)ensureOwned(OPTS); \
5375 std::swap(PATH, NewValue); \
5377 if (Res.Terminate) \
5381#define RETURN_IF_MANY(OPTS, PATHS) \
5383 for (unsigned I = 0, E = PATHS.size(); I != E; ++I) \
5384 RETURN_IF(OPTS, PATHS[I]); \
5389 for (
auto &Entry :
HSOpts->UserEntries)
5390 if (Entry.IgnoreSysRoot)
5395 for (
auto &[Name,
File] :
HSOpts->PrebuiltModuleFiles)
5407 if (Input.isBuffer())
5445 [&Cb](StringRef Path, std::string &) {
return Cb(Path); });
5474 std::vector<std::string> Args{
"-cc1"};
5476 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5502 llvm::vfs::getRealFileSystem());
5510 Diags, std::move(BaseFS));
5516 if (VFSOverlayFiles.empty())
5521 for (
const auto &
File : VFSOverlayFiles) {
5522 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5525 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5530 std::move(Buffer.get()),
nullptr,
File,
5533 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.
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
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
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.
@ TemplightDump
Dump template instantiations.
@ GenerateModuleInterface
Generate pre-compiled module from a standard C++ module interface unit.
@ EmitLLVM
Emit a .ll file.
@ PrintPreamble
Print the "preamble" of the input file.
@ 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.
The JSON file list parser is used to communicate input to InstallAPI.
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)
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
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.
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)