29#include "clang/Config/config.h"
44#include "llvm/ADT/APInt.h"
45#include "llvm/ADT/ArrayRef.h"
46#include "llvm/ADT/CachedHashString.h"
47#include "llvm/ADT/FloatingPointMode.h"
48#include "llvm/ADT/STLExtras.h"
49#include "llvm/ADT/SmallVector.h"
50#include "llvm/ADT/StringRef.h"
51#include "llvm/ADT/StringSwitch.h"
52#include "llvm/ADT/Twine.h"
53#include "llvm/Config/llvm-config.h"
54#include "llvm/Frontend/Debug/Options.h"
55#include "llvm/IR/DebugInfoMetadata.h"
56#include "llvm/Linker/Linker.h"
57#include "llvm/MC/MCTargetOptions.h"
58#include "llvm/Option/Arg.h"
59#include "llvm/Option/ArgList.h"
60#include "llvm/Option/OptSpecifier.h"
61#include "llvm/Option/OptTable.h"
62#include "llvm/Option/Option.h"
63#include "llvm/ProfileData/InstrProfReader.h"
64#include "llvm/Remarks/HotnessThresholdParser.h"
65#include "llvm/Support/CodeGen.h"
66#include "llvm/Support/Compiler.h"
67#include "llvm/Support/Error.h"
68#include "llvm/Support/ErrorHandling.h"
69#include "llvm/Support/ErrorOr.h"
70#include "llvm/Support/FileSystem.h"
71#include "llvm/Support/HashBuilder.h"
72#include "llvm/Support/MathExtras.h"
73#include "llvm/Support/MemoryBuffer.h"
74#include "llvm/Support/Path.h"
75#include "llvm/Support/Process.h"
76#include "llvm/Support/Regex.h"
77#include "llvm/Support/VersionTuple.h"
78#include "llvm/Support/VirtualFileSystem.h"
79#include "llvm/Support/raw_ostream.h"
80#include "llvm/Target/TargetOptions.h"
81#include "llvm/TargetParser/Host.h"
82#include "llvm/TargetParser/Triple.h"
110 if (Arg.getAsInteger(10, Val))
111 return llvm::createStringError(llvm::inconvertibleErrorCode(),
112 "Not an integer: %s", Arg.data());
121 return std::make_shared<T>(
X);
195 if (Storage.use_count() > 1)
196 Storage = std::make_shared<T>(*Storage);
267#define SIMPLE_ENUM_VALUE_TABLE
268#include "clang/Options/Options.inc"
269#undef SIMPLE_ENUM_VALUE_TABLE
275 if (Args.hasArg(Opt))
284 if (Args.hasArg(Opt))
294 unsigned SpellingOffset, Option::OptionClass,
299 const Twine &Spelling, Option::OptionClass,
305 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
309 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
311 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
313 if (Args.hasArg(Opt))
320 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
326 OptSpecifier OtherOpt) {
327 return [
Value, OtherValue,
328 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
330 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
331 return A->getOption().matches(Opt) ?
Value : OtherValue;
339 Option::OptionClass,
unsigned,
bool KeyPath) {
340 if (KeyPath ==
Value)
346 const Twine &Spelling,
347 Option::OptionClass OptClass,
unsigned,
348 const Twine &
Value) {
350 case Option::SeparateClass:
351 case Option::JoinedOrSeparateClass:
352 case Option::JoinedAndSeparateClass:
356 case Option::JoinedClass:
357 case Option::CommaJoinedClass:
358 Consumer(Spelling +
Value);
361 llvm_unreachable(
"Cannot denormalize an option with option class "
362 "incompatible with string denormalization.");
369 Option::OptionClass OptClass,
unsigned TableIndex,
T Value) {
371 TableIndex, Twine(
Value));
376 Option::OptionClass OptClass,
unsigned TableIndex,
381static std::optional<SimpleEnumValue>
383 for (
int I = 0, E = Table.Size; I != E; ++I)
384 if (Name == Table.Table[I].Name)
385 return Table.Table[I];
390static std::optional<SimpleEnumValue>
392 for (
int I = 0, E = Table.Size; I != E; ++I)
394 return Table.Table[I];
403 assert(TableIndex < SimpleEnumValueTablesSize);
404 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
406 auto *Arg = Args.getLastArg(Opt);
410 StringRef ArgValue = Arg->getValue();
412 return MaybeEnumVal->Value;
414 Diags.
Report(diag::err_drv_invalid_value)
415 << Arg->getAsString(Args) << ArgValue;
420 unsigned SpellingOffset,
421 Option::OptionClass OptClass,
422 unsigned TableIndex,
unsigned Value) {
423 assert(TableIndex < SimpleEnumValueTablesSize);
424 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
427 TableIndex, MaybeEnumVal->Name);
429 llvm_unreachable(
"The simple enum value was not correctly defined in "
430 "the tablegen option description");
436 unsigned SpellingOffset,
437 Option::OptionClass OptClass,
438 unsigned TableIndex,
T Value) {
440 TableIndex,
static_cast<unsigned>(
Value));
447 auto *Arg = Args.getLastArg(Opt);
450 return std::string(Arg->getValue());
453template <
typename IntTy>
457 auto *Arg = Args.getLastArg(Opt);
461 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
462 Diags.
Report(diag::err_drv_invalid_int_value)
463 << Arg->getAsString(Args) << Arg->getValue();
469static std::optional<std::vector<std::string>>
472 return Args.getAllArgValues(Opt);
476 unsigned SpellingOffset,
477 Option::OptionClass OptClass,
479 const std::vector<std::string> &Values) {
481 case Option::CommaJoinedClass: {
482 std::string CommaJoinedValue;
483 if (!Values.empty()) {
484 CommaJoinedValue.append(Values.front());
485 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
486 CommaJoinedValue.append(
",");
487 CommaJoinedValue.append(
Value);
491 Option::OptionClass::JoinedClass, TableIndex,
495 case Option::JoinedClass:
496 case Option::SeparateClass:
497 case Option::JoinedOrSeparateClass:
498 for (
const std::string &
Value : Values)
502 llvm_unreachable(
"Cannot denormalize an option with option class "
503 "incompatible with string vector denormalization.");
511 auto *Arg = Args.getLastArg(Opt);
514 return llvm::Triple::normalize(Arg->getValue());
517#define PARSE_OPTION_WITH_MARSHALLING( \
518 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
519 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
520 METAVAR, VALUES, SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
521 DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
523 if ((VISIBILITY) & options::CC1Option) { \
524 KEYPATH = static_cast<decltype(KEYPATH)>(DEFAULT_VALUE); \
526 KEYPATH = static_cast<decltype(KEYPATH)>(IMPLIED_VALUE); \
528 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
529 KEYPATH = static_cast<decltype(KEYPATH)>(*MaybeValue); \
532#define GENERATE_OPTION_WITH_MARSHALLING( \
533 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
534 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
535 SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
536 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, TABLE_INDEX) \
537 if ((VISIBILITY) & options::CC1Option) { \
538 if (ALWAYS_EMIT || (KEYPATH != static_cast<decltype(KEYPATH)>( \
539 ((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
540 : (DEFAULT_VALUE))))) \
541 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
542 TABLE_INDEX, KEYPATH); \
556 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
557 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
558 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
559 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
562 CodeGenOpts.ClearASTBeforeBackend =
false;
564 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
565 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
568 llvm::Triple
T(TargetOpts.
Triple);
569 llvm::Triple::ArchType
Arch =
T.getArch();
574 if (CodeGenOpts.getExceptionHandling() !=
576 T.isWindowsMSVCEnvironment())
577 Diags.
Report(diag::err_fe_invalid_exception_model)
578 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) <<
T.str();
580 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
581 Diags.
Report(diag::warn_c_kext);
583 if (LangOpts.NewAlignOverride &&
584 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
585 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
586 Diags.
Report(diag::err_fe_invalid_alignment)
587 << A->getAsString(Args) << A->getValue();
588 LangOpts.NewAlignOverride = 0;
593 if (LangOpts.CPlusPlus11) {
594 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
595 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
596 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
597 <<
bool(LangOpts.RawStringLiterals);
601 LangOpts.RawStringLiterals =
true;
604 if (Args.hasArg(OPT_freflection) && !LangOpts.CPlusPlus26) {
605 Diags.
Report(diag::err_drv_reflection_requires_cxx26)
606 << Args.getLastArg(options::OPT_freflection)->getAsString(Args);
609 LangOpts.NamedLoops =
610 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
613 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
614 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
618 if ((LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) && !LangOpts.CPlusPlus)
619 Diags.
Report(diag::err_drv_argument_not_allowed_with)
622 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
623 Diags.
Report(diag::err_drv_argument_not_allowed_with)
626 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
627 Diags.
Report(diag::err_drv_argument_not_allowed_with)
630 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
631 Diags.
Report(diag::err_drv_argument_not_allowed_with)
634 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
635 Diags.
Report(diag::err_drv_argument_not_allowed_with)
638 if (Args.hasArg(OPT_fdx_semantic_signature_packing_mode_EQ) && !LangOpts.HLSL)
639 Diags.
Report(diag::err_drv_argument_not_allowed_with)
642 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
643 Diags.
Report(diag::warn_ignored_hip_only_option)
644 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
646 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
647 Diags.
Report(diag::warn_ignored_hip_only_option)
648 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
654 if (!llvm::is_contained(Warnings,
"conversion"))
655 Warnings.insert(Warnings.begin(),
"conversion");
656 if (!llvm::is_contained(Warnings,
"vector-conversion"))
657 Warnings.insert(Warnings.begin(),
"vector-conversion");
658 if (!llvm::is_contained(Warnings,
"matrix-conversion"))
659 Warnings.insert(Warnings.begin(),
"matrix-conversion");
669 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
670 if (LangOpts.ApproxFunc)
671 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
672 if (LangOpts.AllowFPReassoc)
673 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
674 if (LangOpts.AllowRecip)
675 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
681 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
683 Diags.
Report(diag::warn_option_invalid_ocl_version)
685 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
687 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
688 auto DefaultCC = LangOpts.getDefaultCallingConv();
692 Arch != llvm::Triple::x86;
698 Diags.
Report(diag::err_drv_argument_not_allowed_with)
699 << A->getSpelling() <<
T.getTriple();
710 llvm::opt::OptSpecifier OptSpecifier) {
713 Option::OptionClass::FlagClass, 0);
717 llvm::opt::OptSpecifier OptSpecifier,
718 const Twine &
Value) {
756 bool CheckAgainstOriginalInvocation =
false,
757 bool ForceRoundTrip =
false) {
759 bool DoRoundTripDefault =
true;
761 bool DoRoundTripDefault =
false;
764 bool DoRoundTrip = DoRoundTripDefault;
765 if (ForceRoundTrip) {
768 for (
const auto *Arg : CommandLineArgs) {
769 if (Arg == StringRef(
"-round-trip-args"))
771 if (Arg == StringRef(
"-no-round-trip-args"))
779 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
784 llvm::raw_string_ostream OS(Buffer);
785 for (
const char *Arg : Args) {
786 llvm::sys::printArg(OS, Arg,
true);
799 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
806 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
812 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
813 Diags.
Report(diag::note_cc1_round_trip_original)
814 << SerializeArgs(CommandLineArgs);
819 llvm::BumpPtrAllocator Alloc;
820 llvm::StringSaver StringPool(Alloc);
821 auto SA = [&StringPool](
const Twine &Arg) {
822 return StringPool.save(Arg).data();
829 Generate(DummyInvocation, GeneratedArgs, SA);
835 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
840 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
841 Diags.
Report(diag::note_cc1_round_trip_generated)
842 << 1 << SerializeArgs(GeneratedArgs);
847 if (CheckAgainstOriginalInvocation)
849 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
853 Generate(RealInvocation, ComparisonArgs, SA);
858 return llvm::equal(A, B, [](
const char *AElem,
const char *BElem) {
859 return StringRef(AElem) == StringRef(BElem);
866 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
867 Diags.
Report(diag::err_cc1_round_trip_mismatch);
868 Diags.
Report(diag::note_cc1_round_trip_generated)
869 << 1 << SerializeArgs(GeneratedArgs);
870 Diags.
Report(diag::note_cc1_round_trip_generated)
871 << 2 << SerializeArgs(ComparisonArgs);
875 Diags.
Report(diag::remark_cc1_round_trip_generated)
876 << 1 << SerializeArgs(GeneratedArgs);
877 Diags.
Report(diag::remark_cc1_round_trip_generated)
878 << 2 << SerializeArgs(ComparisonArgs);
890 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
894 Args.push_back(
"-cc1");
897 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
902 OptSpecifier GroupWithValue,
903 std::vector<std::string> &Diagnostics) {
904 for (
auto *A : Args.filtered(Group)) {
905 if (A->getOption().getKind() == Option::FlagClass) {
908 Diagnostics.push_back(
909 std::string(A->getOption().getName().drop_front(1)));
910 }
else if (A->getOption().matches(GroupWithValue)) {
913 Diagnostics.push_back(
914 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
917 Diagnostics.push_back(A->getValue());
928 std::vector<std::string> &Funcs) {
929 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
931 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
938#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
939 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
940#include "clang/Options/Options.inc"
941#undef ANALYZER_OPTION_WITH_MARSHALLING
945#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
947 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
949#include "clang/StaticAnalyzer/Core/Analyses.def"
951 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
957#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
959 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
961#include "clang/StaticAnalyzer/Core/Analyses.def"
963 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
969#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
971 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
973#include "clang/StaticAnalyzer/Core/Analyses.def"
975 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
981#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
983 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
985#include "clang/StaticAnalyzer/Core/Analyses.def"
987 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
993 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1002 for (
const auto &
C : Opts.
Config)
1003 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1004 llvm::sort(SortedConfigOpts, llvm::less_first());
1006 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1009 auto Entry = ConfigOpts.
Config.find(Key);
1010 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1023#define SSAF_OPTION_WITH_MARSHALLING(...) \
1024 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1025#include "clang/Options/Options.inc"
1026#undef SSAF_OPTION_WITH_MARSHALLING
1035#define SSAF_OPTION_WITH_MARSHALLING(...) \
1036 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1037#include "clang/Options/Options.inc"
1038#undef SSAF_OPTION_WITH_MARSHALLING
1049#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1050 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1051#include "clang/Options/Options.inc"
1052#undef ANALYZER_OPTION_WITH_MARSHALLING
1054 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1055 StringRef Name = A->getValue();
1057#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1058 .Case(CMDFLAG, NAME##Model)
1059#include "clang/StaticAnalyzer/Core/Analyses.def"
1062 Diags.
Report(diag::err_drv_invalid_value)
1063 << A->getAsString(Args) << Name;
1066 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1067 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1074 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1075 StringRef Name = A->getValue();
1077#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1078 .Case(CMDFLAG, PD_##NAME)
1079#include "clang/StaticAnalyzer/Core/Analyses.def"
1082 Diags.
Report(diag::err_drv_invalid_value)
1083 << A->getAsString(Args) << Name;
1089 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1090 StringRef Name = A->getValue();
1092#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1093 .Case(CMDFLAG, NAME)
1094#include "clang/StaticAnalyzer/Core/Analyses.def"
1097 Diags.
Report(diag::err_drv_invalid_value)
1098 << A->getAsString(Args) << Name;
1104 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1105 StringRef Name = A->getValue();
1107#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1108 .Case(CMDFLAG, NAME)
1109#include "clang/StaticAnalyzer/Core/Analyses.def"
1112 Diags.
Report(diag::err_drv_invalid_value)
1113 << A->getAsString(Args) << Name;
1121 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1123 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1126 StringRef CheckerAndPackageList = A->getValue();
1128 CheckerAndPackageList.split(CheckersAndPackages,
",");
1129 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1135 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1139 StringRef configList = A->getValue();
1141 configList.split(configVals,
",");
1142 for (
const auto &configVal : configVals) {
1144 std::tie(key, val) = configVal.split(
"=");
1147 diag::err_analyzer_config_no_value) << configVal;
1150 if (val.contains(
'=')) {
1152 diag::err_analyzer_config_multiple_values)
1161 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1166 Opts.
Config[key] = std::string(val);
1176 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1179 os << Args.getArgString(i);
1186 StringRef OptionName, StringRef DefaultVal) {
1187 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1192 StringRef &OptionField, StringRef Name,
1193 StringRef DefaultVal) {
1202 bool &OptionField, StringRef Name,
bool DefaultVal) {
1203 auto PossiblyInvalidVal =
1204 llvm::StringSwitch<std::optional<bool>>(
1207 .Case(
"false",
false)
1208 .Default(std::nullopt);
1210 if (!PossiblyInvalidVal) {
1212 Diags->
Report(diag::err_analyzer_config_invalid_input)
1213 << Name <<
"a boolean";
1215 OptionField = DefaultVal;
1217 OptionField = *PossiblyInvalidVal;
1222 unsigned &OptionField, StringRef Name,
1223 unsigned DefaultVal) {
1225 OptionField = DefaultVal;
1226 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1227 .getAsInteger(0, OptionField);
1228 if (Diags && HasFailed)
1229 Diags->
Report(diag::err_analyzer_config_invalid_input)
1230 << Name <<
"an unsigned";
1236 unsigned DefaultVal) {
1239 if (Parsed.has_value()) {
1240 OptionField = Parsed.value();
1243 if (Diags && !Parsed.has_value())
1244 Diags->
Report(diag::err_analyzer_config_invalid_input)
1245 << Name <<
"a positive";
1247 OptionField = DefaultVal;
1255#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1256 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1257#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1258#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1260 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1261 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1263#define ANALYZER_OPTION(...)
1264#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1265 SHALLOW_VAL, DEEP_VAL) \
1266 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1267 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1268#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1275 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1276 std::vector<StringRef> Checkers =
1278 std::vector<StringRef> Packages =
1282 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1284 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1286 bool IsChecker = CheckerOrPackage.contains(
'.');
1287 bool IsValidName = IsChecker
1288 ? llvm::is_contained(Checkers, CheckerOrPackage)
1289 : llvm::is_contained(Packages, CheckerOrPackage);
1292 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1293 << CheckerOrPackage;
1303 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1304 Diags->
Report(diag::err_analyzer_config_invalid_input)
1305 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1313 if (
Remark.hasValidPattern()) {
1318 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1327 OptSpecifier OptEQ, StringRef Name) {
1330 auto InitializeResultPattern = [&Diags, &Args, &
Result](
const Arg *A,
1331 StringRef Pattern) {
1332 Result.Pattern = Pattern.str();
1334 std::string RegexError;
1335 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1336 if (!
Result.Regex->isValid(RegexError)) {
1337 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1338 << RegexError << A->getAsString(Args);
1345 for (Arg *A : Args) {
1346 if (A->getOption().matches(OPT_R_Joined)) {
1347 StringRef
Value = A->getValue();
1351 else if (
Value ==
"everything")
1353 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1355 else if (
Value ==
"no-everything")
1365 InitializeResultPattern(A,
".*");
1367 }
else if (A->getOption().matches(OptEQ)) {
1369 if (!InitializeResultPattern(A, A->getValue()))
1378 const std::vector<std::string> &Levels,
1382 for (
const auto &Level : Levels) {
1384 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1392 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1400 const std::vector<std::string> &Sanitizers,
1402 for (
const auto &Sanitizer : Sanitizers) {
1405 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1419 const std::vector<std::string> &Sanitizers,
1422 for (
const auto &Sanitizer : Sanitizers) {
1424 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1433 llvm::SplitString(Bundle, BundleParts,
",");
1434 for (
const auto &B : BundleParts) {
1438 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1452 llvm::raw_string_ostream OS(Buffer);
1453 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1459 const llvm::Triple &Triple) {
1460 assert(Triple.getArch() == llvm::Triple::aarch64);
1467 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1468 : Discrimination::None);
1471 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1472 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1473 : Discrimination::None);
1475 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1483 if (
LangOpts.PointerAuthVTTVTPtrDiscrimination)
1485 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1486 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1487 : Discrimination::None);
1503 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1522 if (
LangOpts.PointerAuthObjcClassROPointers)
1535 const llvm::Triple &Triple,
1537 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1538 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1539 !LangOpts.AArch64JumpTableHardening)
1545void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1547 const llvm::Triple &
T,
1548 const std::string &OutputFile,
1552 if (Opts.OptimizationLevel == 0)
1555 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1557#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1558 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1559#include "clang/Options/Options.inc"
1560#undef CODEGEN_OPTION_WITH_MARSHALLING
1562 if (Opts.OptimizationLevel > 0) {
1566 GenerateArg(Consumer, OPT_finline_hint_functions);
1571 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1572 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1573 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1574 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1576 std::optional<StringRef> DebugInfoVal;
1577 switch (Opts.DebugInfo) {
1578 case llvm::codegenoptions::DebugLineTablesOnly:
1579 DebugInfoVal =
"line-tables-only";
1581 case llvm::codegenoptions::DebugDirectivesOnly:
1582 DebugInfoVal =
"line-directives-only";
1584 case llvm::codegenoptions::DebugInfoConstructor:
1585 DebugInfoVal =
"constructor";
1587 case llvm::codegenoptions::LimitedDebugInfo:
1588 DebugInfoVal =
"limited";
1590 case llvm::codegenoptions::FullDebugInfo:
1591 DebugInfoVal =
"standalone";
1593 case llvm::codegenoptions::UnusedTypeInfo:
1594 DebugInfoVal =
"unused-types";
1596 case llvm::codegenoptions::NoDebugInfo:
1597 DebugInfoVal = std::nullopt;
1599 case llvm::codegenoptions::LocTrackingOnly:
1600 DebugInfoVal = std::nullopt;
1604 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1608 Prefix.first +
"=" + Prefix.second);
1611 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1612 Prefix.first +
"=" + Prefix.second);
1614 if (Opts.NewStructPathTBAA)
1617 if (Opts.OptimizeSize == 1)
1619 else if (Opts.OptimizeSize == 2)
1627 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1629 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1632 if (Opts.InterchangeLoops)
1638 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1643 if (Opts.DebugNameTable ==
1644 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1646 else if (Opts.DebugNameTable ==
1647 static_cast<unsigned>(
1648 llvm::DICompileUnit::DebugNameTableKind::Default))
1651 if (Opts.DebugTemplateAlias)
1654 auto TNK = Opts.getDebugSimpleTemplateNames();
1655 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1656 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1657 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1658 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1659 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1664 if (Opts.TimePasses) {
1665 if (Opts.TimePassesPerRun)
1666 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1670 if (Opts.TimePassesJson)
1674 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1677 if (Opts.PrepareForThinLTO)
1687 GenerateArg(Consumer, OPT_save_dynamic_debugging_temps);
1689 StringRef MemProfileBasename(
"memprof.profraw");
1710 std::string InstrBundle =
1712 if (!InstrBundle.empty())
1713 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1716 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1717 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1718 else if (Opts.CFProtectionReturn)
1719 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1720 else if (Opts.CFProtectionBranch)
1721 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1723 if (Opts.CFProtectionBranch) {
1724 switch (Opts.getCFBranchLabelScheme()) {
1727#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1728 case CFBranchLabelSchemeKind::Kind: \
1729 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1731#include "clang/Basic/CFProtectionOptions.def"
1735 if (Opts.FunctionReturnThunks)
1736 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1739 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1740 F.PropagateAttrs && F.Internalize;
1742 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1746 if (Opts.EmulatedTLS)
1754 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1759 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1763 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1767 if (Opts.XCOFFReadOnlyPointers)
1785 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1790 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1794 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1797 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1799 for (StringRef Sanitizer :
1801 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1803 SmallVector<std::string, 4> Values;
1805 for (std::string Sanitizer : Values)
1806 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1809 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1813 for (StringRef Sanitizer :
1815 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1817 if (!Opts.EmitVersionIdentMetadata)
1820 switch (Opts.FiniteLoops) {
1831 if (Opts.StaticClosure)
1835bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1838 const llvm::Triple &
T,
1839 const std::string &OutputFile,
1850 const LangOptions *
LangOpts = &LangOptsRef;
1852#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1853 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1854#include "clang/Options/Options.inc"
1855#undef CODEGEN_OPTION_WITH_MARSHALLING
1859 if (Opts.OptimizationLevel == 0) {
1861 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1862 options::OPT_finline_hint_functions,
1863 options::OPT_fno_inline_functions,
1864 options::OPT_fno_inline)) {
1867 if (A->getOption().matches(options::OPT_finline_functions))
1869 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1879 Opts.DirectAccessExternalData =
1880 Args.hasArg(OPT_fdirect_access_external_data) ||
1881 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1884 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1886 llvm::StringSwitch<unsigned>(A->getValue())
1887 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1888 .Case(
"line-directives-only",
1889 llvm::codegenoptions::DebugDirectivesOnly)
1890 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1891 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1892 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1893 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1896 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1899 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1905 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1906 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1907 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1908 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1909 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1910 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1911 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1914 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1915 auto Split = StringRef(Arg).split(
'=');
1919 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1920 auto Split = StringRef(Arg).split(
'=');
1925 T.supportsDebugEntryValues())
1926 Opts.EmitCallSiteInfo =
true;
1929 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1934 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1935 Args.hasArg(OPT_new_struct_path_tbaa);
1937 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1938 if (Opts.SimplifyLibCalls)
1941 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1942 (Opts.OptimizationLevel > 1));
1945 Opts.InterchangeLoops =
1946 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
true);
1947 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1948 OPT_fno_experimental_loop_fusion,
false);
1950 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1952 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1954 Opts.DebugNameTable =
static_cast<unsigned>(
1955 Args.hasArg(OPT_ggnu_pubnames)
1956 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1957 : Args.hasArg(OPT_gpubnames)
1958 ? llvm::DICompileUnit::DebugNameTableKind::Default
1959 : llvm::DICompileUnit::DebugNameTableKind::None);
1960 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1961 StringRef
Value = A->getValue();
1963 Diags.
Report(diag::err_drv_unsupported_option_argument)
1964 << A->getSpelling() << A->getValue();
1965 Opts.setDebugSimpleTemplateNames(
1966 StringRef(A->getValue()) ==
"simple"
1967 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1968 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1971 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1972 OPT_stats_file_timers)) {
1973 Opts.TimePasses =
true;
1976 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1977 StringRef Val =
EQ->getValue();
1978 if (Val ==
"per-pass")
1979 Opts.TimePassesPerRun =
false;
1980 else if (Val ==
"per-pass-run")
1981 Opts.TimePassesPerRun =
true;
1983 Diags.
Report(diag::err_drv_invalid_value)
1984 <<
EQ->getAsString(Args) <<
EQ->getValue();
1987 if (Args.getLastArg(OPT_ftime_report_json))
1988 Opts.TimePassesJson =
true;
1991 Opts.PrepareForLTO =
false;
1992 Opts.PrepareForThinLTO =
false;
1993 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1994 Opts.PrepareForLTO =
true;
1995 StringRef S = A->getValue();
1997 Opts.PrepareForThinLTO =
true;
1998 else if (S !=
"full")
1999 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
2000 if (Args.hasArg(OPT_funified_lto))
2001 Opts.PrepareForThinLTO =
true;
2003 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2005 Diags.
Report(diag::err_drv_argument_only_allowed_with)
2006 << A->getAsString(Args) <<
"-x ir";
2008 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2010 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2012 llvm::StringSwitch<std::string>(A->getValue())
2013 .Case(
"obj", OutputFile)
2014 .Default(llvm::sys::path::filename(OutputFile).str());
2016 if (Args.getLastArg(OPT_save_dynamic_debugging_temps))
2020 const char *MemProfileBasename =
"memprof.profraw";
2021 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2022 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2023 llvm::sys::path::append(Path, MemProfileBasename);
2025 }
else if (Args.hasArg(OPT_fmemory_profile))
2029 if (Args.hasArg(OPT_coverage_version_EQ)) {
2030 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2031 if (CoverageVersion.size() != 4) {
2032 Diags.
Report(diag::err_drv_invalid_value)
2033 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2043 for (
const auto &A : Args) {
2045 if (A->getOption().getID() == options::OPT_o ||
2046 A->getOption().getID() == options::OPT_INPUT ||
2047 A->getOption().getID() == options::OPT_x ||
2048 A->getOption().getID() == options::OPT_fembed_bitcode ||
2049 A->getOption().matches(options::OPT_W_Group))
2052 A->render(Args, ASL);
2053 for (
const auto &arg : ASL) {
2054 StringRef ArgStr(arg);
2055 llvm::append_range(Opts.
CmdArgs, ArgStr);
2061 auto XRayInstrBundles =
2062 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2063 if (XRayInstrBundles.empty())
2066 for (
const auto &A : XRayInstrBundles)
2070 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2071 StringRef Name = A->getValue();
2072 if (Name ==
"full") {
2073 Opts.CFProtectionReturn = 1;
2074 Opts.CFProtectionBranch = 1;
2075 }
else if (Name ==
"return")
2076 Opts.CFProtectionReturn = 1;
2077 else if (Name ==
"branch")
2078 Opts.CFProtectionBranch = 1;
2079 else if (Name !=
"none")
2080 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2083 if (Opts.CFProtectionBranch &&
T.isRISCV()) {
2084 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2086 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2087#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2088 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2089#include "clang/Basic/CFProtectionOptions.def"
2092 Opts.setCFBranchLabelScheme(Scheme);
2094 Diags.
Report(diag::err_drv_invalid_value)
2095 << A->getAsString(Args) << A->getValue();
2099 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2100 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2101 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2102 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2103 .Default(llvm::FunctionReturnThunksKind::Invalid);
2106 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2107 << A->getSpelling() <<
T.getTriple();
2108 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2109 Diags.
Report(diag::err_drv_invalid_value)
2110 << A->getAsString(Args) << A->getValue();
2111 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2112 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2113 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2114 << A->getAsString(Args)
2115 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2117 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2121 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2122 CodeGenOptions::BitcodeFileToLink F;
2124 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2125 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2134 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2135 StringRef Val = A->getValue();
2139 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2142 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2143 StringRef Val = A->getValue();
2146 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2152 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2153 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2157 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2158 << A->getSpelling() <<
T.str();
2160 const Option &O = A->getOption();
2161 if (O.matches(OPT_fpcc_struct_return) ||
2162 O.matches(OPT_maix_struct_return)) {
2165 assert(O.matches(OPT_freg_struct_return) ||
2166 O.matches(OPT_msvr4_struct_return));
2171 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2173 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2174 << A->getSpelling() <<
T.str();
2184 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2185 Diags.
Report(diag::err_roptr_requires_data_sections);
2187 Opts.XCOFFReadOnlyPointers =
true;
2190 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2191 if (!
T.isOSAIX() ||
T.isPPC32())
2192 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2193 << A->getSpelling() <<
T.str();
2196 bool NeedLocTracking =
false;
2199 NeedLocTracking =
true;
2201 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2203 NeedLocTracking =
true;
2206 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2208 NeedLocTracking =
true;
2218 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2228 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2231 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2232 <<
"-fdiagnostics-show-hotness";
2236 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2238 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2241 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2242 <<
"-fdiagnostics-hotness-threshold=";
2248 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2249 <<
"-fdiagnostics-hotness-threshold=";
2254 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2258 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2259 <<
"-fdiagnostics-misexpect-tolerance=";
2265 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2266 <<
"-fdiagnostics-misexpect-tolerance=";
2273 if (UsingSampleProfile)
2274 NeedLocTracking =
true;
2277 NeedLocTracking =
true;
2281 if (NeedLocTracking &&
2282 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2283 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2288 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2291 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2294 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2299 "-fsanitize-skip-hot-cutoff=",
2300 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2303 "-fsanitize-annotate-debug-info=",
2304 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2308 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2311 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2312 Diags.
Report(diag::err_drv_invalid_value)
2313 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2319 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2324 if (Args.hasArg(options::OPT_ffinite_loops))
2326 else if (Args.hasArg(options::OPT_fno_finite_loops))
2329 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2330 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2331 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2332 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2334 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2340 Diags.
Report(diag::err_drv_invalid_escaped_command_line)
2341 << llvm::toString(ParsedArgs.takeError());
2352#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2353 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2354#include "clang/Options/Options.inc"
2355#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2360 for (
const auto &Dep : Opts.
ExtraDeps) {
2361 switch (Dep.second) {
2374 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2383 bool ShowLineMarkers) {
2387#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2388 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2389#include "clang/Options/Options.inc"
2390#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2392 if (Args.hasArg(OPT_show_includes)) {
2407 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2408 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2409 StringRef Val = A->getValue();
2410 if (!Val.contains(
'='))
2414 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2415 StringRef Val = A->getValue();
2416 if (!Val.contains(
'='))
2423 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2427 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2431 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2432 StringRef Val = A->getValue();
2433 if (!Val.contains(
'='))
2441 if (Args.hasArg(OPT_header_include_format_EQ))
2442 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2446 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2450 if (Args.hasArg(OPT_header_include_filtering_EQ))
2451 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2455 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2463 bool DefaultColor) {
2470 for (
auto *A : Args) {
2471 const Option &O = A->getOption();
2472 if (O.matches(options::OPT_fcolor_diagnostics)) {
2474 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2476 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2477 StringRef
Value(A->getValue());
2478 if (
Value ==
"always")
2480 else if (
Value ==
"never")
2482 else if (
Value ==
"auto")
2492 for (
const auto &Prefix : VerifyPrefixes) {
2495 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2498 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2500 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2501 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2511#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2512 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2513#include "clang/Options/Options.inc"
2514#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2523#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2524 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2525#include "clang/Options/Options.inc"
2526#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2534#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2535 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2536#include "clang/Options/Options.inc"
2537#undef MIGRATOR_OPTION_WITH_MARSHALLING
2546#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2547 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2548#include "clang/Options/Options.inc"
2549#undef MIGRATOR_OPTION_WITH_MARSHALLING
2554void CompilerInvocationBase::GenerateDiagnosticArgs(
2556 bool DefaultDiagColor) {
2558#define DIAG_OPTION_WITH_MARSHALLING(...) \
2559 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2560#include "clang/Options/Options.inc"
2561#undef DIAG_OPTION_WITH_MARSHALLING
2564 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2567 switch (Opts.getShowColors()) {
2578 if (Opts.VerifyDiagnostics &&
2583 if (Prefix !=
"expected")
2586 if (Opts.VerifyDirectives) {
2594 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2597 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2599 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2601 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2603 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2608 if (
Warning ==
"undef-prefix")
2611 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2613 Consumer(StringRef(
"-W") +
Warning);
2619 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2620 "pass-analysis",
"no-pass-analysis",
2621 "pass-missed",
"no-pass-missed"};
2622 if (llvm::is_contained(IgnoredRemarks,
Remark))
2625 Consumer(StringRef(
"-R") +
Remark);
2629 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2634std::unique_ptr<DiagnosticOptions>
2636 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2637 unsigned MissingArgIndex, MissingArgCount;
2639 Argv.slice(1), MissingArgIndex, MissingArgCount);
2641 bool ShowColors =
true;
2642 if (std::optional<std::string> NoColor =
2643 llvm::sys::Process::GetEnv(
"NO_COLOR");
2644 NoColor && !NoColor->empty()) {
2659 bool DefaultDiagColor) {
2660 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2661 std::optional<DiagnosticsEngine> IgnoringDiags;
2663 IgnoringDiagOpts.emplace();
2666 Diags = &*IgnoringDiags;
2675#define DIAG_OPTION_WITH_MARSHALLING(...) \
2676 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2677#include "clang/Options/Options.inc"
2678#undef DIAG_OPTION_WITH_MARSHALLING
2680 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2683 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2687 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2688 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2690 if (Args.hasArg(OPT_verify))
2695 Opts.VerifyDiagnostics =
false;
2700 "-verify-ignore-unexpected=",
2701 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2702 if (Args.hasArg(OPT_verify_ignore_unexpected))
2704 Opts.setVerifyIgnoreUnexpected(DiagMask);
2706 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2711 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2722 unsigned DefaultOpt = 0;
2725 !Args.hasArg(OPT_cl_opt_disable))
2728 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2729 if (A->getOption().matches(options::OPT_O0))
2732 if (A->getOption().matches(options::OPT_Ofast) ||
2733 A->getOption().matches(options::OPT_O4))
2736 assert(A->getOption().matches(options::OPT_O));
2738 StringRef S(A->getValue());
2739 if (S ==
"s" || S ==
"z")
2748 unsigned MaxOptLevel = 3;
2749 if (DefaultOpt > MaxOptLevel) {
2752 Diags.
Report(diag::warn_drv_optimization_value)
2753 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2754 DefaultOpt = MaxOptLevel;
2761 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2762 if (A->getOption().matches(options::OPT_O)) {
2763 switch (A->getValue()[0]) {
2781 std::string &BlockName,
2782 unsigned &MajorVersion,
2783 unsigned &MinorVersion,
2785 std::string &UserInfo) {
2787 Arg.split(Args,
':', 5);
2788 if (Args.size() < 5)
2791 BlockName = std::string(Args[0]);
2792 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2793 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2794 if (Args[3].getAsInteger(2, Hashed))
return true;
2795 if (Args.size() > 4)
2796 UserInfo = std::string(Args[4]);
2805 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2837 OPT_emit_reduced_module_interface},
2853 OPT_print_dependency_directives_minimized_source},
2860static std::optional<frontend::ActionKind>
2863 if (ActionOpt.second == Opt.getID())
2864 return ActionOpt.first;
2866 return std::nullopt;
2870static std::optional<OptSpecifier>
2873 if (ActionOpt.first == ProgramAction)
2874 return OptSpecifier(ActionOpt.second);
2876 return std::nullopt;
2882#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2883 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2884#include "clang/Options/Options.inc"
2885#undef FRONTEND_OPTION_WITH_MARSHALLING
2887 std::optional<OptSpecifier> ProgramActionOpt =
2895 if (!ProgramActionOpt) {
2898 "Frontend action without option.");
2899 GenerateProgramAction = [&]() {
2906 GenerateProgramAction = [&]() {
2914 llvm_unreachable(
"Default AST dump format.");
2921 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2934 GenerateProgramAction = [&]() {
2939 GenerateProgramAction();
2941 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2943 for (
const auto &PluginArg : PluginArgs.second)
2945 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2946 Opt.getKind(), 0, PluginArg);
2950 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2951 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2957 for (
const auto &Plugin : Opts.
Plugins)
2963 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2976 StringRef HeaderUnit =
"";
2981 HeaderUnit =
"-user";
2984 HeaderUnit =
"-system";
2987 HeaderUnit =
"-header-unit";
2990 StringRef Header = IsHeader ?
"-header" :
"";
3013 Lang =
"objective-c";
3016 Lang =
"objective-c++";
3019 Lang =
"assembler-with-cpp";
3023 "Generating -x argument for unknown language (not precompiled).");
3038 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3042 for (
const auto &Input : Opts.
Inputs)
3043 Consumer(Input.getFile());
3052#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3053 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3054#include "clang/Options/Options.inc"
3055#undef FRONTEND_OPTION_WITH_MARSHALLING
3058 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3059 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3061 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3064 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3065 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3068 .Default(std::numeric_limits<unsigned>::max());
3070 if (Val != std::numeric_limits<unsigned>::max())
3073 Diags.
Report(diag::err_drv_invalid_value)
3074 << A->getAsString(Args) << A->getValue();
3084 Args.hasArg(OPT_interface_stub_version_EQ)
3085 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3087 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3088 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3089 ArgStr ==
"experimental-tapi-elf-v1") {
3090 std::string ErrorMessage =
3091 "Invalid interface stub format: " + ArgStr.str() +
3093 Diags.
Report(diag::err_drv_invalid_value)
3094 <<
"Must specify a valid interface stub format type, ie: "
3095 "-interface-stub-version=ifs-v1"
3098 }
else if (!ArgStr.starts_with(
"ifs-")) {
3099 std::string ErrorMessage =
3100 "Invalid interface stub format: " + ArgStr.str() +
".";
3101 Diags.
Report(diag::err_drv_invalid_value)
3102 <<
"Must specify a valid interface stub format type, ie: "
3103 "-interface-stub-version=ifs-v1"
3118 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3119 const Arg *SavedAction =
nullptr;
3120 for (
const Arg *AA :
3121 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3122 if (AA->getOption().matches(OPT_main_file_name)) {
3123 SavedAction =
nullptr;
3124 }
else if (!SavedAction) {
3127 if (!A->getOption().matches(OPT_ast_dump_EQ))
3128 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3129 << SavedAction->getSpelling() << A->getSpelling();
3136 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3137 Opts.
Plugins.emplace_back(A->getValue(0));
3141 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3142 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3144 for (
const std::string &Arg :
3145 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3146 std::string BlockName;
3147 unsigned MajorVersion;
3148 unsigned MinorVersion;
3150 std::string UserInfo;
3152 MinorVersion, Hashed, UserInfo)) {
3153 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3160 std::make_shared<TestModuleFileExtension>(
3161 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3164 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3168 Diags.
Report(diag::err_drv_invalid_value)
3169 << A->getAsString(Args) << A->getValue();
3170 Diags.
Report(diag::note_command_line_code_loc_requirement);
3174 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3175 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3176 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3178 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3179 StringRef Val = A->getValue();
3180 if (!Val.contains(
'='))
3185 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3187 if (Args.hasArg(OPT_emit_cir, OPT_emit_cir_bc))
3191 if (Args.hasArg(OPT_clangir_disable_passes))
3194 if (Args.hasArg(OPT_clangir_disable_verifier))
3197 if (Args.hasArg(OPT_clangir_lib_opt) || Args.hasArg(OPT_clangir_lib_opt_EQ))
3201 if (Args.hasArg(OPT_aux_target_cpu))
3202 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3203 if (Args.hasArg(OPT_aux_target_feature))
3207 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3208 StringRef XValue = A->getValue();
3213 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3214 bool ModuleMap = XValue.consume_back(
"-module-map");
3217 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3223 if (IsHeader || Preprocessed) {
3224 if (XValue.consume_back(
"-header-unit"))
3226 else if (XValue.consume_back(
"-system"))
3228 else if (XValue.consume_back(
"-user"))
3234 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3238 DashX = llvm::StringSwitch<InputKind>(XValue)
3254 DashX = llvm::StringSwitch<InputKind>(XValue)
3262 DashX = llvm::StringSwitch<InputKind>(XValue)
3265 .Cases({
"ast",
"pcm",
"precompiled-header"},
3272 Diags.
Report(diag::err_drv_invalid_value)
3273 << A->getAsString(Args) << A->getValue();
3280 IsHeaderFile =
true;
3281 }
else if (IsHeaderFile)
3288 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3291 Inputs.push_back(
"-");
3295 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3297 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3301 StringRef(Inputs[i]).rsplit(
'.').second);
3310 bool IsSystem =
false;
3319 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3336 Diags.
Report(diag::err_fe_cir_not_built);
3346#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3347 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3348#include "clang/Options/Options.inc"
3349#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3358 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3364 GenerateArg(Consumer, OPT_fmodules_ignore_search_path, Path.val());
3368 std::optional<bool> IsFramework,
3369 std::optional<bool> IgnoreSysRoot) {
3370 return llvm::is_contained(Groups, Entry.
Group) &&
3371 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3372 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3381 OptSpecifier Opt = [It, Matches]() {
3386 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3400 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3407 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3413 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3418 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3426 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3428 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3438 ? OPT_internal_isystem
3439 : OPT_internal_externc_isystem;
3443 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3445 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3449 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3450 : OPT_no_system_header_prefix;
3464#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3465 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3466#include "clang/Options/Options.inc"
3467#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3469 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3470 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3473 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3474 StringRef Val = A->getValue();
3475 if (Val.contains(
'=')) {
3476 auto Split = Val.split(
'=');
3478 std::string(Split.first), std::string(Split.second));
3481 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3484 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3485 StringRef MacroDef = A->getValue();
3487 llvm::CachedHashString(MacroDef.split(
'=').first));
3490 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_search_path))
3494 bool IsSysrootSpecified =
3495 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3499 auto PrefixHeaderPath = [IsSysrootSpecified,
3500 &Opts](
const llvm::opt::Arg *A,
3501 bool IsFramework =
false) -> std::string {
3502 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3503 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3505 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3506 llvm::StringRef(A->getValue()).substr(1));
3507 return std::string(Buffer);
3509 return A->getValue();
3512 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3513 bool IsFramework = A->getOption().matches(OPT_F);
3519 StringRef Prefix =
"";
3520 for (
const auto *A :
3521 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3522 if (A->getOption().matches(OPT_iprefix))
3523 Prefix = A->getValue();
3524 else if (A->getOption().matches(OPT_iwithprefix))
3530 for (
const auto *A : Args.filtered(OPT_idirafter))
3532 for (
const auto *A : Args.filtered(OPT_iquote))
3535 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3536 if (A->getOption().matches(OPT_iwithsysroot)) {
3543 for (
const auto *A : Args.filtered(OPT_iframework))
3545 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3550 for (
const auto *A : Args.filtered(OPT_c_isystem))
3552 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3554 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3556 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3560 for (
const auto *A :
3561 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3563 if (A->getOption().matches(OPT_internal_externc_isystem))
3565 Opts.
AddPath(A->getValue(), Group,
false,
true);
3567 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3571 for (
const auto *A :
3572 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3574 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3576 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3585 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3589 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3594 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3596 diags.
Report(diag::err_drv_invalid_value)
3597 << A->getAsString(Args) << A->getValue();
3599 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3605 if (Opts.PointerAuthIntrinsics)
3607 if (Opts.PointerAuthCalls)
3609 if (Opts.PointerAuthReturns)
3611 if (Opts.PointerAuthIndirectGotos)
3612 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3613 if (Opts.PointerAuthAuthTraps)
3615 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3616 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3617 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3618 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3619 if (Opts.PointerAuthVTTVTPtrDiscrimination)
3620 GenerateArg(Consumer, OPT_fptrauth_vtt_vtable_pointer_discrimination);
3621 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3622 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3623 if (Opts.PointerAuthFunctionTypeDiscrimination)
3624 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3625 if (Opts.PointerAuthInitFini)
3627 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3628 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3629 if (Opts.PointerAuthELFGOT)
3631 if (Opts.AArch64JumpTableHardening)
3632 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3633 if (Opts.PointerAuthObjcIsa)
3635 if (Opts.PointerAuthObjcInterfaceSel)
3636 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3637 if (Opts.PointerAuthObjcClassROPointers)
3638 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3639 if (Opts.PointerAuthBlockDescriptorPointers)
3640 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3645 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3646 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3647 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3648 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3649 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3650 Opts.PointerAuthVTPtrAddressDiscrimination =
3651 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3652 Opts.PointerAuthVTPtrTypeDiscrimination =
3653 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3654 Opts.PointerAuthVTTVTPtrDiscrimination =
3655 Args.hasArg(OPT_fptrauth_vtt_vtable_pointer_discrimination);
3656 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3657 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3658 Opts.PointerAuthFunctionTypeDiscrimination =
3659 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3660 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3661 Opts.PointerAuthInitFiniAddressDiscrimination =
3662 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3663 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3664 Opts.AArch64JumpTableHardening =
3665 Args.hasArg(OPT_faarch64_jump_table_hardening);
3666 Opts.PointerAuthBlockDescriptorPointers =
3667 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3668 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3669 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3670 Opts.PointerAuthObjcInterfaceSel =
3671 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3673 if (Opts.PointerAuthObjcInterfaceSel)
3674 Opts.PointerAuthObjcInterfaceSelKey =
3685 llvm_unreachable(
"should not parse language flags for this input");
3720 llvm_unreachable(
"unexpected input language");
3729 return "Objective-C";
3733 return "Objective-C++";
3737 return "C++ for OpenCL";
3756 llvm_unreachable(
"unknown input language");
3759void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3761 const llvm::Triple &
T,
3766 if (Opts.ObjCAutoRefCount)
3768 if (Opts.PICLevel != 0)
3769 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3773 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3774 for (StringRef Sanitizer :
3776 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3782 OptSpecifier StdOpt;
3784 case LangStandard::lang_opencl10:
3785 case LangStandard::lang_opencl11:
3786 case LangStandard::lang_opencl12:
3787 case LangStandard::lang_opencl20:
3788 case LangStandard::lang_opencl30:
3789 case LangStandard::lang_openclcpp10:
3790 case LangStandard::lang_openclcpp2021:
3791 StdOpt = OPT_cl_std_EQ;
3794 StdOpt = OPT_std_EQ;
3799 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3801 if (Opts.IncludeDefaultHeader)
3802 GenerateArg(Consumer, OPT_finclude_default_header);
3803 if (Opts.DeclareOpenCLBuiltins)
3804 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3806 const LangOptions *
LangOpts = &Opts;
3808#define LANG_OPTION_WITH_MARSHALLING(...) \
3809 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3810#include "clang/Options/Options.inc"
3811#undef LANG_OPTION_WITH_MARSHALLING
3822 else if (Opts.ObjCAutoRefCount == 1)
3825 if (Opts.ObjCWeakRuntime)
3826 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3831 if (Opts.ObjCSubscriptingLegacyRuntime)
3832 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3835 if (Opts.GNUCVersion != 0) {
3836 unsigned Major = Opts.GNUCVersion / 100 / 100;
3837 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3838 unsigned Patch = Opts.GNUCVersion % 100;
3840 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3843 if (Opts.IgnoreXCOFFVisibility)
3844 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3850 if (!Opts.MSVCCompat)
3852 }
else if (Opts.MSVCCompat) {
3855 if (Opts.PointerOverflowDefined)
3858 if (Opts.MSCompatibilityVersion != 0) {
3859 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3860 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3861 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3862 GenerateArg(Consumer, OPT_fms_compatibility_version,
3863 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3866 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3868 if (!Opts.Trigraphs)
3875 if (
T.isOSzOS() && !Opts.ZOSExt)
3877 else if (Opts.ZOSExt)
3880 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3883 if (Opts.ConvergentFunctions)
3886 GenerateArg(Consumer, OPT_fno_convergent_functions);
3888 if (Opts.NoBuiltin && !Opts.Freestanding)
3891 if (!Opts.NoBuiltin)
3895 if (Opts.LongDoubleSize == 128)
3897 else if (Opts.LongDoubleSize == 64)
3899 else if (Opts.LongDoubleSize == 80)
3906 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3909 if (Opts.OpenMP != 51)
3910 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3912 if (!Opts.OpenMPUseTLS)
3915 if (Opts.OpenMPIsTargetDevice)
3916 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3918 if (Opts.OpenMPIRBuilder)
3919 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3922 if (Opts.OpenMPSimd) {
3925 if (Opts.OpenMP != 51)
3926 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3929 if (Opts.OpenMPThreadSubscription)
3930 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3932 if (Opts.OpenMPTeamSubscription)
3933 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3935 if (Opts.OpenMPTargetDebug != 0)
3936 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3937 Twine(Opts.OpenMPTargetDebug));
3939 if (Opts.OpenMPCUDANumSMs != 0)
3940 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3941 Twine(Opts.OpenMPCUDANumSMs));
3943 if (Opts.OpenMPCUDABlocksPerSM != 0)
3944 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3945 Twine(Opts.OpenMPCUDABlocksPerSM));
3948 std::string Targets;
3949 llvm::raw_string_ostream
OS(Targets);
3952 [&OS](
const llvm::Triple &
T) { OS << T.str(); },
",");
3953 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3956 if (Opts.OpenMPCUDAMode)
3972 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3975 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3976 for (StringRef Sanitizer :
3978 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3982 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3984 switch (Opts.getClangABICompat()) {
3985#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3986 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3987 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3989#define ABI_VER_MAJOR(Major) \
3990 case LangOptions::ClangABI::Ver##Major: \
3991 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3993#define ABI_VER_LATEST(Latest) \
3994 case LangOptions::ClangABI::Latest: \
3996#include "clang/Basic/ABIVersions.def"
3999 if (Opts.getSignReturnAddressScope() ==
4001 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
4002 else if (Opts.getSignReturnAddressScope() ==
4004 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
4006 if (Opts.getSignReturnAddressKey() ==
4008 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
4014 if (Opts.RelativeCXXABIVTables)
4015 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
4017 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
4025 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
4035 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
4036 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
4039 if (Opts.MatrixTypes) {
4040 if (Opts.getDefaultMatrixMemoryLayout() ==
4042 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
4043 if (Opts.getDefaultMatrixMemoryLayout() ==
4045 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4049bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4051 std::vector<std::string> &Includes,
4061 if (Args.hasArg(OPT_fobjc_arc))
4062 Opts.ObjCAutoRefCount = 1;
4066 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4070 "-fsanitize-ignore-for-ubsan-feature=",
4071 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4082 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4085 Diags.
Report(diag::err_drv_invalid_value)
4086 << A->getAsString(Args) << A->getValue();
4088 for (
unsigned KindValue = 0;
4094 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4096 unsigned NumAliases = 0;
4097#define LANGSTANDARD(id, name, lang, desc, features, version)
4098#define LANGSTANDARD_ALIAS(id, alias) \
4099 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4100#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4101#include "clang/Basic/LangStandards.def"
4103#define LANGSTANDARD(id, name, lang, desc, features, version)
4104#define LANGSTANDARD_ALIAS(id, alias) \
4105 if (KindValue == LangStandard::lang_##id) Diag << alias;
4106#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4107#include "clang/Basic/LangStandards.def"
4115 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4123 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4125 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4126 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4127 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4128 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4129 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4130 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4131 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4132 .Cases({
"cl3.1",
"CL3.1"}, LangStandard::lang_opencl31)
4133 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4134 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4135 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4139 Diags.
Report(diag::err_drv_invalid_value)
4140 << A->getAsString(Args) << A->getValue();
4143 LangStd = OpenCLLangStd;
4147 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4148 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4156#define LANG_OPTION_WITH_MARSHALLING(...) \
4157 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4158#include "clang/Options/Options.inc"
4159#undef LANG_OPTION_WITH_MARSHALLING
4164 Opts.Modules = Opts.ClangModules || Opts.CPlusPlusModules;
4166 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4167 StringRef Name = A->getValue();
4168 if (Name ==
"full") {
4169 Opts.CFProtectionBranch = 1;
4170 Opts.CFProtectionReturn = 1;
4171 }
else if (Name ==
"branch") {
4172 Opts.CFProtectionBranch = 1;
4173 }
else if (Name ==
"return") {
4174 Opts.CFProtectionReturn = 1;
4178 if (Opts.CFProtectionBranch) {
4179 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4181 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4182#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4183 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4184#include "clang/Basic/CFProtectionOptions.def"
4186 Opts.setCFBranchLabelScheme(Scheme);
4190 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4191 !Args.hasArg(OPT_sycl_std_EQ)) {
4201 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4202 StringRef value =
arg->getValue();
4204 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4207 if (Args.hasArg(OPT_fobjc_gc_only))
4209 else if (Args.hasArg(OPT_fobjc_gc))
4211 else if (Args.hasArg(OPT_fobjc_arc)) {
4212 Opts.ObjCAutoRefCount = 1;
4214 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4221 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4222 Opts.ObjCWeakRuntime = 1;
4228 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4229 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4230 assert(!Opts.ObjCWeak);
4232 Diags.
Report(diag::err_objc_weak_with_gc);
4233 }
else if (!Opts.ObjCWeakRuntime) {
4234 Diags.
Report(diag::err_objc_weak_unsupported);
4238 }
else if (Opts.ObjCAutoRefCount) {
4239 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4242 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4243 Opts.ObjCSubscriptingLegacyRuntime =
4247 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4250 VersionTuple GNUCVer;
4251 bool Invalid = GNUCVer.tryParse(A->getValue());
4252 unsigned Major = GNUCVer.getMajor();
4253 unsigned Minor = GNUCVer.getMinor().value_or(0);
4254 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4255 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4256 Diags.
Report(diag::err_drv_invalid_value)
4257 << A->getAsString(Args) << A->getValue();
4259 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4262 if (
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4263 Opts.IgnoreXCOFFVisibility = 1;
4265 if (Args.hasArg(OPT_ftrapv)) {
4269 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4270 }
else if (Args.hasFlag(OPT_fwrapv, OPT_fno_wrapv, Opts.MSVCCompat)) {
4273 if (Args.hasArg(OPT_fwrapv_pointer))
4274 Opts.PointerOverflowDefined =
true;
4276 Opts.MSCompatibilityVersion = 0;
4277 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4279 if (VT.tryParse(A->getValue()))
4280 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4282 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4283 VT.getMinor().value_or(0) * 100000 +
4284 VT.getSubminor().value_or(0);
4292 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4295 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4298 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4300 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4301 && Opts.OpenCLVersion == 200);
4303 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4304 Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4305 Opts.ConvergentFunctions =
4306 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4307 HasConvergentOperations);
4309 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4310 if (!Opts.NoBuiltin)
4312 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4313 if (A->getOption().matches(options::OPT_mlong_double_64))
4314 Opts.LongDoubleSize = 64;
4315 else if (A->getOption().matches(options::OPT_mlong_double_80))
4316 Opts.LongDoubleSize = 80;
4317 else if (A->getOption().matches(options::OPT_mlong_double_128))
4318 Opts.LongDoubleSize = 128;
4320 Opts.LongDoubleSize = 0;
4322 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4328 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4330 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4331 << A->getSpelling() <<
"-fdefault-calling-conv";
4333 switch (
T.getArch()) {
4334 case llvm::Triple::x86:
4337 case llvm::Triple::m68k:
4341 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4342 << A->getSpelling() <<
T.getTriple();
4348 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4350 bool IsSimdSpecified =
4351 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4353 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4355 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4356 Opts.OpenMPIsTargetDevice =
4357 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4358 Opts.OpenMPIRBuilder =
4359 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4360 bool IsTargetSpecified =
4361 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4363 if (Opts.OpenMP || Opts.OpenMPSimd) {
4365 Args, OPT_fopenmp_version_EQ,
4366 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4367 Opts.OpenMP = Version;
4370 if (!Opts.OpenMPIsTargetDevice) {
4371 switch (
T.getArch()) {
4375 case llvm::Triple::nvptx:
4376 case llvm::Triple::nvptx64:
4377 Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4385 if ((Opts.OpenMPIsTargetDevice &&
T.isGPU()) || Opts.OpenCLCPlusPlus) {
4387 Opts.Exceptions = 0;
4388 Opts.CXXExceptions = 0;
4390 if (Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4391 Opts.OpenMPCUDANumSMs =
4393 Opts.OpenMPCUDANumSMs, Diags);
4394 Opts.OpenMPCUDABlocksPerSM =
4396 Opts.OpenMPCUDABlocksPerSM, Diags);
4401 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4402 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4404 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4405 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4406 Opts.OpenMPTargetDebug = 1;
4409 if (Opts.OpenMPIsTargetDevice) {
4410 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4411 Opts.OpenMPTeamSubscription =
true;
4412 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4413 Opts.OpenMPThreadSubscription =
true;
4417 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4418 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4419 auto getArchPtrSize = [](
const llvm::Triple &
T) {
4420 if (
T.isArch16Bit())
4422 if (
T.isArch32Bit())
4424 assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4428 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4429 llvm::Triple TT(A->getValue(i));
4431 if (TT.getArch() == llvm::Triple::UnknownArch ||
4432 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4433 TT.getArch() == llvm::Triple::spirv64 ||
4434 TT.getArch() == llvm::Triple::systemz ||
4435 TT.getArch() == llvm::Triple::loongarch64 ||
4436 TT.getArch() == llvm::Triple::nvptx ||
4437 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4438 TT.getArch() == llvm::Triple::x86 ||
4439 TT.getArch() == llvm::Triple::x86_64))
4440 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4441 else if (getArchPtrSize(
T) != getArchPtrSize(TT))
4442 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4443 << A->getValue(i) <<
T.str();
4450 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4451 (
T.isNVPTX() ||
T.isAMDGCN()) &&
4452 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4455 if (Args.hasArg(options::OPT_fopenacc))
4456 Opts.OpenACC =
true;
4458 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4459 StringRef Val = A->getValue();
4462 else if (Val ==
"on")
4464 else if (Val ==
"off")
4466 else if (Val ==
"fast-honor-pragmas")
4469 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4473 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4474 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4476 llvm::StringSwitch<unsigned>(A->getValue(i))
4479 .Case(
"add-unsigned-overflow-test",
4481 .Case(
"add-signed-overflow-test",
4484 .Case(
"unsigned-post-decr-while",
4494 "-fsanitize-ignore-for-ubsan-feature=",
4495 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4497 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4498 std::vector<std::string> systemIgnorelists =
4499 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4501 systemIgnorelists.begin(),
4502 systemIgnorelists.end());
4504 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4505 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4507 StringRef Ver = A->getValue();
4508 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4509 int Major, Minor = 0;
4513 if (!VerParts.first.starts_with(
"0") &&
4514 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4515 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4517 ? VerParts.second.size() == 1 &&
4518 !VerParts.second.getAsInteger(10, Minor)
4519 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4521#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4522 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4523 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4525#define ABI_VER_MAJOR(Major_) \
4526 if (Major <= Major_) \
4527 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4529#define ABI_VER_LATEST(Latest) \
4532#include "clang/Basic/ABIVersions.def"
4533 }
else if (Ver !=
"latest") {
4534 Diags.
Report(diag::err_drv_invalid_value)
4535 << A->getAsString(Args) << A->getValue();
4539 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4540 StringRef SignScope = A->getValue();
4542 if (SignScope.equals_insensitive(
"none"))
4543 Opts.setSignReturnAddressScope(
4545 else if (SignScope.equals_insensitive(
"all"))
4546 Opts.setSignReturnAddressScope(
4548 else if (SignScope.equals_insensitive(
"non-leaf"))
4549 Opts.setSignReturnAddressScope(
4552 Diags.
Report(diag::err_drv_invalid_value)
4553 << A->getAsString(Args) << SignScope;
4555 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4556 StringRef SignKey = A->getValue();
4557 if (!SignScope.empty() && !SignKey.empty()) {
4558 if (SignKey ==
"a_key")
4559 Opts.setSignReturnAddressKey(
4561 else if (SignKey ==
"b_key")
4562 Opts.setSignReturnAddressKey(
4565 Diags.
Report(diag::err_drv_invalid_value)
4566 << A->getAsString(Args) << SignKey;
4572 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4579 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI <<
T.str();
4585 Opts.RelativeCXXABIVTables =
4586 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4587 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4591 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4592 Opts.OmitVTableRTTI =
4593 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4594 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4595 if (Opts.OmitVTableRTTI && HasRTTI)
4596 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4598 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4599 auto Split = StringRef(A).split(
'=');
4601 {std::string(
Split.first), std::string(
Split.second)});
4605 !Args.getLastArg(OPT_fno_file_reproducible) &&
4606 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4607 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4608 Args.getLastArg(OPT_ffile_reproducible));
4611 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4613 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4614 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4616 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4618 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4619 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4622 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4623 std::ifstream SeedFile(A->getValue(0));
4625 if (!SeedFile.is_open())
4626 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4632 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4635 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4636 StringRef S = Arg->getValue();
4638 if (S.getAsInteger(0,
Value))
4639 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4644 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4645 StringRef S = Arg->getValue();
4646 if (
auto Mode = getAllocTokenModeFromString(S))
4649 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4653 if (Opts.MatrixTypes) {
4654 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4655 StringRef ClangValue = A->getValue();
4656 if (ClangValue ==
"row-major")
4657 Opts.setDefaultMatrixMemoryLayout(
4660 Opts.setDefaultMatrixMemoryLayout(
4663 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4664 StringRef OptValue = A->getValue();
4665 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4666 ClangValue != OptValue)
4667 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4668 << ClangValue << OptValue;
4677 if (
T.isDXIL() ||
T.isSPIRVLogical()) {
4679 enum {
OS, Environment };
4681 int ExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4683 if (
T.getOSName().empty()) {
4684 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4685 << ExpectedOS <<
OS <<
T.str();
4686 }
else if (
T.getEnvironmentName().empty()) {
4687 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4689 }
else if (!
T.isShaderStageEnvironment()) {
4690 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4695 if (!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4696 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4697 << ShaderModel <<
T.getOSName() <<
T.str();
4702 if (Args.getLastArg(OPT_fnative_half_type) ||
4703 Args.getLastArg(OPT_fnative_int16_type)) {
4704 const LangStandard &Std =
4706 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4707 T.getOSVersion() >= VersionTuple(6, 2)))
4708 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4709 <<
"-enable-16bit-types" <<
true << Std.
getName()
4710 <<
T.getOSVersion().getAsString();
4712 }
else if (
T.isSPIRVLogical()) {
4713 if (!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4714 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4715 << VulkanEnv <<
T.getOSName() <<
T.str();
4717 if (Args.getLastArg(OPT_fnative_half_type) ||
4718 Args.getLastArg(OPT_fnative_int16_type)) {
4719 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4720 ?
"-fnative-half-type"
4721 :
"-fnative-int16-type";
4722 const LangStandard &Std =
4724 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4725 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4726 << Str <<
false << Std.
getName();
4729 llvm_unreachable(
"expected DXIL or SPIR-V target");
4732 Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4734 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4735 const LangStandard &Requested =
4737 const LangStandard &Recommended =
4739 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4790 llvm_unreachable(
"invalid frontend action");
4835 llvm_unreachable(
"invalid frontend action");
4845#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4846 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4847#include "clang/Options/Options.inc"
4848#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4851 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4854 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4861 for (
const auto &M : Opts.
Macros) {
4864 if (M.first ==
"__CET__=1" && !M.second &&
4865 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4867 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4868 !CodeGenOpts.CFProtectionBranch)
4870 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4871 CodeGenOpts.CFProtectionBranch)
4874 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4877 for (
const auto &I : Opts.
Includes) {
4880 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4881 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4886 if (LangOpts.HLSL && I ==
"hlsl.h")
4896 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4902 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4905 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4919#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4920 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4921#include "clang/Options/Options.inc"
4922#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4924 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4925 Args.hasArg(OPT_pch_through_hdrstop_use);
4927 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4930 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4931 StringRef
Value(A->getValue());
4932 size_t Comma =
Value.find(
',');
4934 unsigned EndOfLine = 0;
4936 if (Comma == StringRef::npos ||
4937 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4938 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4939 Diags.
Report(diag::err_drv_preamble_format);
4947 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4948 if (A->getOption().matches(OPT_D))
4955 for (
const auto *A : Args.filtered(OPT_include))
4956 Opts.
Includes.emplace_back(A->getValue());
4958 for (
const auto *A : Args.filtered(OPT_chain_include))
4961 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4962 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4964 if (Split.second.empty()) {
4965 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4972 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4973 StringRef Epoch = A->getValue();
4977 const uint64_t MaxTimestamp =
4978 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4980 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4981 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4982 << Epoch << MaxTimestamp;
4988 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4989 StringRef Val = A->getValue();
5000 Args.hasFlag(OPT_fdefine_target_os_macros,
5012#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5013 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5014#include "clang/Options/Options.inc"
5015#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5033#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
5034 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5035#include "clang/Options/Options.inc"
5036#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
5039 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
5048#define TARGET_OPTION_WITH_MARSHALLING(...) \
5049 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
5050#include "clang/Options/Options.inc"
5051#undef TARGET_OPTION_WITH_MARSHALLING
5057 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5079#define TARGET_OPTION_WITH_MARSHALLING(...) \
5080 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5081#include "clang/Options/Options.inc"
5082#undef TARGET_OPTION_WITH_MARSHALLING
5084 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5085 llvm::VersionTuple Version;
5086 if (Version.tryParse(A->getValue()))
5087 Diags.
Report(diag::err_drv_invalid_value)
5088 << A->getAsString(Args) << A->getValue();
5093 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5094 llvm::VersionTuple Version;
5095 if (Version.tryParse(A->getValue()))
5096 Diags.
Report(diag::err_drv_invalid_value)
5097 << A->getAsString(Args) << A->getValue();
5102 if (Arg *A = Args.getLastArg(options::OPT_mxnack, options::OPT_mno_xnack)) {
5103 bool IsEnabled = A->getOption().matches(options::OPT_mxnack);
5110 Args.getLastArg(options::OPT_msramecc, options::OPT_mno_sramecc)) {
5111 bool IsEnabled = A->getOption().matches(options::OPT_msramecc);
5120bool CompilerInvocation::CreateFromArgsImpl(
5128 unsigned MissingArgIndex, MissingArgCount;
5129 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5130 MissingArgCount, VisibilityMask);
5134 if (MissingArgCount)
5135 Diags.
Report(diag::err_drv_missing_argument)
5136 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5139 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5140 auto ArgString = A->getAsString(Args);
5141 std::string Nearest;
5142 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5143 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5145 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5146 << ArgString << Nearest;
5179 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5193 Diags.
Report(diag::warn_drv_openacc_without_cir);
5201 if (!Args.hasArg(options::OPT_triple))
5213 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5214 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5215 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5216 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5229 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5235 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5246 llvm::driver::ProfileInstrKind::ProfileNone)
5247 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5249 llvm::TimeTraceCompression TimeTraceCompress =
5251 if (TimeTraceCompress == llvm::TimeTraceCompression::Infer &&
5253 TimeTraceCompress = llvm::inferTimeTraceCompressionFromPath(
5255 if (TimeTraceCompress == llvm::TimeTraceCompression::Zstd &&
5256 !llvm::compression::zstd::isAvailable())
5257 Diags.
Report(diag::err_drv_time_trace_compression_unavailable) <<
"zstd";
5267 const char *Argv0) {
5273 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5277 Args.push_back(
"-cc1");
5280 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5285 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5298 const unsigned LanguageOptionValues[] = {
5299#define HASH_LANGOPT_Benign(Value)
5300#define HASH_LANGOPT_Compatible(Value) Value,
5301#define HASH_LANGOPT_NotCompatible(Value) Value,
5302#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5303 HASH_LANGOPT_##Compatibility(LangOpts->Name)
5304#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5305 HASH_LANGOPT_##Compatibility(static_cast<unsigned>(LangOpts->get##Name()))
5306#include "clang/Basic/LangOptions.def"
5308#undef HASH_LANGOPT_Benign
5309#undef HASH_LANGOPT_Compatible
5310#undef HASH_LANGOPT_NotCompatible
5313 HBuilder.addRangeElements(LanguageOptionValues);
5318 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5319 HBuilder.add(
getLangOpts().CommentOpts.RetainCommentsFromSystemHeaders);
5336 StringRef MacroDef =
Macro.first;
5338 llvm::CachedHashString(MacroDef.split(
'=').first)))
5342 HBuilder.add(
Macro);
5355 for (
const auto &UserEntry : hsOpts.
UserEntries) {
5360 StringRef Path = UserEntry.Path;
5365 HBuilder.add(UserEntry);
5373#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5374#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5375 HBuilder.add(diagOpts.get##Name());
5376#include "clang/Basic/DiagnosticOptions.def"
5386 ext->hashExtension(HBuilder);
5393 HBuilder.add(*Minor);
5394 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5395 HBuilder.add(*Subminor);
5397 HBuilder.add(*Build);
5403#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5404 if constexpr (CK::Compatibility != CK::Benign) \
5405 HBuilder.add(CodeGenOpts->Name);
5406#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5407 if constexpr (CK::Compatibility != CK::Benign) \
5408 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5409#define DEBUGOPT(Name, Bits, Default, Compatibility)
5410#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5411#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5412#include "clang/Basic/CodeGenOptions.def"
5424#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5425 if constexpr (CK::Compatibility != CK::Benign) \
5426 HBuilder.add(CodeGenOpts->Name);
5427#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5428 if constexpr (CK::Compatibility != CK::Benign) \
5429 HBuilder.add(CodeGenOpts->Name);
5430#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5431 if constexpr (CK::Compatibility != CK::Benign) \
5432 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5433#include "clang/Basic/DebugOptions.def"
5440 if (!SanHash.
empty())
5441 HBuilder.add(SanHash.
Mask);
5443 llvm::MD5::MD5Result
Result;
5444 HBuilder.getHasher().final(
Result);
5446 return toString(llvm::APInt(64, Hash), 36,
false);
5450 llvm::function_ref<
VisitMutResult(StringRef, std::string &)> Cb) {
5451 std::string NewValue;
5453#define RETURN_IF(OPTS, PATH) \
5455 VisitMutResult Res = Cb(PATH, NewValue); \
5456 if (Res.Replace) { \
5457 (void)ensureOwned(OPTS); \
5459 std::swap(PATH, NewValue); \
5461 if (Res.Terminate) \
5465#define RETURN_IF_MANY(OPTS, PATHS) \
5467 for (unsigned I = 0, E = PATHS.size(); I != E; ++I) \
5468 RETURN_IF(OPTS, PATHS[I]); \
5473 for (
auto &Entry :
HSOpts->UserEntries)
5474 if (Entry.IgnoreSysRoot)
5479 for (
auto &[Name,
File] :
HSOpts->PrebuiltModuleFiles)
5491 if (Input.isBuffer())
5529 [&Cb](StringRef Path, std::string &) {
return Cb(Path); });
5558 std::vector<std::string> Args{
"-cc1"};
5560 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5587 llvm::vfs::getRealFileSystem());
5595 Diags, std::move(BaseFS));
5601 if (VFSOverlayFiles.empty())
5606 for (
const auto &
File : VFSOverlayFiles) {
5607 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5610 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5615 std::move(Buffer.get()),
nullptr,
File,
5618 Diags.
Report(diag::err_invalid_vfs_overlay) <<
File;
Defines the Diagnostic-related interfaces.
Defines enum values for all the target-independent builtin functions.
static void getAllNoBuiltinFuncValues(ArgList &Args, std::vector< std::string > &Funcs)
static std::optional< IntTy > normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &Diags)
static std::optional< std::string > normalizeString(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, OptSpecifier OtherOpt)
static void parsePointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple, DiagnosticsEngine &Diags)
static void denormalizeString(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, T Value)
static SmallVector< StringRef, 4 > serializeSanitizerKinds(SanitizerSet S)
static void parseXRayInstrumentationBundle(StringRef FlagName, StringRef Bundle, ArgList &Args, DiagnosticsEngine &D, XRayInstrSet &S)
static void GenerateFrontendArgs(const FrontendOptions &Opts, ArgumentConsumer Consumer, bool IsHeader)
static std::optional< SimpleEnumValue > findValueTableByValue(const SimpleEnumValueTable &Table, unsigned Value)
static void GenerateSSAFArgs(const ssaf::SSAFOptions &Opts, ArgumentConsumer Consumer)
static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static auto makeFlagToValueNormalizer(T Value)
#define RETURN_IF_MANY(OPTS, PATHS)
static CodeGenOptions::OptRemark ParseOptimizationRemark(DiagnosticsEngine &Diags, ArgList &Args, OptSpecifier OptEQ, StringRef Name)
Parse a remark command line argument.
static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static constexpr bool is_uint64_t_convertible()
static void GeneratePointerAuthArgs(const LangOptions &Opts, ArgumentConsumer Consumer)
static std::optional< SimpleEnumValue > findValueTableByName(const SimpleEnumValueTable &Table, StringRef Name)
static std::optional< OptSpecifier > getProgramActionOpt(frontend::ActionKind ProgramAction)
Maps frontend action to command line option.
static bool parseDiagnosticLevelMask(StringRef FlagName, const std::vector< std::string > &Levels, DiagnosticsEngine &Diags, DiagnosticLevelMask &M)
static std::optional< bool > normalizeSimpleFlag(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
CompilerInvocation::ArgumentConsumer ArgumentConsumer
static void denormalizeSimpleEnumImpl(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, unsigned Value)
static void GenerateArg(ArgumentConsumer Consumer, llvm::opt::OptSpecifier OptSpecifier)
static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, OptSpecifier GroupWithValue, std::vector< std::string > &Diagnostics)
static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts, DiagnosticsEngine *Diags)
static void denormalizeSimpleFlag(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass, unsigned,...)
The tblgen-erated code passes in a fifth parameter of an arbitrary type, but denormalizeSimpleFlags n...
static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action, const FrontendOptions &FrontendOpts)
static std::optional< unsigned > normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
static StringRef GetInputKindName(InputKind IK)
Get language name for given input kind.
static void initOption(AnalyzerOptions::ConfigTable &Config, DiagnosticsEngine *Diags, StringRef &OptionField, StringRef Name, StringRef DefaultVal)
#define RETURN_IF(OPTS, PATH)
static std::optional< std::string > normalizeTriple(OptSpecifier Opt, int TableIndex, const ArgList &Args, DiagnosticsEngine &Diags)
T & ensureOwned(std::shared_ptr< T > &Storage)
static void GenerateMigratorArgs(const MigratorOptions &Opts, ArgumentConsumer Consumer)
static const auto & getFrontendActionTable()
Return a table that associates command line option specifiers with the frontend action.
static void GenerateTargetArgs(const TargetOptions &Opts, ArgumentConsumer Consumer)
static std::optional< frontend::ActionKind > getFrontendAction(OptSpecifier &Opt)
Maps command line option to frontend action.
static bool checkVerifyPrefixes(const std::vector< std::string > &VerifyPrefixes, DiagnosticsEngine &Diags)
static SanitizerMaskCutoffs parseSanitizerWeightedKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags)
static ShowColorsKind parseShowColorsMode(const ArgList &Args, bool DefaultColor)
static void GenerateAPINotesArgs(const APINotesOptions &Opts, ArgumentConsumer Consumer)
static bool isCodeGenAction(frontend::ActionKind Action)
static std::optional< bool > normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, const ArgList &Args, DiagnosticsEngine &)
static void GenerateFileSystemArgs(const FileSystemOptions &Opts, ArgumentConsumer Consumer)
static bool IsInputCompatibleWithStandard(InputKind IK, const LangStandard &S)
Check if input file kind and language standard are compatible.
static void denormalizeStringImpl(ArgumentConsumer Consumer, const Twine &Spelling, Option::OptionClass OptClass, unsigned, const Twine &Value)
static llvm::StringRef lookupStrInTable(unsigned Offset)
static bool ParseSSAFArgs(ssaf::SSAFOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void GeneratePreprocessorArgs(const PreprocessorOptions &Opts, ArgumentConsumer Consumer, const LangOptions &LangOpts, const FrontendOptions &FrontendOpts, const CodeGenOptions &CodeGenOpts)
static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, bool &IsHeaderFile)
static auto makeBooleanOptionDenormalizer(bool Value)
static void GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, ArgumentConsumer Consumer, frontend::ActionKind Action)
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action)
static std::string serializeXRayInstrumentationBundle(const XRayInstrSet &S)
static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static void ParseAPINotesArgs(APINotesOptions &Opts, ArgList &Args, DiagnosticsEngine &diags)
static void denormalizeStringVector(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, const std::vector< std::string > &Values)
static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action, bool ShowLineMarkers)
static Expected< std::optional< uint32_t > > parseToleranceOption(StringRef Arg)
static std::optional< std::vector< std::string > > normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &)
static void GenerateAnalyzerArgs(const AnalyzerOptions &Opts, ArgumentConsumer Consumer)
static void GenerateOptimizationRemark(ArgumentConsumer Consumer, OptSpecifier OptEQ, StringRef Name, const CodeGenOptions::OptRemark &Remark)
Generate a remark argument. This is an inverse of ParseOptimizationRemark.
static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action)
llvm::function_ref< void( CompilerInvocation &, SmallVectorImpl< const char * > &, CompilerInvocation::StringAllocator)> GenerateFn
static bool RoundTrip(ParseFn Parse, GenerateFn Generate, CompilerInvocation &RealInvocation, CompilerInvocation &DummyInvocation, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0, bool CheckAgainstOriginalInvocation=false, bool ForceRoundTrip=false)
May perform round-trip of command line arguments.
static void denormalizeSimpleEnum(ArgumentConsumer Consumer, unsigned SpellingOffset, Option::OptionClass OptClass, unsigned TableIndex, T Value)
std::shared_ptr< T > make_shared_copy(const T &X)
llvm::function_ref< bool(CompilerInvocation &, ArrayRef< const char * >, DiagnosticsEngine &, const char *)> ParseFn
static bool parseTestModuleFileExtensionArg(StringRef Arg, std::string &BlockName, unsigned &MajorVersion, unsigned &MinorVersion, bool &Hashed, std::string &UserInfo)
Parse the argument to the -ftest-module-file-extension command-line argument.
static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static void GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, ArgumentConsumer Consumer)
static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config, StringRef OptionName, StringRef DefaultVal)
static bool FixupInvocation(CompilerInvocation &Invocation, DiagnosticsEngine &Diags, const ArgList &Args, InputKind IK)
static void parseSanitizerKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags, SanitizerSet &S)
static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts, ArgumentConsumer Consumer)
Defines the clang::FileSystemOptions interface.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines types useful for describing an Objective-C runtime.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SanitizerKind enum.
Defines the clang::SourceLocation class and associated facilities.
#define CXXABI(Name, Str)
Defines the clang::TargetOptions class.
Defines version macros and version-related utility functions for Clang.
Defines the clang::XRayInstrKind enum.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Tracks various options which control how API notes are found and handled.
llvm::VersionTuple SwiftVersion
The Swift version which should be used for API notes.
std::vector< std::string > ModuleSearchPaths
The set of search paths where we API notes can be found for particular modules.
Stores options for the analyzer from the command line.
static std::vector< StringRef > getRegisteredPackages(bool IncludeExperimental=false)
Retrieves the list of packages generated from Checkers.td.
std::vector< std::pair< std::string, bool > > CheckersAndPackages
Pairs of checker/package name and enable/disable.
std::vector< std::string > SilencedCheckersAndPackages
Vector of checker/package names which will not emit warnings.
AnalysisDiagClients AnalysisDiagOpt
AnalysisConstraints AnalysisConstraintsOpt
ConfigTable Config
A key-value table of use-specified configuration values.
unsigned ShouldEmitErrorsOnInvalidConfigValue
AnalysisPurgeMode AnalysisPurgeOpt
bool isUnknownAnalyzerConfig(llvm::StringRef Name)
static std::vector< StringRef > getRegisteredCheckers(bool IncludeExperimental=false)
Retrieves the list of checkers generated from Checkers.td.
llvm::StringMap< std::string > ConfigTable
std::string FullCompilerInvocation
Store full compiler invocation for reproducible instructions in the generated report.
AnalysisInliningMode InliningMode
The mode of function selection used during inlining.
static bool isBuiltinFunc(llvm::StringRef Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::SmallVector< std::pair< std::string, std::string >, 0 > CoveragePrefixMap
Prefix replacement map for source-based code coverage to remap source file paths in coverage mapping.
SanitizerSet SanitizeMergeHandlers
Set of sanitizer checks that can merge handlers (smaller code size at the expense of debuggability).
std::string StackUsageFile
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
llvm::SmallVector< std::pair< std::string, std::string >, 0 > DebugPrefixMap
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
std::string BinutilsVersion
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
std::optional< uint64_t > DiagnosticsHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
char CoverageVersion[4]
The version string to put into coverage files.
std::string HLSLRecordCommandLine
The string containing the commandline for the dx.source.args metadata, if non-empty.
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
uint64_t LargeDataThreshold
The code model-specific large data threshold to use (-mlarge-data-threshold).
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::string CodeModel
The code model to use (-mcmodel).
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::optional< uint32_t > DiagnosticsMisExpectTolerance
The maximum percentage profiling weights can deviate from the expected values in order to be included...
std::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
bool hasSanitizeCoverage() const
SanitizerSet SanitizeAnnotateDebugInfo
Set of sanitizer checks, for which the instrumentation will be annotated with extra debug info.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
bool hasReducedDebugInfo() const
Check if type and variable info should be emitted.
OptRemark OptimizationRemark
Selected optimizations for which we should enable optimization remarks.
std::string ThinLTOIndexFile
Name of the function summary index file to use for ThinLTO function importing.
const char * Argv0
Executable and command-line used to create a given CompilerInvocation.
llvm::SmallVector< llvm::SmallString< 8 > > HLSLParsedCommandLine
The vector contains parsed commandline for the dx.source.args metadata, if parsing was successful.
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
OptRemark OptimizationRemarkAnalysis
Selected optimizations for which we should enable optimization analyses.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
std::string SaveDynDbgTempsFilePrefix
Prefix to use for -save-dynamic-debugging-temps output.
The base class of CompilerInvocation.
std::shared_ptr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::shared_ptr< AnalyzerOptions > AnalyzerOpts
Options controlling the static analyzer.
std::shared_ptr< MigratorOptions > MigratorOpts
std::shared_ptr< PreprocessorOutputOptions > PreprocessorOutputOpts
Options controlling preprocessed output.
std::shared_ptr< APINotesOptions > APINotesOpts
Options controlling API notes.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
const FrontendOptions & getFrontendOpts() const
std::shared_ptr< ssaf::SSAFOptions > SSAFOpts
Options controlling the Scalable Static Analysis Framework (SSAF).
const CodeGenOptions & getCodeGenOpts() const
llvm::function_ref< const char *(const Twine &)> StringAllocator
Command line generation.
const FileSystemOptions & getFileSystemOpts() const
std::shared_ptr< PreprocessorOptions > PPOpts
Options controlling the preprocessor (aside from #include handling).
const PreprocessorOutputOptions & getPreprocessorOutputOpts() const
const ssaf::SSAFOptions & getSSAFOpts() const
std::vector< std::string > getCC1CommandLine() const
Generate cc1-compatible command line arguments from this instance, wrapping the result as a std::vect...
std::shared_ptr< FileSystemOptions > FSOpts
Options controlling file system operations.
const AnalyzerOptions & getAnalyzerOpts() const
const MigratorOptions & getMigratorOpts() const
void generateCC1CommandLine(llvm::SmallVectorImpl< const char * > &Args, StringAllocator SA) const
Generate cc1-compatible command line arguments from this instance.
CompilerInvocationBase & deep_copy_assign(const CompilerInvocationBase &X)
const DependencyOutputOptions & getDependencyOutputOpts() const
CompilerInvocationBase & shallow_copy_assign(const CompilerInvocationBase &X)
const TargetOptions & getTargetOpts() const
std::shared_ptr< CodeGenOptions > CodeGenOpts
Options controlling IRgen and the backend.
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
const APINotesOptions & getAPINotesOpts() const
const HeaderSearchOptions & getHeaderSearchOpts() const
std::shared_ptr< HeaderSearchOptions > HSOpts
Options controlling the #include directive.
const PreprocessorOptions & getPreprocessorOpts() const
const DiagnosticOptions & getDiagnosticOpts() const
const LangOptions & getLangOpts() const
Const getters.
std::shared_ptr< FrontendOptions > FrontendOpts
Options controlling the frontend itself.
llvm::function_ref< void(const Twine &)> ArgumentConsumer
std::shared_ptr< DependencyOutputOptions > DependencyOutputOpts
Options controlling dependency output.
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
void clearImplicitModuleBuildOptions()
Disable implicit modules and canonicalize options that are only used by implicit modules.
MigratorOptions & getMigratorOpts()
AnalyzerOptions & getAnalyzerOpts()
APINotesOptions & getAPINotesOpts()
static bool CreateFromArgs(CompilerInvocation &Res, ArrayRef< const char * > CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Create a compiler invocation from a list of input options.
ssaf::SSAFOptions & getSSAFOpts()
LangOptions & getLangOpts()
Mutable getters.
static bool checkCC1RoundTrip(ArrayRef< const char * > Args, DiagnosticsEngine &Diags, const char *Argv0=nullptr)
Check that Args can be parsed and re-serialized without change, emiting diagnostics for any differenc...
DependencyOutputOptions & getDependencyOutputOpts()
CompilerInvocation()=default
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
FrontendOptions & getFrontendOpts()
FileSystemOptions & getFileSystemOpts()
CompilerInvocation & operator=(const CompilerInvocation &X)
static void setDefaultPointerAuthOptions(PointerAuthOptions &Opts, const LangOptions &LangOpts, const llvm::Triple &Triple)
Populate Opts with the default set of pointer authentication-related options given LangOpts and Tripl...
CodeGenOptions & getCodeGenOpts()
TargetOptions & getTargetOpts()
std::string computeContextHash() const
Compute the context hash - a string that uniquely identifies compiler settings.
HeaderSearchOptions & getHeaderSearchOpts()
DiagnosticOptions & getDiagnosticOpts()
PreprocessorOutputOptions & getPreprocessorOutputOpts()
Same as CompilerInvocation, but with copy-on-write optimization.
FrontendOptions & getMutFrontendOpts()
LangOptions & getMutLangOpts()
Mutable getters.
HeaderSearchOptions & getMutHeaderSearchOpts()
MigratorOptions & getMutMigratorOpts()
PreprocessorOptions & getMutPreprocessorOpts()
APINotesOptions & getMutAPINotesOpts()
PreprocessorOutputOptions & getMutPreprocessorOutputOpts()
CodeGenOptions & getMutCodeGenOpts()
TargetOptions & getMutTargetOpts()
FileSystemOptions & getMutFileSystemOpts()
AnalyzerOptions & getMutAnalyzerOpts()
void visitMutPaths(llvm::function_ref< VisitMutResult(StringRef, std::string &)> Cb)
Visits paths stored in the invocation, allowing the callback to mutate them via the out-param.
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
CowCompilerInvocation()=default
void visitPaths(llvm::function_ref< VisitConstResult(StringRef)> Cb) const
Visits paths stored in the invocation.
ssaf::SSAFOptions & getMutSSAFOpts()
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
HeaderIncludeFormatKind HeaderIncludeFormat
The format of header information.
std::string OutputFile
The file to write dependency output to.
HeaderIncludeFilteringKind HeaderIncludeFiltering
Determine whether header information should be filtered.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
unsigned IncludeSystemHeaders
Include system header dependencies.
static llvm::IntrusiveRefCntPtr< DiagnosticIDs > create()
Options for controlling the compiler diagnostics engine.
std::string DiagnosticSuppressionMappingsFile
Path for the file that defines diagnostic suppression mappings.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > VerifyPrefixes
The prefixes for comment directives sought by -verify ("expected" by default).
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setClient(DiagnosticConsumer *client, bool ShouldOwnClient=true)
Set the diagnostic client associated with this diagnostic object.
unsigned getNumErrors() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
unsigned getNumWarnings() const
Keeps track of options that affect how file operations are performed.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input.
unsigned ClangIRDisablePasses
Disable Clang IR specific (CIR) passes.
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)