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();
583 Diags.
Report(diag::err_fe_invalid_exception_model)
584 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) <<
T.str();
586 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
587 Diags.
Report(diag::warn_c_kext);
589 if (LangOpts.NewAlignOverride &&
590 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
591 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
592 Diags.
Report(diag::err_fe_invalid_alignment)
593 << A->getAsString(Args) << A->getValue();
594 LangOpts.NewAlignOverride = 0;
599 if (LangOpts.CPlusPlus11) {
600 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
601 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
602 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
603 <<
bool(LangOpts.RawStringLiterals);
607 LangOpts.RawStringLiterals =
true;
610 if (Args.hasArg(OPT_freflection) && !LangOpts.CPlusPlus26) {
611 Diags.
Report(diag::err_drv_reflection_requires_cxx26)
612 << Args.getLastArg(options::OPT_freflection)->getAsString(Args);
615 LangOpts.NamedLoops =
616 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
619 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
620 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
624 if ((LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) && !LangOpts.CPlusPlus)
625 Diags.
Report(diag::err_drv_argument_not_allowed_with)
628 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
629 Diags.
Report(diag::err_drv_argument_not_allowed_with)
632 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
633 Diags.
Report(diag::err_drv_argument_not_allowed_with)
636 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
637 Diags.
Report(diag::err_drv_argument_not_allowed_with)
640 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
641 Diags.
Report(diag::err_drv_argument_not_allowed_with)
644 if (Args.hasArg(OPT_fdx_semantic_signature_packing_mode_EQ) && !LangOpts.HLSL)
645 Diags.
Report(diag::err_drv_argument_not_allowed_with)
648 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
649 Diags.
Report(diag::warn_ignored_hip_only_option)
650 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
652 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
653 Diags.
Report(diag::warn_ignored_hip_only_option)
654 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
660 if (!llvm::is_contained(Warnings,
"conversion"))
661 Warnings.insert(Warnings.begin(),
"conversion");
662 if (!llvm::is_contained(Warnings,
"vector-conversion"))
663 Warnings.insert(Warnings.begin(),
"vector-conversion");
664 if (!llvm::is_contained(Warnings,
"matrix-conversion"))
665 Warnings.insert(Warnings.begin(),
"matrix-conversion");
670 if (Args.hasArg(OPT_load_bool_from_mem) &&
671 CodeGenOpts.getLoadBoolFromMem() !=
673 Diags.
Report(diag::warn_hlsl_bool_from_mem)
674 << Args.getLastArg(OPT_load_bool_from_mem)->getValue();
685 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
686 if (LangOpts.ApproxFunc)
687 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
688 if (LangOpts.AllowFPReassoc)
689 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
690 if (LangOpts.AllowRecip)
691 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
697 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
699 Diags.
Report(diag::warn_option_invalid_ocl_version)
701 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
703 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
704 auto DefaultCC = LangOpts.getDefaultCallingConv();
708 Arch != llvm::Triple::x86;
714 Diags.
Report(diag::err_drv_argument_not_allowed_with)
715 << A->getSpelling() <<
T.getTriple();
726 llvm::opt::OptSpecifier OptSpecifier) {
729 Option::OptionClass::FlagClass, 0);
733 llvm::opt::OptSpecifier OptSpecifier,
734 const Twine &
Value) {
772 bool CheckAgainstOriginalInvocation =
false,
773 bool ForceRoundTrip =
false) {
775 bool DoRoundTripDefault =
true;
777 bool DoRoundTripDefault =
false;
780 bool DoRoundTrip = DoRoundTripDefault;
781 if (ForceRoundTrip) {
784 for (
const auto *Arg : CommandLineArgs) {
785 if (Arg == StringRef(
"-round-trip-args"))
787 if (Arg == StringRef(
"-no-round-trip-args"))
795 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
800 llvm::raw_string_ostream OS(Buffer);
801 for (
const char *Arg : Args) {
802 llvm::sys::printArg(OS, Arg,
true);
815 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
822 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
828 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
829 Diags.
Report(diag::note_cc1_round_trip_original)
830 << SerializeArgs(CommandLineArgs);
835 llvm::BumpPtrAllocator Alloc;
836 llvm::StringSaver StringPool(Alloc);
837 auto SA = [&StringPool](
const Twine &Arg) {
838 return StringPool.save(Arg).data();
845 Generate(DummyInvocation, GeneratedArgs, SA);
851 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
856 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
857 Diags.
Report(diag::note_cc1_round_trip_generated)
858 << 1 << SerializeArgs(GeneratedArgs);
863 if (CheckAgainstOriginalInvocation)
865 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
869 Generate(RealInvocation, ComparisonArgs, SA);
874 return llvm::equal(A, B, [](
const char *AElem,
const char *BElem) {
875 return StringRef(AElem) == StringRef(BElem);
882 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
883 Diags.
Report(diag::err_cc1_round_trip_mismatch);
884 Diags.
Report(diag::note_cc1_round_trip_generated)
885 << 1 << SerializeArgs(GeneratedArgs);
886 Diags.
Report(diag::note_cc1_round_trip_generated)
887 << 2 << SerializeArgs(ComparisonArgs);
891 Diags.
Report(diag::remark_cc1_round_trip_generated)
892 << 1 << SerializeArgs(GeneratedArgs);
893 Diags.
Report(diag::remark_cc1_round_trip_generated)
894 << 2 << SerializeArgs(ComparisonArgs);
906 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
910 Args.push_back(
"-cc1");
913 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
918 OptSpecifier GroupWithValue,
919 std::vector<std::string> &Diagnostics) {
920 for (
auto *A : Args.filtered(Group)) {
921 if (A->getOption().getKind() == Option::FlagClass) {
924 Diagnostics.push_back(
925 std::string(A->getOption().getName().drop_front(1)));
926 }
else if (A->getOption().matches(GroupWithValue)) {
929 Diagnostics.push_back(
930 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
933 Diagnostics.push_back(A->getValue());
944 std::vector<std::string> &Funcs) {
945 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
947 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
954#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
955 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
956#include "clang/Options/Options.inc"
957#undef ANALYZER_OPTION_WITH_MARSHALLING
961#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
963 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
965#include "clang/StaticAnalyzer/Core/Analyses.def"
967 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
973#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
975 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
977#include "clang/StaticAnalyzer/Core/Analyses.def"
979 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
985#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
987 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
989#include "clang/StaticAnalyzer/Core/Analyses.def"
991 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
997#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
999 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
1001#include "clang/StaticAnalyzer/Core/Analyses.def"
1003 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
1009 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1018 for (
const auto &
C : Opts.
Config)
1019 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1020 llvm::sort(SortedConfigOpts, llvm::less_first());
1022 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1025 auto Entry = ConfigOpts.
Config.find(Key);
1026 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1039#define SSAF_OPTION_WITH_MARSHALLING(...) \
1040 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1041#include "clang/Options/Options.inc"
1042#undef SSAF_OPTION_WITH_MARSHALLING
1051#define SSAF_OPTION_WITH_MARSHALLING(...) \
1052 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1053#include "clang/Options/Options.inc"
1054#undef SSAF_OPTION_WITH_MARSHALLING
1065#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1066 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1067#include "clang/Options/Options.inc"
1068#undef ANALYZER_OPTION_WITH_MARSHALLING
1070 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1071 StringRef Name = A->getValue();
1073#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1074 .Case(CMDFLAG, NAME##Model)
1075#include "clang/StaticAnalyzer/Core/Analyses.def"
1078 Diags.
Report(diag::err_drv_invalid_value)
1079 << A->getAsString(Args) << Name;
1082 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1083 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1090 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1091 StringRef Name = A->getValue();
1093#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1094 .Case(CMDFLAG, PD_##NAME)
1095#include "clang/StaticAnalyzer/Core/Analyses.def"
1098 Diags.
Report(diag::err_drv_invalid_value)
1099 << A->getAsString(Args) << Name;
1105 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1106 StringRef Name = A->getValue();
1108#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1109 .Case(CMDFLAG, NAME)
1110#include "clang/StaticAnalyzer/Core/Analyses.def"
1113 Diags.
Report(diag::err_drv_invalid_value)
1114 << A->getAsString(Args) << Name;
1120 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1121 StringRef Name = A->getValue();
1123#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1124 .Case(CMDFLAG, NAME)
1125#include "clang/StaticAnalyzer/Core/Analyses.def"
1128 Diags.
Report(diag::err_drv_invalid_value)
1129 << A->getAsString(Args) << Name;
1137 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1139 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1142 StringRef CheckerAndPackageList = A->getValue();
1144 CheckerAndPackageList.split(CheckersAndPackages,
",");
1145 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1151 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1155 StringRef configList = A->getValue();
1157 configList.split(configVals,
",");
1158 for (
const auto &configVal : configVals) {
1160 std::tie(key, val) = configVal.split(
"=");
1163 diag::err_analyzer_config_no_value) << configVal;
1166 if (val.contains(
'=')) {
1168 diag::err_analyzer_config_multiple_values)
1177 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1182 Opts.
Config[key] = std::string(val);
1192 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1195 os << Args.getArgString(i);
1202 StringRef OptionName, StringRef DefaultVal) {
1203 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1208 StringRef &OptionField, StringRef Name,
1209 StringRef DefaultVal) {
1218 bool &OptionField, StringRef Name,
bool DefaultVal) {
1219 auto PossiblyInvalidVal =
1220 llvm::StringSwitch<std::optional<bool>>(
1223 .Case(
"false",
false)
1224 .Default(std::nullopt);
1226 if (!PossiblyInvalidVal) {
1228 Diags->
Report(diag::err_analyzer_config_invalid_input)
1229 << Name <<
"a boolean";
1231 OptionField = DefaultVal;
1233 OptionField = *PossiblyInvalidVal;
1238 unsigned &OptionField, StringRef Name,
1239 unsigned DefaultVal) {
1241 OptionField = DefaultVal;
1242 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1243 .getAsInteger(0, OptionField);
1244 if (Diags && HasFailed)
1245 Diags->
Report(diag::err_analyzer_config_invalid_input)
1246 << Name <<
"an unsigned";
1252 unsigned DefaultVal) {
1255 if (Parsed.has_value()) {
1256 OptionField = Parsed.value();
1259 if (Diags && !Parsed.has_value())
1260 Diags->
Report(diag::err_analyzer_config_invalid_input)
1261 << Name <<
"a positive";
1263 OptionField = DefaultVal;
1271#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1272 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1273#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1274#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1276 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1277 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1279#define ANALYZER_OPTION(...)
1280#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1281 SHALLOW_VAL, DEEP_VAL) \
1282 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1283 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1284#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1291 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1292 std::vector<StringRef> Checkers =
1294 std::vector<StringRef> Packages =
1298 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1300 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1302 bool IsChecker = CheckerOrPackage.contains(
'.');
1303 bool IsValidName = IsChecker
1304 ? llvm::is_contained(Checkers, CheckerOrPackage)
1305 : llvm::is_contained(Packages, CheckerOrPackage);
1308 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1309 << CheckerOrPackage;
1319 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1320 Diags->
Report(diag::err_analyzer_config_invalid_input)
1321 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1329 if (
Remark.hasValidPattern()) {
1334 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1343 OptSpecifier OptEQ, StringRef Name) {
1346 auto InitializeResultPattern = [&Diags, &Args, &
Result](
const Arg *A,
1347 StringRef Pattern) {
1348 Result.Pattern = Pattern.str();
1350 std::string RegexError;
1351 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1352 if (!
Result.Regex->isValid(RegexError)) {
1353 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1354 << RegexError << A->getAsString(Args);
1361 for (Arg *A : Args) {
1362 if (A->getOption().matches(OPT_R_Joined)) {
1363 StringRef
Value = A->getValue();
1367 else if (
Value ==
"everything")
1369 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1371 else if (
Value ==
"no-everything")
1381 InitializeResultPattern(A,
".*");
1383 }
else if (A->getOption().matches(OptEQ)) {
1385 if (!InitializeResultPattern(A, A->getValue()))
1394 const std::vector<std::string> &Levels,
1398 for (
const auto &Level : Levels) {
1400 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1408 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1416 const std::vector<std::string> &Sanitizers,
1418 for (
const auto &Sanitizer : Sanitizers) {
1421 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1435 const std::vector<std::string> &Sanitizers,
1438 for (
const auto &Sanitizer : Sanitizers) {
1440 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1449 llvm::SplitString(Bundle, BundleParts,
",");
1450 for (
const auto &B : BundleParts) {
1454 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1468 llvm::raw_string_ostream OS(Buffer);
1469 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1475 const llvm::Triple &Triple) {
1476 assert(Triple.getArch() == llvm::Triple::aarch64);
1483 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1484 : Discrimination::None);
1487 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1488 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1489 : Discrimination::None);
1491 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1499 if (
LangOpts.PointerAuthVTTVTPtrDiscrimination)
1501 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1502 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1503 : Discrimination::None);
1519 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1538 if (
LangOpts.PointerAuthObjcClassROPointers)
1551 const llvm::Triple &Triple,
1553 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1554 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1555 !LangOpts.AArch64JumpTableHardening)
1561void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1563 const llvm::Triple &
T,
1564 const std::string &OutputFile,
1568 if (Opts.OptimizationLevel == 0)
1571 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1573#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1574 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1575#include "clang/Options/Options.inc"
1576#undef CODEGEN_OPTION_WITH_MARSHALLING
1578 if (Opts.OptimizationLevel > 0) {
1582 GenerateArg(Consumer, OPT_finline_hint_functions);
1587 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1588 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1589 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1590 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1592 std::optional<StringRef> DebugInfoVal;
1593 switch (Opts.DebugInfo) {
1594 case llvm::codegenoptions::DebugLineTablesOnly:
1595 DebugInfoVal =
"line-tables-only";
1597 case llvm::codegenoptions::DebugDirectivesOnly:
1598 DebugInfoVal =
"line-directives-only";
1600 case llvm::codegenoptions::DebugInfoConstructor:
1601 DebugInfoVal =
"constructor";
1603 case llvm::codegenoptions::LimitedDebugInfo:
1604 DebugInfoVal =
"limited";
1606 case llvm::codegenoptions::FullDebugInfo:
1607 DebugInfoVal =
"standalone";
1609 case llvm::codegenoptions::UnusedTypeInfo:
1610 DebugInfoVal =
"unused-types";
1612 case llvm::codegenoptions::NoDebugInfo:
1613 DebugInfoVal = std::nullopt;
1615 case llvm::codegenoptions::LocTrackingOnly:
1616 DebugInfoVal = std::nullopt;
1620 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1624 Prefix.first +
"=" + Prefix.second);
1627 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1628 Prefix.first +
"=" + Prefix.second);
1630 if (Opts.NewStructPathTBAA)
1633 if (Opts.OptimizeSize == 1)
1635 else if (Opts.OptimizeSize == 2)
1643 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1645 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1648 if (Opts.InterchangeLoops)
1654 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1659 if (Opts.DebugNameTable ==
1660 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1662 else if (Opts.DebugNameTable ==
1663 static_cast<unsigned>(
1664 llvm::DICompileUnit::DebugNameTableKind::Default))
1667 if (Opts.DebugTemplateAlias)
1670 auto TNK = Opts.getDebugSimpleTemplateNames();
1671 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1672 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1673 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1674 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1675 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1680 if (Opts.TimePasses) {
1681 if (Opts.TimePassesPerRun)
1682 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1686 if (Opts.TimePassesJson)
1690 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1693 if (Opts.PrepareForThinLTO)
1703 GenerateArg(Consumer, OPT_save_dynamic_debugging_temps);
1705 StringRef MemProfileBasename(
"memprof.profraw");
1726 std::string InstrBundle =
1728 if (!InstrBundle.empty())
1729 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1732 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1733 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1734 else if (Opts.CFProtectionReturn)
1735 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1736 else if (Opts.CFProtectionBranch)
1737 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1739 if (Opts.CFProtectionBranch) {
1740 switch (Opts.getCFBranchLabelScheme()) {
1743#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1744 case CFBranchLabelSchemeKind::Kind: \
1745 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1747#include "clang/Basic/CFProtectionOptions.def"
1751 if (Opts.FunctionReturnThunks)
1752 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1755 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1756 F.PropagateAttrs && F.Internalize;
1758 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1762 if (Opts.EmulatedTLS)
1770 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1775 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1779 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1783 if (Opts.XCOFFReadOnlyPointers)
1801 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1806 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1810 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1813 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1815 for (StringRef Sanitizer :
1817 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1819 SmallVector<std::string, 4> Values;
1821 for (std::string Sanitizer : Values)
1822 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1825 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1829 for (StringRef Sanitizer :
1831 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1833 if (!Opts.EmitVersionIdentMetadata)
1836 switch (Opts.FiniteLoops) {
1847 if (Opts.StaticClosure)
1851bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1854 const llvm::Triple &
T,
1855 const std::string &OutputFile,
1866 const LangOptions *
LangOpts = &LangOptsRef;
1868#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1869 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1870#include "clang/Options/Options.inc"
1871#undef CODEGEN_OPTION_WITH_MARSHALLING
1875 if (Opts.OptimizationLevel == 0) {
1877 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1878 options::OPT_finline_hint_functions,
1879 options::OPT_fno_inline_functions,
1880 options::OPT_fno_inline)) {
1883 if (A->getOption().matches(options::OPT_finline_functions))
1885 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1895 Opts.DirectAccessExternalData =
1896 Args.hasArg(OPT_fdirect_access_external_data) ||
1897 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1900 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1902 llvm::StringSwitch<unsigned>(A->getValue())
1903 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1904 .Case(
"line-directives-only",
1905 llvm::codegenoptions::DebugDirectivesOnly)
1906 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1907 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1908 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1909 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1912 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1915 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1921 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1922 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1923 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1924 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1925 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1926 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1927 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1930 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1931 auto Split = StringRef(Arg).split(
'=');
1935 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1936 auto Split = StringRef(Arg).split(
'=');
1941 T.supportsDebugEntryValues())
1942 Opts.EmitCallSiteInfo =
true;
1945 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1950 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1951 Args.hasArg(OPT_new_struct_path_tbaa);
1953 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1954 if (Opts.SimplifyLibCalls)
1957 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1958 (Opts.OptimizationLevel > 1));
1961 Opts.InterchangeLoops =
1962 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
true);
1963 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1964 OPT_fno_experimental_loop_fusion,
false);
1966 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1968 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1970 Opts.DebugNameTable =
static_cast<unsigned>(
1971 Args.hasArg(OPT_ggnu_pubnames)
1972 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1973 : Args.hasArg(OPT_gpubnames)
1974 ? llvm::DICompileUnit::DebugNameTableKind::Default
1975 : llvm::DICompileUnit::DebugNameTableKind::None);
1976 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1977 StringRef
Value = A->getValue();
1979 Diags.
Report(diag::err_drv_unsupported_option_argument)
1980 << A->getSpelling() << A->getValue();
1981 Opts.setDebugSimpleTemplateNames(
1982 StringRef(A->getValue()) ==
"simple"
1983 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1984 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1987 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1988 OPT_stats_file_timers)) {
1989 Opts.TimePasses =
true;
1992 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1993 StringRef Val =
EQ->getValue();
1994 if (Val ==
"per-pass")
1995 Opts.TimePassesPerRun =
false;
1996 else if (Val ==
"per-pass-run")
1997 Opts.TimePassesPerRun =
true;
1999 Diags.
Report(diag::err_drv_invalid_value)
2000 <<
EQ->getAsString(Args) <<
EQ->getValue();
2003 if (Args.getLastArg(OPT_ftime_report_json))
2004 Opts.TimePassesJson =
true;
2007 Opts.PrepareForLTO =
false;
2008 Opts.PrepareForThinLTO =
false;
2009 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
2010 Opts.PrepareForLTO =
true;
2011 StringRef S = A->getValue();
2013 Opts.PrepareForThinLTO =
true;
2014 else if (S !=
"full")
2015 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
2016 if (Args.hasArg(OPT_funified_lto))
2017 Opts.PrepareForThinLTO =
true;
2019 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2021 Diags.
Report(diag::err_drv_argument_only_allowed_with)
2022 << A->getAsString(Args) <<
"-x ir";
2024 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2026 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2028 llvm::StringSwitch<std::string>(A->getValue())
2029 .Case(
"obj", OutputFile)
2030 .Default(llvm::sys::path::filename(OutputFile).str());
2032 if (Args.getLastArg(OPT_save_dynamic_debugging_temps))
2036 const char *MemProfileBasename =
"memprof.profraw";
2037 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2038 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2039 llvm::sys::path::append(Path, MemProfileBasename);
2041 }
else if (Args.hasArg(OPT_fmemory_profile))
2045 if (Args.hasArg(OPT_coverage_version_EQ)) {
2046 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2047 if (CoverageVersion.size() != 4) {
2048 Diags.
Report(diag::err_drv_invalid_value)
2049 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2059 for (
const auto &A : Args) {
2061 if (A->getOption().getID() == options::OPT_o ||
2062 A->getOption().getID() == options::OPT_INPUT ||
2063 A->getOption().getID() == options::OPT_x ||
2064 A->getOption().getID() == options::OPT_fembed_bitcode ||
2065 A->getOption().matches(options::OPT_W_Group))
2068 A->render(Args, ASL);
2069 for (
const auto &arg : ASL) {
2070 StringRef ArgStr(arg);
2071 llvm::append_range(Opts.
CmdArgs, ArgStr);
2077 auto XRayInstrBundles =
2078 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2079 if (XRayInstrBundles.empty())
2082 for (
const auto &A : XRayInstrBundles)
2086 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2087 StringRef Name = A->getValue();
2088 if (Name ==
"full") {
2089 Opts.CFProtectionReturn = 1;
2090 Opts.CFProtectionBranch = 1;
2091 }
else if (Name ==
"return")
2092 Opts.CFProtectionReturn = 1;
2093 else if (Name ==
"branch")
2094 Opts.CFProtectionBranch = 1;
2095 else if (Name !=
"none")
2096 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2099 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2100 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2102 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2103#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2104 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2105#include "clang/Basic/CFProtectionOptions.def"
2108 Opts.setCFBranchLabelScheme(Scheme);
2110 Diags.
Report(diag::err_drv_invalid_value)
2111 << A->getAsString(Args) << A->getValue();
2115 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2116 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2117 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2118 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2119 .Default(llvm::FunctionReturnThunksKind::Invalid);
2122 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2123 << A->getSpelling() <<
T.getTriple();
2124 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2125 Diags.
Report(diag::err_drv_invalid_value)
2126 << A->getAsString(Args) << A->getValue();
2127 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2128 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2129 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2130 << A->getAsString(Args)
2131 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2133 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2137 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2138 CodeGenOptions::BitcodeFileToLink F;
2140 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2141 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2150 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2151 StringRef Val = A->getValue();
2155 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2158 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2159 StringRef Val = A->getValue();
2162 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2168 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2169 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2173 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2174 << A->getSpelling() <<
T.str();
2176 const Option &O = A->getOption();
2177 if (O.matches(OPT_fpcc_struct_return) ||
2178 O.matches(OPT_maix_struct_return)) {
2181 assert(O.matches(OPT_freg_struct_return) ||
2182 O.matches(OPT_msvr4_struct_return));
2187 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2189 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2190 << A->getSpelling() <<
T.str();
2200 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2201 Diags.
Report(diag::err_roptr_requires_data_sections);
2203 Opts.XCOFFReadOnlyPointers =
true;
2206 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2207 if (!
T.isOSAIX() ||
T.isPPC32())
2208 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2209 << A->getSpelling() <<
T.str();
2212 bool NeedLocTracking =
false;
2215 NeedLocTracking =
true;
2217 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2219 NeedLocTracking =
true;
2222 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2224 NeedLocTracking =
true;
2234 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2244 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2247 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2248 <<
"-fdiagnostics-show-hotness";
2252 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2254 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2257 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2258 <<
"-fdiagnostics-hotness-threshold=";
2264 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2265 <<
"-fdiagnostics-hotness-threshold=";
2270 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2274 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2275 <<
"-fdiagnostics-misexpect-tolerance=";
2281 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2282 <<
"-fdiagnostics-misexpect-tolerance=";
2289 if (UsingSampleProfile)
2290 NeedLocTracking =
true;
2293 NeedLocTracking =
true;
2297 if (NeedLocTracking &&
2298 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2299 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2304 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2307 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2310 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2315 "-fsanitize-skip-hot-cutoff=",
2316 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2319 "-fsanitize-annotate-debug-info=",
2320 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2324 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2327 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2328 Diags.
Report(diag::err_drv_invalid_value)
2329 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2335 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2340 if (Args.hasArg(options::OPT_ffinite_loops))
2342 else if (Args.hasArg(options::OPT_fno_finite_loops))
2345 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2346 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2347 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2348 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2350 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2356 Diags.
Report(diag::err_drv_invalid_escaped_command_line)
2357 << llvm::toString(ParsedArgs.takeError());
2368#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2369 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2370#include "clang/Options/Options.inc"
2371#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2376 for (
const auto &Dep : Opts.
ExtraDeps) {
2377 switch (Dep.second) {
2390 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2399 bool ShowLineMarkers) {
2403#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2404 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2405#include "clang/Options/Options.inc"
2406#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2408 if (Args.hasArg(OPT_show_includes)) {
2423 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2424 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2425 StringRef Val = A->getValue();
2426 if (!Val.contains(
'='))
2430 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2431 StringRef Val = A->getValue();
2432 if (!Val.contains(
'='))
2439 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2443 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2447 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2448 StringRef Val = A->getValue();
2449 if (!Val.contains(
'='))
2457 if (Args.hasArg(OPT_header_include_format_EQ))
2458 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2462 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2466 if (Args.hasArg(OPT_header_include_filtering_EQ))
2467 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2471 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2479 bool DefaultColor) {
2486 for (
auto *A : Args) {
2487 const Option &O = A->getOption();
2488 if (O.matches(options::OPT_fcolor_diagnostics)) {
2490 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2492 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2493 StringRef
Value(A->getValue());
2494 if (
Value ==
"always")
2496 else if (
Value ==
"never")
2498 else if (
Value ==
"auto")
2508 for (
const auto &Prefix : VerifyPrefixes) {
2511 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2514 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2516 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2517 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2527#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2528 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2529#include "clang/Options/Options.inc"
2530#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2539#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2540 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2541#include "clang/Options/Options.inc"
2542#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2550#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2551 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2552#include "clang/Options/Options.inc"
2553#undef MIGRATOR_OPTION_WITH_MARSHALLING
2562#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2563 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2564#include "clang/Options/Options.inc"
2565#undef MIGRATOR_OPTION_WITH_MARSHALLING
2570void CompilerInvocationBase::GenerateDiagnosticArgs(
2572 bool DefaultDiagColor) {
2574#define DIAG_OPTION_WITH_MARSHALLING(...) \
2575 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2576#include "clang/Options/Options.inc"
2577#undef DIAG_OPTION_WITH_MARSHALLING
2580 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2583 switch (Opts.getShowColors()) {
2594 if (Opts.VerifyDiagnostics &&
2599 if (Prefix !=
"expected")
2602 if (Opts.VerifyDirectives) {
2610 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2613 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2615 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2617 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2619 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2624 if (
Warning ==
"undef-prefix")
2627 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2629 Consumer(StringRef(
"-W") +
Warning);
2635 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2636 "pass-analysis",
"no-pass-analysis",
2637 "pass-missed",
"no-pass-missed"};
2638 if (llvm::is_contained(IgnoredRemarks,
Remark))
2641 Consumer(StringRef(
"-R") +
Remark);
2645 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2650std::unique_ptr<DiagnosticOptions>
2652 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2653 unsigned MissingArgIndex, MissingArgCount;
2655 Argv.slice(1), MissingArgIndex, MissingArgCount);
2657 bool ShowColors =
true;
2658 if (std::optional<std::string> NoColor =
2659 llvm::sys::Process::GetEnv(
"NO_COLOR");
2660 NoColor && !NoColor->empty()) {
2675 bool DefaultDiagColor) {
2676 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2677 std::optional<DiagnosticsEngine> IgnoringDiags;
2679 IgnoringDiagOpts.emplace();
2682 Diags = &*IgnoringDiags;
2691#define DIAG_OPTION_WITH_MARSHALLING(...) \
2692 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2693#include "clang/Options/Options.inc"
2694#undef DIAG_OPTION_WITH_MARSHALLING
2696 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2699 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2703 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2704 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2706 if (Args.hasArg(OPT_verify))
2711 Opts.VerifyDiagnostics =
false;
2716 "-verify-ignore-unexpected=",
2717 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2718 if (Args.hasArg(OPT_verify_ignore_unexpected))
2720 Opts.setVerifyIgnoreUnexpected(DiagMask);
2722 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2727 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2738 unsigned DefaultOpt = 0;
2741 !Args.hasArg(OPT_cl_opt_disable))
2744 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2745 if (A->getOption().matches(options::OPT_O0))
2748 if (A->getOption().matches(options::OPT_Ofast) ||
2749 A->getOption().matches(options::OPT_O4))
2752 assert(A->getOption().matches(options::OPT_O));
2754 StringRef S(A->getValue());
2755 if (S ==
"s" || S ==
"z")
2764 unsigned MaxOptLevel = 3;
2765 if (DefaultOpt > MaxOptLevel) {
2768 Diags.
Report(diag::warn_drv_optimization_value)
2769 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2770 DefaultOpt = MaxOptLevel;
2777 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2778 if (A->getOption().matches(options::OPT_O)) {
2779 switch (A->getValue()[0]) {
2797 std::string &BlockName,
2798 unsigned &MajorVersion,
2799 unsigned &MinorVersion,
2801 std::string &UserInfo) {
2803 Arg.split(Args,
':', 5);
2804 if (Args.size() < 5)
2807 BlockName = std::string(Args[0]);
2808 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2809 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2810 if (Args[3].getAsInteger(2, Hashed))
return true;
2811 if (Args.size() > 4)
2812 UserInfo = std::string(Args[4]);
2821 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2853 OPT_emit_reduced_module_interface},
2869 OPT_print_dependency_directives_minimized_source},
2876static std::optional<frontend::ActionKind>
2879 if (ActionOpt.second == Opt.getID())
2880 return ActionOpt.first;
2882 return std::nullopt;
2886static std::optional<OptSpecifier>
2889 if (ActionOpt.first == ProgramAction)
2890 return OptSpecifier(ActionOpt.second);
2892 return std::nullopt;
2898#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2899 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2900#include "clang/Options/Options.inc"
2901#undef FRONTEND_OPTION_WITH_MARSHALLING
2903 std::optional<OptSpecifier> ProgramActionOpt =
2911 if (!ProgramActionOpt) {
2914 "Frontend action without option.");
2915 GenerateProgramAction = [&]() {
2922 GenerateProgramAction = [&]() {
2930 llvm_unreachable(
"Default AST dump format.");
2937 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2950 GenerateProgramAction = [&]() {
2955 GenerateProgramAction();
2957 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2959 for (
const auto &PluginArg : PluginArgs.second)
2961 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2962 Opt.getKind(), 0, PluginArg);
2966 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2967 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2973 for (
const auto &Plugin : Opts.
Plugins)
2979 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2992 StringRef HeaderUnit =
"";
2997 HeaderUnit =
"-user";
3000 HeaderUnit =
"-system";
3003 HeaderUnit =
"-header-unit";
3006 StringRef Header = IsHeader ?
"-header" :
"";
3029 Lang =
"objective-c";
3032 Lang =
"objective-c++";
3035 Lang =
"assembler-with-cpp";
3039 "Generating -x argument for unknown language (not precompiled).");
3054 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3058 for (
const auto &Input : Opts.
Inputs)
3059 Consumer(Input.getFile());
3068#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3069 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3070#include "clang/Options/Options.inc"
3071#undef FRONTEND_OPTION_WITH_MARSHALLING
3074 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3075 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3077 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3080 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3081 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3084 .Default(std::numeric_limits<unsigned>::max());
3086 if (Val != std::numeric_limits<unsigned>::max())
3089 Diags.
Report(diag::err_drv_invalid_value)
3090 << A->getAsString(Args) << A->getValue();
3100 Args.hasArg(OPT_interface_stub_version_EQ)
3101 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3103 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3104 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3105 ArgStr ==
"experimental-tapi-elf-v1") {
3106 std::string ErrorMessage =
3107 "Invalid interface stub format: " + ArgStr.str() +
3109 Diags.
Report(diag::err_drv_invalid_value)
3110 <<
"Must specify a valid interface stub format type, ie: "
3111 "-interface-stub-version=ifs-v1"
3114 }
else if (!ArgStr.starts_with(
"ifs-")) {
3115 std::string ErrorMessage =
3116 "Invalid interface stub format: " + ArgStr.str() +
".";
3117 Diags.
Report(diag::err_drv_invalid_value)
3118 <<
"Must specify a valid interface stub format type, ie: "
3119 "-interface-stub-version=ifs-v1"
3134 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3135 const Arg *SavedAction =
nullptr;
3136 for (
const Arg *AA :
3137 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3138 if (AA->getOption().matches(OPT_main_file_name)) {
3139 SavedAction =
nullptr;
3140 }
else if (!SavedAction) {
3143 if (!A->getOption().matches(OPT_ast_dump_EQ))
3144 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3145 << SavedAction->getSpelling() << A->getSpelling();
3152 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3153 Opts.
Plugins.emplace_back(A->getValue(0));
3157 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3158 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3160 for (
const std::string &Arg :
3161 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3162 std::string BlockName;
3163 unsigned MajorVersion;
3164 unsigned MinorVersion;
3166 std::string UserInfo;
3168 MinorVersion, Hashed, UserInfo)) {
3169 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3176 std::make_shared<TestModuleFileExtension>(
3177 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3180 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3184 Diags.
Report(diag::err_drv_invalid_value)
3185 << A->getAsString(Args) << A->getValue();
3186 Diags.
Report(diag::note_command_line_code_loc_requirement);
3190 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3191 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3192 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3194 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3195 StringRef Val = A->getValue();
3196 if (!Val.contains(
'='))
3201 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3203 if (Args.hasArg(OPT_emit_cir, OPT_emit_cir_bc))
3207 if (Args.hasArg(OPT_clangir_disable_passes))
3210 if (Args.hasArg(OPT_clangir_disable_verifier))
3213 if (Args.hasArg(OPT_clangir_lib_opt) || Args.hasArg(OPT_clangir_lib_opt_EQ))
3217 if (Args.hasArg(OPT_aux_target_cpu))
3218 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3219 if (Args.hasArg(OPT_aux_target_feature))
3223 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3224 StringRef XValue = A->getValue();
3229 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3230 bool ModuleMap = XValue.consume_back(
"-module-map");
3233 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3239 if (IsHeader || Preprocessed) {
3240 if (XValue.consume_back(
"-header-unit"))
3242 else if (XValue.consume_back(
"-system"))
3244 else if (XValue.consume_back(
"-user"))
3250 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3254 DashX = llvm::StringSwitch<InputKind>(XValue)
3270 DashX = llvm::StringSwitch<InputKind>(XValue)
3278 DashX = llvm::StringSwitch<InputKind>(XValue)
3281 .Cases({
"ast",
"pcm",
"precompiled-header"},
3288 Diags.
Report(diag::err_drv_invalid_value)
3289 << A->getAsString(Args) << A->getValue();
3296 IsHeaderFile =
true;
3297 }
else if (IsHeaderFile)
3304 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3307 Inputs.push_back(
"-");
3311 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3313 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3317 StringRef(Inputs[i]).rsplit(
'.').second);
3326 bool IsSystem =
false;
3335 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3352 Diags.
Report(diag::err_fe_cir_not_built);
3362#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3363 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3364#include "clang/Options/Options.inc"
3365#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3374 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3380 GenerateArg(Consumer, OPT_fmodules_ignore_search_path, Path.val());
3384 std::optional<bool> IsFramework,
3385 std::optional<bool> IgnoreSysRoot) {
3386 return llvm::is_contained(Groups, Entry.
Group) &&
3387 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3388 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3397 OptSpecifier Opt = [It, Matches]() {
3402 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3416 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3423 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3429 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3434 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3442 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3444 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3454 ? OPT_internal_isystem
3455 : OPT_internal_externc_isystem;
3459 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3461 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3465 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3466 : OPT_no_system_header_prefix;
3480#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3481 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3482#include "clang/Options/Options.inc"
3483#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3485 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3486 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3489 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3490 StringRef Val = A->getValue();
3491 if (Val.contains(
'=')) {
3492 auto Split = Val.split(
'=');
3494 std::string(Split.first), std::string(Split.second));
3497 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3500 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3501 StringRef MacroDef = A->getValue();
3503 llvm::CachedHashString(MacroDef.split(
'=').first));
3506 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_search_path))
3510 bool IsSysrootSpecified =
3511 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3515 auto PrefixHeaderPath = [IsSysrootSpecified,
3516 &Opts](
const llvm::opt::Arg *A,
3517 bool IsFramework =
false) -> std::string {
3518 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3519 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3521 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3522 llvm::StringRef(A->getValue()).substr(1));
3523 return std::string(Buffer);
3525 return A->getValue();
3528 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3529 bool IsFramework = A->getOption().matches(OPT_F);
3535 StringRef Prefix =
"";
3536 for (
const auto *A :
3537 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3538 if (A->getOption().matches(OPT_iprefix))
3539 Prefix = A->getValue();
3540 else if (A->getOption().matches(OPT_iwithprefix))
3546 for (
const auto *A : Args.filtered(OPT_idirafter))
3548 for (
const auto *A : Args.filtered(OPT_iquote))
3551 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3552 if (A->getOption().matches(OPT_iwithsysroot)) {
3559 for (
const auto *A : Args.filtered(OPT_iframework))
3561 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3566 for (
const auto *A : Args.filtered(OPT_c_isystem))
3568 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3570 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3572 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3576 for (
const auto *A :
3577 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3579 if (A->getOption().matches(OPT_internal_externc_isystem))
3581 Opts.
AddPath(A->getValue(), Group,
false,
true);
3583 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3587 for (
const auto *A :
3588 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3590 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3592 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3601 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3605 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3610 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3612 diags.
Report(diag::err_drv_invalid_value)
3613 << A->getAsString(Args) << A->getValue();
3615 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3621 if (Opts.PointerAuthIntrinsics)
3623 if (Opts.PointerAuthCalls)
3625 if (Opts.PointerAuthReturns)
3627 if (Opts.PointerAuthIndirectGotos)
3628 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3629 if (Opts.PointerAuthAuthTraps)
3631 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3632 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3633 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3634 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3635 if (Opts.PointerAuthVTTVTPtrDiscrimination)
3636 GenerateArg(Consumer, OPT_fptrauth_vtt_vtable_pointer_discrimination);
3637 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3638 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3639 if (Opts.PointerAuthFunctionTypeDiscrimination)
3640 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3641 if (Opts.PointerAuthInitFini)
3643 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3644 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3645 if (Opts.PointerAuthELFGOT)
3647 if (Opts.AArch64JumpTableHardening)
3648 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3649 if (Opts.PointerAuthObjcIsa)
3651 if (Opts.PointerAuthObjcInterfaceSel)
3652 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3653 if (Opts.PointerAuthObjcClassROPointers)
3654 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3655 if (Opts.PointerAuthBlockDescriptorPointers)
3656 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3661 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3662 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3663 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3664 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3665 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3666 Opts.PointerAuthVTPtrAddressDiscrimination =
3667 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3668 Opts.PointerAuthVTPtrTypeDiscrimination =
3669 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3670 Opts.PointerAuthVTTVTPtrDiscrimination =
3671 Args.hasArg(OPT_fptrauth_vtt_vtable_pointer_discrimination);
3672 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3673 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3674 Opts.PointerAuthFunctionTypeDiscrimination =
3675 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3676 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3677 Opts.PointerAuthInitFiniAddressDiscrimination =
3678 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3679 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3680 Opts.AArch64JumpTableHardening =
3681 Args.hasArg(OPT_faarch64_jump_table_hardening);
3682 Opts.PointerAuthBlockDescriptorPointers =
3683 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3684 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3685 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3686 Opts.PointerAuthObjcInterfaceSel =
3687 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3689 if (Opts.PointerAuthObjcInterfaceSel)
3690 Opts.PointerAuthObjcInterfaceSelKey =
3701 llvm_unreachable(
"should not parse language flags for this input");
3736 llvm_unreachable(
"unexpected input language");
3745 return "Objective-C";
3749 return "Objective-C++";
3753 return "C++ for OpenCL";
3772 llvm_unreachable(
"unknown input language");
3775void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3777 const llvm::Triple &
T,
3782 if (Opts.ObjCAutoRefCount)
3784 if (Opts.PICLevel != 0)
3785 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3789 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3790 for (StringRef Sanitizer :
3792 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3798 OptSpecifier StdOpt;
3800 case LangStandard::lang_opencl10:
3801 case LangStandard::lang_opencl11:
3802 case LangStandard::lang_opencl12:
3803 case LangStandard::lang_opencl20:
3804 case LangStandard::lang_opencl30:
3805 case LangStandard::lang_openclcpp10:
3806 case LangStandard::lang_openclcpp2021:
3807 StdOpt = OPT_cl_std_EQ;
3810 StdOpt = OPT_std_EQ;
3815 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3817 if (Opts.IncludeDefaultHeader)
3818 GenerateArg(Consumer, OPT_finclude_default_header);
3819 if (Opts.DeclareOpenCLBuiltins)
3820 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3822 const LangOptions *
LangOpts = &Opts;
3824#define LANG_OPTION_WITH_MARSHALLING(...) \
3825 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3826#include "clang/Options/Options.inc"
3827#undef LANG_OPTION_WITH_MARSHALLING
3838 else if (Opts.ObjCAutoRefCount == 1)
3841 if (Opts.ObjCWeakRuntime)
3842 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3847 if (Opts.ObjCSubscriptingLegacyRuntime)
3848 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3851 if (Opts.GNUCVersion != 0) {
3852 unsigned Major = Opts.GNUCVersion / 100 / 100;
3853 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3854 unsigned Patch = Opts.GNUCVersion % 100;
3856 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3859 if (Opts.IgnoreXCOFFVisibility)
3860 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3866 if (!Opts.MSVCCompat)
3868 }
else if (Opts.MSVCCompat) {
3871 if (Opts.PointerOverflowDefined)
3874 if (Opts.MSCompatibilityVersion != 0) {
3875 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3876 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3877 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3878 GenerateArg(Consumer, OPT_fms_compatibility_version,
3879 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3882 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3884 if (!Opts.Trigraphs)
3891 if (
T.isOSzOS() && !Opts.ZOSExt)
3893 else if (Opts.ZOSExt)
3896 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3899 if (Opts.ConvergentFunctions)
3902 GenerateArg(Consumer, OPT_fno_convergent_functions);
3904 if (Opts.NoBuiltin && !Opts.Freestanding)
3907 if (!Opts.NoBuiltin)
3911 if (Opts.LongDoubleSize == 128)
3913 else if (Opts.LongDoubleSize == 64)
3915 else if (Opts.LongDoubleSize == 80)
3922 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3925 if (Opts.OpenMP != 51)
3926 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3928 if (!Opts.OpenMPUseTLS)
3931 if (Opts.OpenMPIsTargetDevice)
3932 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3934 if (Opts.OpenMPIRBuilder)
3935 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3938 if (Opts.OpenMPSimd) {
3941 if (Opts.OpenMP != 51)
3942 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3945 if (Opts.OpenMPThreadSubscription)
3946 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3948 if (Opts.OpenMPTeamSubscription)
3949 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3951 if (Opts.OpenMPTargetDebug != 0)
3952 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3953 Twine(Opts.OpenMPTargetDebug));
3955 if (Opts.OpenMPCUDANumSMs != 0)
3956 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3957 Twine(Opts.OpenMPCUDANumSMs));
3959 if (Opts.OpenMPCUDABlocksPerSM != 0)
3960 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3961 Twine(Opts.OpenMPCUDABlocksPerSM));
3964 std::string Targets;
3965 llvm::raw_string_ostream
OS(Targets);
3968 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3969 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3972 if (Opts.OpenMPCUDAMode)
3988 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3991 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3992 for (StringRef Sanitizer :
3994 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3998 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
4000 switch (Opts.getClangABICompat()) {
4001#define ABI_VER_MAJOR_MINOR(Major, Minor) \
4002 case LangOptions::ClangABI::Ver##Major##_##Minor: \
4003 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
4005#define ABI_VER_MAJOR(Major) \
4006 case LangOptions::ClangABI::Ver##Major: \
4007 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
4009#define ABI_VER_LATEST(Latest) \
4010 case LangOptions::ClangABI::Latest: \
4012#include "clang/Basic/ABIVersions.def"
4015 if (Opts.getSignReturnAddressScope() ==
4017 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
4018 else if (Opts.getSignReturnAddressScope() ==
4020 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
4022 if (Opts.getSignReturnAddressKey() ==
4024 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
4030 if (Opts.RelativeCXXABIVTables)
4031 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
4033 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
4041 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
4051 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
4052 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
4055 if (Opts.MatrixTypes) {
4056 if (Opts.getDefaultMatrixMemoryLayout() ==
4058 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
4059 if (Opts.getDefaultMatrixMemoryLayout() ==
4061 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4065bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4067 std::vector<std::string> &Includes,
4077 if (Args.hasArg(OPT_fobjc_arc))
4078 Opts.ObjCAutoRefCount = 1;
4082 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4086 "-fsanitize-ignore-for-ubsan-feature=",
4087 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4098 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4101 Diags.
Report(diag::err_drv_invalid_value)
4102 << A->getAsString(Args) << A->getValue();
4104 for (
unsigned KindValue = 0;
4110 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4112 unsigned NumAliases = 0;
4113#define LANGSTANDARD(id, name, lang, desc, features, version)
4114#define LANGSTANDARD_ALIAS(id, alias) \
4115 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4116#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4117#include "clang/Basic/LangStandards.def"
4119#define LANGSTANDARD(id, name, lang, desc, features, version)
4120#define LANGSTANDARD_ALIAS(id, alias) \
4121 if (KindValue == LangStandard::lang_##id) Diag << alias;
4122#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4123#include "clang/Basic/LangStandards.def"
4131 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4139 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4141 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4142 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4143 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4144 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4145 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4146 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4147 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4148 .Cases({
"cl3.1",
"CL3.1"}, LangStandard::lang_opencl31)
4149 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4150 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4151 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4155 Diags.
Report(diag::err_drv_invalid_value)
4156 << A->getAsString(Args) << A->getValue();
4159 LangStd = OpenCLLangStd;
4163 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4164 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4172#define LANG_OPTION_WITH_MARSHALLING(...) \
4173 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4174#include "clang/Options/Options.inc"
4175#undef LANG_OPTION_WITH_MARSHALLING
4180 Opts.Modules = Opts.ClangModules || Opts.CPlusPlusModules;
4182 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4183 StringRef Name = A->getValue();
4184 if (Name ==
"full") {
4185 Opts.CFProtectionBranch = 1;
4186 Opts.CFProtectionReturn = 1;
4187 }
else if (Name ==
"branch") {
4188 Opts.CFProtectionBranch = 1;
4189 }
else if (Name ==
"return") {
4190 Opts.CFProtectionReturn = 1;
4194 if (Opts.CFProtectionBranch) {
4195 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4197 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4198#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4199 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4200#include "clang/Basic/CFProtectionOptions.def"
4202 Opts.setCFBranchLabelScheme(Scheme);
4206 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4207 !Args.hasArg(OPT_sycl_std_EQ)) {
4217 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4218 StringRef value =
arg->getValue();
4220 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4223 if (Args.hasArg(OPT_fobjc_gc_only))
4225 else if (Args.hasArg(OPT_fobjc_gc))
4227 else if (Args.hasArg(OPT_fobjc_arc)) {
4228 Opts.ObjCAutoRefCount = 1;
4230 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4237 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4238 Opts.ObjCWeakRuntime = 1;
4244 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4245 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4246 assert(!Opts.ObjCWeak);
4248 Diags.
Report(diag::err_objc_weak_with_gc);
4249 }
else if (!Opts.ObjCWeakRuntime) {
4250 Diags.
Report(diag::err_objc_weak_unsupported);
4254 }
else if (Opts.ObjCAutoRefCount) {
4255 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4258 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4259 Opts.ObjCSubscriptingLegacyRuntime =
4263 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4266 VersionTuple GNUCVer;
4267 bool Invalid = GNUCVer.tryParse(A->getValue());
4268 unsigned Major = GNUCVer.getMajor();
4269 unsigned Minor = GNUCVer.getMinor().value_or(0);
4270 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4271 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4272 Diags.
Report(diag::err_drv_invalid_value)
4273 << A->getAsString(Args) << A->getValue();
4275 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4278 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4279 Opts.IgnoreXCOFFVisibility = 1;
4281 if (Args.hasArg(OPT_ftrapv)) {
4285 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4286 }
else if (Args.hasFlag(OPT_fwrapv, OPT_fno_wrapv, Opts.MSVCCompat)) {
4289 if (Args.hasArg(OPT_fwrapv_pointer))
4290 Opts.PointerOverflowDefined =
true;
4292 Opts.MSCompatibilityVersion = 0;
4293 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4295 if (VT.tryParse(A->getValue()))
4296 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4298 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4299 VT.getMinor().value_or(0) * 100000 +
4300 VT.getSubminor().value_or(0);
4308 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4311 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4314 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4316 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4317 && Opts.OpenCLVersion == 200);
4319 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4320 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4321 Opts.ConvergentFunctions =
4322 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4323 HasConvergentOperations);
4325 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4326 if (!Opts.NoBuiltin)
4328 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4329 if (A->getOption().matches(options::OPT_mlong_double_64))
4330 Opts.LongDoubleSize = 64;
4331 else if (A->getOption().matches(options::OPT_mlong_double_80))
4332 Opts.LongDoubleSize = 80;
4333 else if (A->getOption().matches(options::OPT_mlong_double_128))
4334 Opts.LongDoubleSize = 128;
4336 Opts.LongDoubleSize = 0;
4338 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4344 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4346 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4347 << A->getSpelling() <<
"-fdefault-calling-conv";
4349 switch (
T.getArch()) {
4350 case llvm::Triple::x86:
4353 case llvm::Triple::m68k:
4357 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4358 << A->getSpelling() <<
T.getTriple();
4364 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4366 bool IsSimdSpecified =
4367 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4369 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4371 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4372 Opts.OpenMPIsTargetDevice =
4373 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4374 Opts.OpenMPIRBuilder =
4375 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4376 bool IsTargetSpecified =
4377 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4379 if (Opts.OpenMP || Opts.OpenMPSimd) {
4381 Args, OPT_fopenmp_version_EQ,
4382 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4383 Opts.OpenMP = Version;
4386 if (!Opts.OpenMPIsTargetDevice) {
4387 switch (
T.getArch()) {
4391 case llvm::Triple::nvptx:
4392 case llvm::Triple::nvptx64:
4393 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4401 if ((Opts.OpenMPIsTargetDevice &&
T.isGPU()) || Opts.OpenCLCPlusPlus) {
4403 Opts.Exceptions = 0;
4404 Opts.CXXExceptions = 0;
4406 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4407 Opts.OpenMPCUDANumSMs =
4409 Opts.OpenMPCUDANumSMs, Diags);
4410 Opts.OpenMPCUDABlocksPerSM =
4412 Opts.OpenMPCUDABlocksPerSM, Diags);
4417 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4418 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4420 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4421 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4422 Opts.OpenMPTargetDebug = 1;
4425 if (Opts.OpenMPIsTargetDevice) {
4426 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4427 Opts.OpenMPTeamSubscription =
true;
4428 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4429 Opts.OpenMPThreadSubscription =
true;
4433 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4434 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4435 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4436 if (
T.isArch16Bit())
4438 if (
T.isArch32Bit())
4440 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4444 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4445 llvm::Triple TT(A->getValue(i));
4447 if (TT.getArch() == llvm::Triple::UnknownArch ||
4448 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4449 TT.getArch() == llvm::Triple::spirv64 ||
4450 TT.getArch() == llvm::Triple::systemz ||
4451 TT.getArch() == llvm::Triple::loongarch64 ||
4452 TT.getArch() == llvm::Triple::nvptx ||
4453 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4454 TT.getArch() == llvm::Triple::x86 ||
4455 TT.getArch() == llvm::Triple::x86_64))
4456 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4457 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4458 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4459 << A->getValue(i) <<
T.str();
4466 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4467 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4468 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4471 if (Args.hasArg(options::OPT_fopenacc))
4472 Opts.OpenACC =
true;
4474 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4475 StringRef Val = A->getValue();
4478 else if (Val ==
"on")
4480 else if (Val ==
"off")
4482 else if (Val ==
"fast-honor-pragmas")
4485 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4489 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4490 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4492 llvm::StringSwitch<unsigned>(A->getValue(i))
4495 .Case(
"add-unsigned-overflow-test",
4497 .Case(
"add-signed-overflow-test",
4500 .Case(
"unsigned-post-decr-while",
4510 "-fsanitize-ignore-for-ubsan-feature=",
4511 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4513 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4514 std::vector<std::string> systemIgnorelists =
4515 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4517 systemIgnorelists.begin(),
4518 systemIgnorelists.end());
4520 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4521 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4523 StringRef Ver = A->getValue();
4524 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4525 int Major, Minor = 0;
4529 if (!VerParts.first.starts_with(
"0") &&
4530 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4531 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4533 ? VerParts.second.size() == 1 &&
4534 !VerParts.second.getAsInteger(10, Minor)
4535 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4537#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4538 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4539 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4541#define ABI_VER_MAJOR(Major_) \
4542 if (Major <= Major_) \
4543 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4545#define ABI_VER_LATEST(Latest) \
4548#include "clang/Basic/ABIVersions.def"
4549 }
else if (Ver !=
"latest") {
4550 Diags.
Report(diag::err_drv_invalid_value)
4551 << A->getAsString(Args) << A->getValue();
4555 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4556 StringRef SignScope = A->getValue();
4558 if (SignScope.equals_insensitive(
"none"))
4559 Opts.setSignReturnAddressScope(
4561 else if (SignScope.equals_insensitive(
"all"))
4562 Opts.setSignReturnAddressScope(
4564 else if (SignScope.equals_insensitive(
"non-leaf"))
4565 Opts.setSignReturnAddressScope(
4568 Diags.
Report(diag::err_drv_invalid_value)
4569 << A->getAsString(Args) << SignScope;
4571 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4572 StringRef SignKey = A->getValue();
4573 if (!SignScope.empty() && !SignKey.empty()) {
4574 if (SignKey ==
"a_key")
4575 Opts.setSignReturnAddressKey(
4577 else if (SignKey ==
"b_key")
4578 Opts.setSignReturnAddressKey(
4581 Diags.
Report(diag::err_drv_invalid_value)
4582 << A->getAsString(Args) << SignKey;
4588 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4595 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4601 Opts.RelativeCXXABIVTables =
4602 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4603 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4607 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4608 Opts.OmitVTableRTTI =
4609 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4610 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4611 if (Opts.OmitVTableRTTI && HasRTTI)
4612 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4614 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4615 auto Split = StringRef(A).split(
'=');
4617 {std::string(
Split.first), std::string(
Split.second)});
4621 !Args.getLastArg(OPT_fno_file_reproducible) &&
4622 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4623 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4624 Args.getLastArg(OPT_ffile_reproducible));
4627 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4629 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4630 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4632 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4634 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4635 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4638 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4639 std::ifstream SeedFile(A->getValue(0));
4641 if (!SeedFile.is_open())
4642 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4648 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4651 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4652 StringRef S = Arg->getValue();
4654 if (S.getAsInteger(0,
Value))
4655 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4660 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4661 StringRef S = Arg->getValue();
4662 if (
auto Mode = getAllocTokenModeFromString(S))
4665 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4669 if (Opts.MatrixTypes) {
4670 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4671 StringRef ClangValue = A->getValue();
4672 if (ClangValue ==
"row-major")
4673 Opts.setDefaultMatrixMemoryLayout(
4676 Opts.setDefaultMatrixMemoryLayout(
4679 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4680 StringRef OptValue = A->getValue();
4681 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4682 ClangValue != OptValue)
4683 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4684 << ClangValue << OptValue;
4693 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4695 enum {
OS, Environment };
4697 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4699 if (
T.getOSName().empty()) {
4700 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4701 << ExpectedOS <<
OS <<
T.str();
4702 }
else if (
T.getEnvironmentName().empty()) {
4703 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4705 }
else if (!
T.isShaderStageEnvironment()) {
4706 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4711 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4712 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4713 << ShaderModel <<
T.getOSName() <<
T.str();
4718 if (Args.getLastArg(OPT_fnative_half_type) ||
4719 Args.getLastArg(OPT_fnative_int16_type)) {
4720 const LangStandard &Std =
4722 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4723 T.getOSVersion() >= VersionTuple(6, 2)))
4724 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4725 <<
"-enable-16bit-types" <<
true << Std.
getName()
4726 <<
T.getOSVersion().getAsString();
4728 }
else if (
T.isSPIRVLogical()) {
4729 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4730 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4731 << VulkanEnv <<
T.getOSName() <<
T.str();
4733 if (Args.getLastArg(OPT_fnative_half_type) ||
4734 Args.getLastArg(OPT_fnative_int16_type)) {
4735 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4736 ?
"-fnative-half-type"
4737 :
"-fnative-int16-type";
4738 const LangStandard &Std =
4740 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4741 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4742 << Str <<
false << Std.
getName();
4745 llvm_unreachable(
"expected DXIL or SPIR-V target");
4748 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4750 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4751 const LangStandard &Requested =
4753 const LangStandard &Recommended =
4755 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4806 llvm_unreachable(
"invalid frontend action");
4851 llvm_unreachable(
"invalid frontend action");
4861#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4862 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4863#include "clang/Options/Options.inc"
4864#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4867 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4870 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4877 for (
const auto &M : Opts.
Macros) {
4880 if (M.first ==
"__CET__=1" && !M.second &&
4881 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4883 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4884 !CodeGenOpts.CFProtectionBranch)
4886 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4887 CodeGenOpts.CFProtectionBranch)
4890 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4893 for (
const auto &I : Opts.
Includes) {
4896 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4897 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4902 if (LangOpts.HLSL && I ==
"hlsl.h")
4912 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4918 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4921 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4935#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4936 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4937#include "clang/Options/Options.inc"
4938#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4940 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4941 Args.hasArg(OPT_pch_through_hdrstop_use);
4943 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4946 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4947 StringRef
Value(A->getValue());
4948 size_t Comma =
Value.find(
',');
4950 unsigned EndOfLine = 0;
4952 if (Comma == StringRef::npos ||
4953 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4954 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4955 Diags.
Report(diag::err_drv_preamble_format);
4963 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4964 if (A->getOption().matches(OPT_D))
4971 for (
const auto *A : Args.filtered(OPT_include))
4972 Opts.
Includes.emplace_back(A->getValue());
4974 for (
const auto *A : Args.filtered(OPT_chain_include))
4977 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4978 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4980 if (Split.second.empty()) {
4981 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4988 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4989 StringRef Epoch = A->getValue();
4993 const uint64_t MaxTimestamp =
4994 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4996 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4997 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4998 << Epoch << MaxTimestamp;
5004 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
5005 StringRef Val = A->getValue();
5016 Args.hasFlag(OPT_fdefine_target_os_macros,
5028#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5029 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5030#include "clang/Options/Options.inc"
5031#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5049#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5050 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5051#include "clang/Options/Options.inc"
5052#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5055 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
5064#define TARGET_OPTION_WITH_MARSHALLING(...) \
5065 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5066#include "clang/Options/Options.inc"
5067#undef TARGET_OPTION_WITH_MARSHALLING
5073 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5095#define TARGET_OPTION_WITH_MARSHALLING(...) \
5096 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5097#include "clang/Options/Options.inc"
5098#undef TARGET_OPTION_WITH_MARSHALLING
5100 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5101 llvm::VersionTuple Version;
5102 if (Version.tryParse(A->getValue()))
5103 Diags.
Report(diag::err_drv_invalid_value)
5104 << A->getAsString(Args) << A->getValue();
5109 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5110 llvm::VersionTuple Version;
5111 if (Version.tryParse(A->getValue()))
5112 Diags.
Report(diag::err_drv_invalid_value)
5113 << A->getAsString(Args) << A->getValue();
5118 if (Arg *A = Args.getLastArg(options::OPT_mxnack, options::OPT_mno_xnack)) {
5119 bool IsEnabled = A->getOption().matches(options::OPT_mxnack);
5126 Args.getLastArg(options::OPT_msramecc, options::OPT_mno_sramecc)) {
5127 bool IsEnabled = A->getOption().matches(options::OPT_msramecc);
5136bool CompilerInvocation::CreateFromArgsImpl(
5144 unsigned MissingArgIndex, MissingArgCount;
5145 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5146 MissingArgCount, VisibilityMask);
5150 if (MissingArgCount)
5151 Diags.
Report(diag::err_drv_missing_argument)
5152 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5155 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5156 auto ArgString = A->getAsString(Args);
5157 std::string Nearest;
5158 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5159 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5161 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5162 << ArgString << Nearest;
5195 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5209 Diags.
Report(diag::warn_drv_openacc_without_cir);
5217 if (!Args.hasArg(options::OPT_triple))
5229 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5230 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5231 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5232 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5245 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5251 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5262 llvm::driver::ProfileInstrKind::ProfileNone)
5263 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5265 llvm::TimeTraceCompression TimeTraceCompress =
5267 if (TimeTraceCompress == llvm::TimeTraceCompression::Infer &&
5269 TimeTraceCompress = llvm::inferTimeTraceCompressionFromPath(
5271 if (TimeTraceCompress == llvm::TimeTraceCompression::Zstd &&
5272 !llvm::compression::zstd::isAvailable())
5273 Diags.
Report(diag::err_drv_time_trace_compression_unavailable) <<
"zstd";
5283 const char *Argv0) {
5289 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5293 Args.push_back(
"-cc1");
5296 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5301 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5314 const unsigned LanguageOptionValues[] = {
5315#define HASH_LANGOPT_Benign(Value)
5316#define HASH_LANGOPT_Compatible(Value) Value,
5317#define HASH_LANGOPT_NotCompatible(Value) Value,
5318#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5319 HASH_LANGOPT_##Compatibility(LangOpts->Name)
5320#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5321 HASH_LANGOPT_##Compatibility(static_cast<unsigned>(LangOpts->get##Name()))
5322#include "clang/Basic/LangOptions.def"
5324#undef HASH_LANGOPT_Benign
5325#undef HASH_LANGOPT_Compatible
5326#undef HASH_LANGOPT_NotCompatible
5329 HBuilder.addRangeElements(LanguageOptionValues);
5334 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5335 HBuilder.add(
getLangOpts().CommentOpts.RetainCommentsFromSystemHeaders);
5352 StringRef MacroDef =
Macro.first;
5354 llvm::CachedHashString(MacroDef.split(
'=').first)))
5358 HBuilder.add(
Macro);
5371 for (
const auto &UserEntry : hsOpts.
UserEntries) {
5376 StringRef Path = UserEntry.Path;
5381 HBuilder.add(UserEntry);
5389#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5390#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5391 HBuilder.add(diagOpts.get##Name());
5392#include "clang/Basic/DiagnosticOptions.def"
5402 ext->hashExtension(HBuilder);
5409 HBuilder.add(*Minor);
5410 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5411 HBuilder.add(*Subminor);
5413 HBuilder.add(*Build);
5419#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5420 if constexpr (CK::Compatibility != CK::Benign) \
5421 HBuilder.add(CodeGenOpts->Name);
5422#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5423 if constexpr (CK::Compatibility != CK::Benign) \
5424 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5425#define DEBUGOPT(Name, Bits, Default, Compatibility)
5426#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5427#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5428#include "clang/Basic/CodeGenOptions.def"
5440#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5441 if constexpr (CK::Compatibility != CK::Benign) \
5442 HBuilder.add(CodeGenOpts->Name);
5443#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5444 if constexpr (CK::Compatibility != CK::Benign) \
5445 HBuilder.add(CodeGenOpts->Name);
5446#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5447 if constexpr (CK::Compatibility != CK::Benign) \
5448 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5449#include "clang/Basic/DebugOptions.def"
5456 if (!SanHash.
empty())
5457 HBuilder.add(SanHash.
Mask);
5459 llvm::MD5::MD5Result
Result;
5460 HBuilder.getHasher().final(
Result);
5462 return toString(llvm::APInt(64, Hash), 36,
false);
5466 llvm::function_ref<
VisitMutResult(StringRef, std::string &)> Cb) {
5467 std::string NewValue;
5469#define RETURN_IF(OPTS, PATH) \
5471 VisitMutResult Res = Cb(PATH, NewValue); \
5472 if (Res.Replace) { \
5473 (void)ensureOwned(OPTS); \
5475 std::swap(PATH, NewValue); \
5477 if (Res.Terminate) \
5481#define RETURN_IF_MANY(OPTS, PATHS) \
5483 for (unsigned I = 0, E = PATHS.size(); I != E; ++I) \
5484 RETURN_IF(OPTS, PATHS[I]); \
5489 for (
auto &Entry :
HSOpts->UserEntries)
5490 if (Entry.IgnoreSysRoot)
5495 for (
auto &[Name,
File] :
HSOpts->PrebuiltModuleFiles)
5507 if (Input.isBuffer())
5545 [&Cb](StringRef Path, std::string &) {
return Cb(Path); });
5574 std::vector<std::string> Args{
"-cc1"};
5576 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5603 llvm::vfs::getRealFileSystem());
5611 Diags, std::move(BaseFS));
5617 if (VFSOverlayFiles.empty())
5622 for (
const auto &
File : VFSOverlayFiles) {
5623 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5626 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5631 std::move(Buffer.get()),
nullptr,
File,
5634 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
bool hasDWARFExceptions() const
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.
bool hasSjLjExceptions() const
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
bool hasSEHExceptions() const
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
@ NonZero
Convert in-memory bools to i1 by checking if any bit is set to 1.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
std::string SaveDynDbgTempsFilePrefix
Prefix to use for -save-dynamic-debugging-temps output.
The base class of CompilerInvocation.
std::shared_ptr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::shared_ptr< AnalyzerOptions > AnalyzerOpts
Options controlling the static analyzer.
std::shared_ptr< MigratorOptions > MigratorOpts
std::shared_ptr< PreprocessorOutputOptions > PreprocessorOutputOpts
Options controlling preprocessed output.
std::shared_ptr< APINotesOptions > APINotesOpts
Options controlling API notes.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
const FrontendOptions & getFrontendOpts() const
std::shared_ptr< ssaf::SSAFOptions > SSAFOpts
Options controlling the Scalable Static Analysis Framework (SSAF).
const CodeGenOptions & getCodeGenOpts() const
llvm::function_ref< const char *(const Twine &)> StringAllocator
Command line generation.
const FileSystemOptions & getFileSystemOpts() const
std::shared_ptr< PreprocessorOptions > PPOpts
Options controlling the preprocessor (aside from #include handling).
const PreprocessorOutputOptions & getPreprocessorOutputOpts() const
const ssaf::SSAFOptions & getSSAFOpts() const
std::vector< std::string > getCC1CommandLine() const
Generate cc1-compatible command line arguments from this instance, wrapping the result as a std::vect...
std::shared_ptr< FileSystemOptions > FSOpts
Options controlling file system operations.
const AnalyzerOptions & getAnalyzerOpts() const
const MigratorOptions & getMigratorOpts() const
void generateCC1CommandLine(llvm::SmallVectorImpl< const char * > &Args, StringAllocator SA) const
Generate cc1-compatible command line arguments from this instance.
CompilerInvocationBase & deep_copy_assign(const CompilerInvocationBase &X)
const DependencyOutputOptions & getDependencyOutputOpts() const
CompilerInvocationBase & shallow_copy_assign(const CompilerInvocationBase &X)
const TargetOptions & getTargetOpts() const
std::shared_ptr< CodeGenOptions > CodeGenOpts
Options controlling IRgen and the backend.
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
const APINotesOptions & getAPINotesOpts() const
const HeaderSearchOptions & getHeaderSearchOpts() const
std::shared_ptr< HeaderSearchOptions > HSOpts
Options controlling the #include directive.
const PreprocessorOptions & getPreprocessorOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
const LangOptions & getLangOpts() const
Const getters.
std::shared_ptr< FrontendOptions > FrontendOpts
Options controlling the frontend itself.
llvm::function_ref< void(const Twine &)> ArgumentConsumer
std::shared_ptr< DependencyOutputOptions > DependencyOutputOpts
Options controlling dependency output.
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
MigratorOptions & getMigratorOpts()
AnalyzerOptions & getAnalyzerOpts()
APINotesOptions & getAPINotesOpts()
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
ssaf::SSAFOptions & getSSAFOpts()
LangOptions & getLangOpts()
Mutable getters.
static bool checkCC1RoundTrip(ArrayRef< const char * > Args, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Check that Args can be parsed and re-serialized without change, emiting diagnostics for any differenc...
DependencyOutputOptions & getDependencyOutputOpts()
CompilerInvocation()=default
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
FileSystemOptions & getFileSystemOpts()
CompilerInvocation & operator=(const CompilerInvocation &X)
static void setDefaultPointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple)
Populate Opts with the default set of pointer authentication-related options given LangOpts and Tripl...
CodeGenOptions & getCodeGenOpts()
TargetOptions & getTargetOpts()
std::string computeContextHash() const
Compute the context hash - a string that uniquely identifies compiler settings.
HeaderSearchOptions & getHeaderSearchOpts()
DiagnosticOptions & getDiagnosticOpts()
PreprocessorOutputOptions & getPreprocessorOutputOpts()
Same as CompilerInvocation, but with copy-on-write optimization.
FrontendOptions & getMutFrontendOpts()
LangOptions & getMutLangOpts()
Mutable getters.
HeaderSearchOptions & getMutHeaderSearchOpts()
MigratorOptions & getMutMigratorOpts()
PreprocessorOptions & getMutPreprocessorOpts()
APINotesOptions & getMutAPINotesOpts()
PreprocessorOutputOptions & getMutPreprocessorOutputOpts()
CodeGenOptions & getMutCodeGenOpts()
TargetOptions & getMutTargetOpts()
FileSystemOptions & getMutFileSystemOpts()
AnalyzerOptions & getMutAnalyzerOpts()
void visitMutPaths(llvm::function_ref< VisitMutResult(StringRef, std::string &)> Cb)
Visits paths stored in the invocation, allowing the callback to mutate them via the out-param.
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
CowCompilerInvocation()=default
void visitPaths(llvm::function_ref< VisitConstResult(StringRef)> Cb) const
Visits paths stored in the invocation.
ssaf::SSAFOptions & getMutSSAFOpts()
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
HeaderIncludeFormatKind HeaderIncludeFormat
The format of header information.
std::string OutputFile
The file to write dependency output to.
HeaderIncludeFilteringKind HeaderIncludeFiltering
Determine whether header information should be filtered.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
unsigned IncludeSystemHeaders
Include system header dependencies.
static llvm::IntrusiveRefCntPtr< DiagnosticIDs > create()
Options for controlling the compiler diagnostics engine.
std::string DiagnosticSuppressionMappingsFile
Path for the file that defines diagnostic suppression mappings.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > VerifyPrefixes
The prefixes for comment directives sought by -verify ("expected" by default).
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setClient(DiagnosticConsumer *client, bool ShouldOwnClient=true)
Set the diagnostic client associated with this diagnostic object.
unsigned getNumErrors() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
unsigned getNumWarnings() const
Keeps track of options that affect how file operations are performed.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input.
unsigned ClangIRDisablePasses
Disable Clang IR specific (CIR) passes.
llvm::TimeTraceCompression TimeTraceCompress
Compression mode for -ftime-trace output.
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.
std::string TimeTracePath
Path which stores the output files for -ftime-trace.
unsigned UseClangIRPipeline
Use Clang IR pipeline to emit code.
ASTDumpOutputFormat ASTDumpFormat
Specifies the output format of the AST.
std::optional< std::string > AuxTargetCPU
Auxiliary target CPU for CUDA/HIP compilation.
std::string OutputFile
The output file, if any.
unsigned ShowStats
Show frontend performance metrics and statistics.
unsigned GenReducedBMI
Whether to generate reduced BMI for C++20 named modules.
std::string ActionName
The name of the action to run when using a plugin action.
std::vector< std::shared_ptr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
static InputKind getInputKindForExtension(StringRef Extension)
getInputKindForExtension - Return the appropriate input kind for a file extension.
std::vector< std::string > Plugins
The list of plugins to load.
unsigned ASTDumpAll
Whether we deserialize all decls when forming AST dumps.
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
unsigned DisableFree
Disable memory freeing on exit.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
frontend::ActionKind ProgramAction
The frontend action to perform.
std::optional< std::vector< std::string > > AuxTargetFeatures
Auxiliary target features for CUDA/HIP compilation.
std::string AuxTriple
Auxiliary triple for CUDA/HIP/SYCL compilation.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
A diagnostic client that ignores all diagnostics.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ None
Don't exclude any overflow patterns from sanitizers.
@ AddUnsignedOverflowTest
if (a + b < a)
@ All
Exclude all overflow patterns (below)
@ AddSignedOverflowTest
if (a + b < a)
@ PostDecrInWhile
while (count–)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
SanitizerSet UBSanFeatureIgnoredSanitize
Set of (UBSan) sanitizers that when enabled do not cause __has_feature(undefined_behavior_sanitizer) ...
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
clang::ObjCRuntime ObjCRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
SanitizerSet Sanitize
Set of enabled sanitizers.
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
bool UseTargetPathSeparator
Indicates whether to use target's platform-specific file separator when FILE macro is used and when c...
static void setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, std::vector< std::string > &Includes, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
std::string RandstructSeed
The seed used by the randomize structure layout feature.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint64_t > AllocTokenMax
Maximum number of allocation tokens (0 = target SIZE_MAX), nullopt if none set (use target SIZE_MAX).
LangStandard::Kind LangStd
The used language standard.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
bool SanitizeCoverage
Is at least one coverage instrumentation type enabled.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
The basic abstraction for the target Objective-C runtime.
bool allowsWeak() const
Does this runtime allow the use of __weak?
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
std::string getAsString() const
bool allowsARC() const
Does this runtime allow ARC at all?
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
Discrimination
Forms of extra discrimination.
ARM8_3Key
Hardware pointer-signing keys in ARM8.3.
static constexpr std::optional< PositiveAnalyzerOption > create(unsigned Val)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a pragma hdrstop to separ...
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
void resetNonModularOptions()
Reset any options that are not considered when building a module.
void addMacroUndef(StringRef Name)
std::set< std::string > DeserializedPCHDeclsToErrorOn
This is a set of names for decls that we do not want to be deserialized, and we emit an error if they...
std::vector< std::string > EmbedEntries
User specified embed entries.
void addMacroDef(StringRef Name)
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a pragma hdrstop is expected to indicate the beginnin...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
std::vector< std::pair< std::string, bool > > Macros
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
unsigned ShowMacros
Print macro definitions.
unsigned ShowCPP
Print normal preprocessed output.
unsigned ShowLineMarkers
Show #line markers.
unsigned DirectivesOnly
Process directives but do not expand macros.
Encodes a location in the source.
static bool isSupportedCXXABI(const llvm::Triple &T, Kind Kind)
static const auto & getSpelling(Kind ABIKind)
static bool usesRelativeVTables(const llvm::Triple &T)
static bool isABI(StringRef Name)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
uint64_t LargeDataThreshold
AMDGPUFeatureState AMDGPUSramEccState
AMDGPU sramecc setting from -msramecc/-mno-sramecc.
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
AMDGPUFeatureState AMDGPUXnackState
AMDGPU xnack setting from -mxnack/-mno-xnack.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
@ Enabled
Feature explicitly enabled.
@ Disabled
Feature explicitly disabled.
constexpr XRayInstrMask None
constexpr XRayInstrMask All
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
@ CXXSystem
Like System, but only used for C++.
@ Angled
Paths for '#include <>' added by '-I'.
@ CSystem
Like System, but only used for C.
@ System
Like Angled, but marks system directories.
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
@ ExternCSystem
Like System, but headers are implicitly wrapped in extern "C".
@ ObjCSystem
Like System, but only used for ObjC.
@ ObjCXXSystem
Like System, but only used for ObjC++.
@ After
Like System, but searched after the system directories.
@ GenerateHeaderUnit
Generate a C++20 header unit module from a header file.
@ VerifyPCH
Load and verify that a PCH file is usable.
@ PrintPreprocessedInput
-E mode.
@ RewriteTest
Rewriter playground.
@ ParseSyntaxOnly
Parse and perform semantic analysis.
@ GenerateModuleInterface
Generate pre-compiled module from a standard C++ module interface unit.
@ EmitLLVM
Emit a .ll file.
@ PrintPreamble
Print the "preamble" of the input file.
@ InitOnly
Only execute frontend initialization.
@ ASTView
Parse ASTs and view them in Graphviz.
@ PluginAction
Run a plugin action,.
@ DumpRawTokens
Dump out raw tokens.
@ PrintDependencyDirectivesSourceMinimizerOutput
Print the output of the dependency directives source minimizer.
@ RewriteObjC
ObjC->C Rewriter.
@ RunPreprocessorOnly
Just lex, no output.
@ ModuleFileInfo
Dump information about a module file.
@ EmitCIR
Emit a .cir file.
@ DumpCompilerOptions
Dump the compiler configuration.
@ RunAnalysis
Run one or more source code analyses.
@ ASTPrint
Parse ASTs and print them.
@ GenerateReducedModuleInterface
Generate reduced module interface for a standard C++ module interface unit.
@ GenerateInterfaceStubs
Generate Interface Stub Files.
@ ASTDump
Parse ASTs and dump them.
@ EmitCIRBC
Emit a .cirbc file (ClangIR bytecode).
@ DumpTokens
Dump out preprocessed tokens.
@ FixIt
Parse and apply any fixits to the source.
@ EmitAssembly
Emit a .s file.
@ EmitCodeGenOnly
Generate machine code, but don't emit anything.
@ RewriteMacros
Expand macros but not #includes.
@ EmitHTML
Translate input source into HTML.
@ GeneratePCH
Generate pre-compiled header.
@ EmitLLVMOnly
Generate LLVM IR, but do not emit anything.
@ GenerateModule
Generate pre-compiled module from a module map.
@ ASTDeclList
Parse ASTs and list Decl nodes.
bool EQ(InterpState &S, CodePtr OpPC)
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
Top level wrappers for InstallAPI frontend operations.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromOverlayFiles(ArrayRef< std::string > VFSOverlayFiles, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS)
DiagnosticLevelMask
A bitmask representing the diagnostic levels used by VerifyDiagnosticConsumer.
const char * headerIncludeFormatKindToString(HeaderIncludeFormatKind K)
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
constexpr uint16_t BlockDescriptorConstantDiscriminator
Constant discriminator to be used with block descriptor pointers.
constexpr uint16_t IsaPointerConstantDiscriminator
Constant discriminator to be used with objective-c isa pointers.
const char * headerIncludeFilteringKindToString(HeaderIncludeFilteringKind K)
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ Success
Annotation was successful.
@ Parse
Parse the block; this code is always used.
constexpr uint16_t SuperPointerConstantDiscriminator
Constant discriminator to be used with objective-c superclass pointers.
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
constexpr uint16_t MethodListPointerConstantDiscriminator
Constant discriminator to be used with method list pointers.
constexpr uint16_t ClassROConstantDiscriminator
Constant discriminator to be used with objective-c class_ro_t pointers.
@ C
Languages that the frontend can parse and compile.
@ CIR
LLVM IR & CIR: we accept these so that we can run the optimizer on them, and compile them to assembly...
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ Default
Set to the current date and time.
bool parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskCutoffs &Cutoffs)
Parse a single weighted value (e.g., 'undefined=0.05') from a -fsanitize= or -fno-sanitize= value lis...
@ Result
The result type of a method or function.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
XRayInstrMask parseXRayInstrValue(StringRef Value)
Parses a command line argument into a mask.
const FunctionProtoType * T
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void serializeXRayInstrValue(XRayInstrSet Set, SmallVectorImpl< StringRef > &Values)
Serializes a set into a list of command line arguments.
unsigned getOptimizationLevelSize(const llvm::opt::ArgList &Args)
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
llvm::Expected< llvm::SmallVector< llvm::SmallString< 8 > > > parseEscapedCommandLine(const char *CommandLine)
Parse a space-separated command line with escaped spaces and backslashes.
void serializeSanitizerMaskCutoffs(const SanitizerMaskCutoffs &Cutoffs, SmallVectorImpl< std::string > &Values)
Serialize a SanitizerMaskCutoffs into command line arguments.
ShowColorsKind
Controls whether to show colors in diagnostic output.
@ Auto
Emit colors only if the output stream is detected to support them.
@ On
Always emit colors regardless of the output stream.
@ Off
Never emit colors regardless of the output stream.
ShaderStage
Shader programs run in specific pipeline stages.
constexpr uint16_t StdTypeInfoVTablePointerConstantDiscrimination
Constant discriminator for std::type_info vtable pointers: 0xB1EA/45546 The value is ptrauth_string_d...
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const llvm::opt::OptTable & getDriverOptTable()
AnalysisDiagClients
AnalysisDiagClients - Set of available diagnostic clients for rendering analysis results.
@ NUM_ANALYSIS_DIAG_CLIENTS
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
int getLastArgIntValue(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, int Default, DiagnosticsEngine *Diags=nullptr, unsigned Base=0)
Return the value of the last argument as an integer, or a default.
AnalysisInliningMode
AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
int const char * function
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
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)