29#include "clang/Config/config.h"
43#include "llvm/ADT/APInt.h"
44#include "llvm/ADT/ArrayRef.h"
45#include "llvm/ADT/CachedHashString.h"
46#include "llvm/ADT/FloatingPointMode.h"
47#include "llvm/ADT/STLExtras.h"
48#include "llvm/ADT/SmallVector.h"
49#include "llvm/ADT/StringRef.h"
50#include "llvm/ADT/StringSwitch.h"
51#include "llvm/ADT/Twine.h"
52#include "llvm/Config/llvm-config.h"
53#include "llvm/Frontend/Debug/Options.h"
54#include "llvm/IR/DebugInfoMetadata.h"
55#include "llvm/Linker/Linker.h"
56#include "llvm/MC/MCTargetOptions.h"
57#include "llvm/Option/Arg.h"
58#include "llvm/Option/ArgList.h"
59#include "llvm/Option/OptSpecifier.h"
60#include "llvm/Option/OptTable.h"
61#include "llvm/Option/Option.h"
62#include "llvm/ProfileData/InstrProfReader.h"
63#include "llvm/Remarks/HotnessThresholdParser.h"
64#include "llvm/Support/CodeGen.h"
65#include "llvm/Support/Compiler.h"
66#include "llvm/Support/Error.h"
67#include "llvm/Support/ErrorHandling.h"
68#include "llvm/Support/ErrorOr.h"
69#include "llvm/Support/FileSystem.h"
70#include "llvm/Support/HashBuilder.h"
71#include "llvm/Support/MathExtras.h"
72#include "llvm/Support/MemoryBuffer.h"
73#include "llvm/Support/Path.h"
74#include "llvm/Support/Process.h"
75#include "llvm/Support/Regex.h"
76#include "llvm/Support/VersionTuple.h"
77#include "llvm/Support/VirtualFileSystem.h"
78#include "llvm/Support/raw_ostream.h"
79#include "llvm/Target/TargetOptions.h"
80#include "llvm/TargetParser/Host.h"
81#include "llvm/TargetParser/Triple.h"
109 if (Arg.getAsInteger(10, Val))
110 return llvm::createStringError(llvm::inconvertibleErrorCode(),
111 "Not an integer: %s", Arg.data());
120 return std::make_shared<T>(
X);
191 if (Storage.use_count() > 1)
192 Storage = std::make_shared<T>(*Storage);
255#define OPTTABLE_STR_TABLE_CODE
256#include "clang/Options/Options.inc"
257#undef OPTTABLE_STR_TABLE_CODE
260 return OptionStrTable[Offset];
263#define SIMPLE_ENUM_VALUE_TABLE
264#include "clang/Options/Options.inc"
265#undef SIMPLE_ENUM_VALUE_TABLE
271 if (Args.hasArg(Opt))
280 if (Args.hasArg(Opt))
290 unsigned SpellingOffset, Option::OptionClass,
295 const Twine &Spelling, Option::OptionClass,
301 return !std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
305 std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
307 return [
Value](OptSpecifier Opt,
unsigned,
const ArgList &Args,
309 if (Args.hasArg(Opt))
316 std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
322 OptSpecifier OtherOpt) {
323 return [
Value, OtherValue,
324 OtherOpt](OptSpecifier Opt,
unsigned,
const ArgList &Args,
326 if (
const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
327 return A->getOption().matches(Opt) ?
Value : OtherValue;
335 Option::OptionClass,
unsigned,
bool KeyPath) {
336 if (KeyPath ==
Value)
342 const Twine &Spelling,
343 Option::OptionClass OptClass,
unsigned,
344 const Twine &
Value) {
346 case Option::SeparateClass:
347 case Option::JoinedOrSeparateClass:
348 case Option::JoinedAndSeparateClass:
352 case Option::JoinedClass:
353 case Option::CommaJoinedClass:
354 Consumer(Spelling +
Value);
357 llvm_unreachable(
"Cannot denormalize an option with option class "
358 "incompatible with string denormalization.");
365 Option::OptionClass OptClass,
unsigned TableIndex, T
Value) {
367 TableIndex, Twine(
Value));
372 Option::OptionClass OptClass,
unsigned TableIndex,
377static std::optional<SimpleEnumValue>
379 for (
int I = 0, E = Table.Size; I != E; ++I)
380 if (Name == Table.Table[I].Name)
381 return Table.Table[I];
386static std::optional<SimpleEnumValue>
388 for (
int I = 0, E = Table.Size; I != E; ++I)
390 return Table.Table[I];
399 assert(TableIndex < SimpleEnumValueTablesSize);
400 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
402 auto *Arg = Args.getLastArg(Opt);
406 StringRef ArgValue = Arg->getValue();
408 return MaybeEnumVal->Value;
410 Diags.
Report(diag::err_drv_invalid_value)
411 << Arg->getAsString(Args) << ArgValue;
416 unsigned SpellingOffset,
417 Option::OptionClass OptClass,
418 unsigned TableIndex,
unsigned Value) {
419 assert(TableIndex < SimpleEnumValueTablesSize);
420 const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
423 TableIndex, MaybeEnumVal->Name);
425 llvm_unreachable(
"The simple enum value was not correctly defined in "
426 "the tablegen option description");
432 unsigned SpellingOffset,
433 Option::OptionClass OptClass,
434 unsigned TableIndex, T
Value) {
436 TableIndex,
static_cast<unsigned>(
Value));
443 auto *Arg = Args.getLastArg(Opt);
446 return std::string(Arg->getValue());
449template <
typename IntTy>
453 auto *Arg = Args.getLastArg(Opt);
457 if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
458 Diags.
Report(diag::err_drv_invalid_int_value)
459 << Arg->getAsString(Args) << Arg->getValue();
465static std::optional<std::vector<std::string>>
468 return Args.getAllArgValues(Opt);
472 unsigned SpellingOffset,
473 Option::OptionClass OptClass,
475 const std::vector<std::string> &Values) {
477 case Option::CommaJoinedClass: {
478 std::string CommaJoinedValue;
479 if (!Values.empty()) {
480 CommaJoinedValue.append(Values.front());
481 for (
const std::string &
Value : llvm::drop_begin(Values, 1)) {
482 CommaJoinedValue.append(
",");
483 CommaJoinedValue.append(
Value);
487 Option::OptionClass::JoinedClass, TableIndex,
491 case Option::JoinedClass:
492 case Option::SeparateClass:
493 case Option::JoinedOrSeparateClass:
494 for (
const std::string &
Value : Values)
498 llvm_unreachable(
"Cannot denormalize an option with option class "
499 "incompatible with string vector denormalization.");
507 auto *Arg = Args.getLastArg(Opt);
510 return llvm::Triple::normalize(Arg->getValue());
513template <
typename T,
typename U>
515 return static_cast<T
>(
Value);
519 return KeyPath |
Value;
526template <
typename T,
typename U, U Value>
531#define PARSE_OPTION_WITH_MARSHALLING( \
532 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \
533 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
534 METAVAR, VALUES, SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
535 DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
536 MERGER, EXTRACTOR, TABLE_INDEX) \
537 if ((VISIBILITY) & options::CC1Option) { \
538 KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
540 KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
542 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
544 MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
549#define GENERATE_OPTION_WITH_MARSHALLING( \
550 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \
551 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \
552 SUBCOMMANDIDS_OFFSET, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
553 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
555 if ((VISIBILITY) & options::CC1Option) { \
556 [&](const auto &Extracted) { \
559 static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
560 : (DEFAULT_VALUE)))) \
561 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \
562 TABLE_INDEX, Extracted); \
563 }(EXTRACTOR(KEYPATH)); \
577 CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
578 CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
579 CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
580 CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
583 CodeGenOpts.ClearASTBeforeBackend =
false;
585 LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
586 LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
589 llvm::Triple T(TargetOpts.
Triple);
590 llvm::Triple::ArchType
Arch = T.getArch();
595 if (CodeGenOpts.getExceptionHandling() !=
597 T.isWindowsMSVCEnvironment())
598 Diags.
Report(diag::err_fe_invalid_exception_model)
599 <<
static_cast<unsigned>(CodeGenOpts.getExceptionHandling()) << T.str();
601 if (LangOpts.AppleKext && !LangOpts.CPlusPlus)
602 Diags.
Report(diag::warn_c_kext);
604 if (LangOpts.NewAlignOverride &&
605 !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
606 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
607 Diags.
Report(diag::err_fe_invalid_alignment)
608 << A->getAsString(Args) << A->getValue();
609 LangOpts.NewAlignOverride = 0;
614 if (LangOpts.CPlusPlus11) {
615 if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
616 Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
617 Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
618 <<
bool(LangOpts.RawStringLiterals);
622 LangOpts.RawStringLiterals =
true;
625 if (Args.hasArg(OPT_freflection) && !LangOpts.CPlusPlus26) {
626 Diags.
Report(diag::err_drv_reflection_requires_cxx26)
627 << Args.getLastArg(options::OPT_freflection)->getAsString(Args);
630 LangOpts.NamedLoops =
631 Args.hasFlag(OPT_fnamed_loops, OPT_fno_named_loops, LangOpts.C2y);
634 if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
635 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device"
638 if (Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
639 Diags.
Report(diag::err_drv_argument_not_allowed_with)
642 if (Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
643 Diags.
Report(diag::err_drv_argument_not_allowed_with)
646 if (Args.hasArg(OPT_fdx_rootsignature_version) && !LangOpts.HLSL)
647 Diags.
Report(diag::err_drv_argument_not_allowed_with)
650 if (Args.hasArg(OPT_fdx_rootsignature_define) && !LangOpts.HLSL)
651 Diags.
Report(diag::err_drv_argument_not_allowed_with)
654 if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
655 Diags.
Report(diag::warn_ignored_hip_only_option)
656 << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
658 if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
659 Diags.
Report(diag::warn_ignored_hip_only_option)
660 << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
666 if (!llvm::is_contained(Warnings,
"conversion"))
667 Warnings.insert(Warnings.begin(),
"conversion");
668 if (!llvm::is_contained(Warnings,
"vector-conversion"))
669 Warnings.insert(Warnings.begin(),
"vector-conversion");
670 if (!llvm::is_contained(Warnings,
"matrix-conversion"))
671 Warnings.insert(Warnings.begin(),
"matrix-conversion");
681 if (Args.hasArg(OPT_ffp_eval_method_EQ)) {
682 if (LangOpts.ApproxFunc)
683 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
684 if (LangOpts.AllowFPReassoc)
685 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
686 if (LangOpts.AllowRecip)
687 Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
693 if (Args.getLastArg(OPT_cl_strict_aliasing) &&
695 Diags.
Report(diag::warn_option_invalid_ocl_version)
697 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
699 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
700 auto DefaultCC = LangOpts.getDefaultCallingConv();
704 Arch != llvm::Triple::x86;
710 Diags.
Report(diag::err_drv_argument_not_allowed_with)
711 << A->getSpelling() << T.getTriple();
722 llvm::opt::OptSpecifier OptSpecifier) {
725 Option::OptionClass::FlagClass, 0);
729 llvm::opt::OptSpecifier OptSpecifier,
730 const Twine &
Value) {
768 bool CheckAgainstOriginalInvocation =
false,
769 bool ForceRoundTrip =
false) {
771 bool DoRoundTripDefault =
true;
773 bool DoRoundTripDefault =
false;
776 bool DoRoundTrip = DoRoundTripDefault;
777 if (ForceRoundTrip) {
780 for (
const auto *Arg : CommandLineArgs) {
781 if (Arg == StringRef(
"-round-trip-args"))
783 if (Arg == StringRef(
"-no-round-trip-args"))
791 return Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
796 llvm::raw_string_ostream OS(Buffer);
797 for (
const char *Arg : Args) {
798 llvm::sys::printArg(OS, Arg,
true);
811 if (!
Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
818 auto Success =
Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
824 Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
825 Diags.
Report(diag::note_cc1_round_trip_original)
826 << SerializeArgs(CommandLineArgs);
831 llvm::BumpPtrAllocator Alloc;
832 llvm::StringSaver StringPool(Alloc);
833 auto SA = [&StringPool](
const Twine &Arg) {
834 return StringPool.save(Arg).data();
841 Generate(DummyInvocation, GeneratedArgs, SA);
847 bool Success2 =
Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
852 Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
853 Diags.
Report(diag::note_cc1_round_trip_generated)
854 << 1 << SerializeArgs(GeneratedArgs);
859 if (CheckAgainstOriginalInvocation)
861 ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
865 Generate(RealInvocation, ComparisonArgs, SA);
870 return llvm::equal(A, B, [](
const char *AElem,
const char *BElem) {
871 return StringRef(AElem) == StringRef(BElem);
878 if (!
Equal(GeneratedArgs, ComparisonArgs)) {
879 Diags.
Report(diag::err_cc1_round_trip_mismatch);
880 Diags.
Report(diag::note_cc1_round_trip_generated)
881 << 1 << SerializeArgs(GeneratedArgs);
882 Diags.
Report(diag::note_cc1_round_trip_generated)
883 << 2 << SerializeArgs(ComparisonArgs);
887 Diags.
Report(diag::remark_cc1_round_trip_generated)
888 << 1 << SerializeArgs(GeneratedArgs);
889 Diags.
Report(diag::remark_cc1_round_trip_generated)
890 << 2 << SerializeArgs(ComparisonArgs);
902 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
906 Args.push_back(
"-cc1");
909 DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
914 OptSpecifier GroupWithValue,
915 std::vector<std::string> &Diagnostics) {
916 for (
auto *A : Args.filtered(Group)) {
917 if (A->getOption().getKind() == Option::FlagClass) {
920 Diagnostics.push_back(
921 std::string(A->getOption().getName().drop_front(1)));
922 }
else if (A->getOption().matches(GroupWithValue)) {
925 Diagnostics.push_back(
926 std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
929 Diagnostics.push_back(A->getValue());
940 std::vector<std::string> &Funcs) {
941 std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
943 Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
950#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
951 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
952#include "clang/Options/Options.inc"
953#undef ANALYZER_OPTION_WITH_MARSHALLING
957#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
959 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \
961#include "clang/StaticAnalyzer/Core/Analyses.def"
963 llvm_unreachable(
"Tried to generate unknown analysis constraint.");
969#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
971 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \
973#include "clang/StaticAnalyzer/Core/Analyses.def"
975 llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
981#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
983 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \
985#include "clang/StaticAnalyzer/Core/Analyses.def"
987 llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
993#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
995 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \
997#include "clang/StaticAnalyzer/Core/Analyses.def"
999 llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
1005 CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1014 for (
const auto &
C : Opts.
Config)
1015 SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1016 llvm::sort(SortedConfigOpts, llvm::less_first());
1018 for (
const auto &[Key,
Value] : SortedConfigOpts) {
1021 auto Entry = ConfigOpts.
Config.find(Key);
1022 if (Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1037#define ANALYZER_OPTION_WITH_MARSHALLING(...) \
1038 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1039#include "clang/Options/Options.inc"
1040#undef ANALYZER_OPTION_WITH_MARSHALLING
1042 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1043 StringRef Name = A->getValue();
1045#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
1046 .Case(CMDFLAG, NAME##Model)
1047#include "clang/StaticAnalyzer/Core/Analyses.def"
1050 Diags.
Report(diag::err_drv_invalid_value)
1051 << A->getAsString(Args) << Name;
1054 if (
Value == AnalysisConstraints::Z3ConstraintsModel) {
1055 Diags.
Report(diag::err_analyzer_not_built_with_z3);
1062 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1063 StringRef Name = A->getValue();
1065#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
1066 .Case(CMDFLAG, PD_##NAME)
1067#include "clang/StaticAnalyzer/Core/Analyses.def"
1070 Diags.
Report(diag::err_drv_invalid_value)
1071 << A->getAsString(Args) << Name;
1077 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1078 StringRef Name = A->getValue();
1080#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
1081 .Case(CMDFLAG, NAME)
1082#include "clang/StaticAnalyzer/Core/Analyses.def"
1085 Diags.
Report(diag::err_drv_invalid_value)
1086 << A->getAsString(Args) << Name;
1092 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1093 StringRef Name = A->getValue();
1095#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
1096 .Case(CMDFLAG, NAME)
1097#include "clang/StaticAnalyzer/Core/Analyses.def"
1100 Diags.
Report(diag::err_drv_invalid_value)
1101 << A->getAsString(Args) << Name;
1109 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1111 bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1114 StringRef CheckerAndPackageList = A->getValue();
1116 CheckerAndPackageList.split(CheckersAndPackages,
",");
1117 for (
const StringRef &CheckerOrPackage : CheckersAndPackages)
1123 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
1127 StringRef configList = A->getValue();
1129 configList.split(configVals,
",");
1130 for (
const auto &configVal : configVals) {
1132 std::tie(key, val) = configVal.split(
"=");
1135 diag::err_analyzer_config_no_value) << configVal;
1138 if (val.contains(
'=')) {
1140 diag::err_analyzer_config_multiple_values)
1149 Diags.
Report(diag::err_analyzer_config_unknown) << key;
1154 Opts.
Config[key] = std::string(val);
1164 for (
unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
1167 os << Args.getArgString(i);
1174 StringRef OptionName, StringRef DefaultVal) {
1175 return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
1180 StringRef &OptionField, StringRef Name,
1181 StringRef DefaultVal) {
1190 bool &OptionField, StringRef Name,
bool DefaultVal) {
1191 auto PossiblyInvalidVal =
1192 llvm::StringSwitch<std::optional<bool>>(
1195 .Case(
"false",
false)
1196 .Default(std::nullopt);
1198 if (!PossiblyInvalidVal) {
1200 Diags->
Report(diag::err_analyzer_config_invalid_input)
1201 << Name <<
"a boolean";
1203 OptionField = DefaultVal;
1205 OptionField = *PossiblyInvalidVal;
1210 unsigned &OptionField, StringRef Name,
1211 unsigned DefaultVal) {
1213 OptionField = DefaultVal;
1214 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1215 .getAsInteger(0, OptionField);
1216 if (Diags && HasFailed)
1217 Diags->
Report(diag::err_analyzer_config_invalid_input)
1218 << Name <<
"an unsigned";
1224 unsigned DefaultVal) {
1227 if (Parsed.has_value()) {
1228 OptionField = Parsed.value();
1231 if (Diags && !Parsed.has_value())
1232 Diags->
Report(diag::err_analyzer_config_invalid_input)
1233 << Name <<
"a positive";
1235 OptionField = DefaultVal;
1243#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
1244 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
1245#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...)
1246#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1248 assert(AnOpts.UserMode ==
"shallow" || AnOpts.UserMode ==
"deep");
1249 const bool InShallowMode = AnOpts.UserMode ==
"shallow";
1251#define ANALYZER_OPTION(...)
1252#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
1253 SHALLOW_VAL, DEEP_VAL) \
1254 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \
1255 InShallowMode ? SHALLOW_VAL : DEEP_VAL);
1256#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1263 if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1264 std::vector<StringRef> Checkers =
1266 std::vector<StringRef> Packages =
1270 AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1272 for (
const StringRef &CheckerOrPackage : CheckersAndPackages) {
1274 bool IsChecker = CheckerOrPackage.contains(
'.');
1275 bool IsValidName = IsChecker
1276 ? llvm::is_contained(Checkers, CheckerOrPackage)
1277 : llvm::is_contained(Packages, CheckerOrPackage);
1280 Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1281 << CheckerOrPackage;
1291 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1292 Diags->
Report(diag::err_analyzer_config_invalid_input)
1293 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
1301 if (
Remark.hasValidPattern()) {
1306 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1315 OptSpecifier OptEQ, StringRef Name) {
1318 auto InitializeResultPattern = [&Diags, &Args, &Result](
const Arg *A,
1319 StringRef Pattern) {
1320 Result.Pattern = Pattern.str();
1322 std::string RegexError;
1323 Result.Regex = std::make_shared<llvm::Regex>(Result.Pattern);
1324 if (!Result.Regex->isValid(RegexError)) {
1325 Diags.
Report(diag::err_drv_optimization_remark_pattern)
1326 << RegexError << A->getAsString(Args);
1333 for (Arg *A : Args) {
1334 if (A->getOption().matches(OPT_R_Joined)) {
1335 StringRef
Value = A->getValue();
1339 else if (
Value ==
"everything")
1341 else if (
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1343 else if (
Value ==
"no-everything")
1350 Result.Pattern =
"";
1351 Result.Regex =
nullptr;
1353 InitializeResultPattern(A,
".*");
1355 }
else if (A->getOption().matches(OptEQ)) {
1357 if (!InitializeResultPattern(A, A->getValue()))
1366 const std::vector<std::string> &Levels,
1370 for (
const auto &Level : Levels) {
1372 llvm::StringSwitch<DiagnosticLevelMask>(Level)
1380 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1388 const std::vector<std::string> &Sanitizers,
1390 for (
const auto &Sanitizer : Sanitizers) {
1393 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1407 const std::vector<std::string> &Sanitizers,
1410 for (
const auto &Sanitizer : Sanitizers) {
1412 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1421 llvm::SplitString(Bundle, BundleParts,
",");
1422 for (
const auto &B : BundleParts) {
1426 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1440 llvm::raw_string_ostream OS(Buffer);
1441 llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1447 const llvm::Triple &Triple) {
1448 assert(Triple.getArch() == llvm::Triple::aarch64);
1455 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1456 : Discrimination::None);
1459 Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1460 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1461 : Discrimination::None);
1463 if (
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1478 if (
LangOpts.PointerAuthInitFini) {
1480 Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1490 if (
LangOpts.PointerAuthBlockDescriptorPointers)
1509 if (
LangOpts.PointerAuthObjcClassROPointers)
1522 const llvm::Triple &Triple,
1524 if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1525 !LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1526 !LangOpts.AArch64JumpTableHardening)
1532void CompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions &Opts,
1534 const llvm::Triple &T,
1535 const std::string &OutputFile,
1539 if (Opts.OptimizationLevel == 0)
1542 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1544#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1545 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
1546#include "clang/Options/Options.inc"
1547#undef CODEGEN_OPTION_WITH_MARSHALLING
1549 if (Opts.OptimizationLevel > 0) {
1553 GenerateArg(Consumer, OPT_finline_hint_functions);
1558 if (Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1559 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1560 else if (!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1561 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1563 std::optional<StringRef> DebugInfoVal;
1564 switch (Opts.DebugInfo) {
1565 case llvm::codegenoptions::DebugLineTablesOnly:
1566 DebugInfoVal =
"line-tables-only";
1568 case llvm::codegenoptions::DebugDirectivesOnly:
1569 DebugInfoVal =
"line-directives-only";
1571 case llvm::codegenoptions::DebugInfoConstructor:
1572 DebugInfoVal =
"constructor";
1574 case llvm::codegenoptions::LimitedDebugInfo:
1575 DebugInfoVal =
"limited";
1577 case llvm::codegenoptions::FullDebugInfo:
1578 DebugInfoVal =
"standalone";
1580 case llvm::codegenoptions::UnusedTypeInfo:
1581 DebugInfoVal =
"unused-types";
1583 case llvm::codegenoptions::NoDebugInfo:
1584 DebugInfoVal = std::nullopt;
1586 case llvm::codegenoptions::LocTrackingOnly:
1587 DebugInfoVal = std::nullopt;
1591 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1595 Prefix.first +
"=" + Prefix.second);
1598 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1599 Prefix.first +
"=" + Prefix.second);
1601 if (Opts.NewStructPathTBAA)
1604 if (Opts.OptimizeSize == 1)
1606 else if (Opts.OptimizeSize == 2)
1614 if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1616 else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1619 if (Opts.InterchangeLoops)
1625 GenerateArg(Consumer, OPT_fexperimental_loop_fusion);
1630 if (Opts.DebugNameTable ==
1631 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1633 else if (Opts.DebugNameTable ==
1634 static_cast<unsigned>(
1635 llvm::DICompileUnit::DebugNameTableKind::Default))
1638 if (Opts.DebugTemplateAlias)
1641 auto TNK = Opts.getDebugSimpleTemplateNames();
1642 if (TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1643 if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1644 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1645 else if (TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1646 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1651 if (Opts.TimePasses) {
1652 if (Opts.TimePassesPerRun)
1653 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1657 if (Opts.TimePassesJson)
1661 if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1664 if (Opts.PrepareForThinLTO)
1673 StringRef MemProfileBasename(
"memprof.profraw");
1694 std::string InstrBundle =
1696 if (!InstrBundle.empty())
1697 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1700 if (Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1701 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1702 else if (Opts.CFProtectionReturn)
1703 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1704 else if (Opts.CFProtectionBranch)
1705 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1707 if (Opts.CFProtectionBranch) {
1708 switch (Opts.getCFBranchLabelScheme()) {
1711#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
1712 case CFBranchLabelSchemeKind::Kind: \
1713 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
1715#include "clang/Basic/CFProtectionOptions.def"
1719 if (Opts.FunctionReturnThunks)
1720 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1723 bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1724 F.PropagateAttrs && F.Internalize;
1726 Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1730 if (Opts.EmulatedTLS)
1738 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1743 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1747 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1751 if (Opts.EnableAIXExtendedAltivecABI)
1754 if (Opts.XCOFFReadOnlyPointers)
1772 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1777 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1781 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1784 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1786 for (StringRef Sanitizer :
1788 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1790 SmallVector<std::string, 4> Values;
1792 for (std::string Sanitizer : Values)
1793 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1796 GenerateArg(Consumer, OPT_fallow_runtime_check_skip_hot_cutoff_EQ,
1800 for (StringRef Sanitizer :
1802 GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer);
1804 if (!Opts.EmitVersionIdentMetadata)
1807 switch (Opts.FiniteLoops) {
1818 if (Opts.StaticClosure)
1822bool CompilerInvocation::ParseCodeGenArgs(
CodeGenOptions &Opts, ArgList &Args,
1825 const llvm::Triple &T,
1826 const std::string &OutputFile,
1837 const LangOptions *
LangOpts = &LangOptsRef;
1839#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
1840 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
1841#include "clang/Options/Options.inc"
1842#undef CODEGEN_OPTION_WITH_MARSHALLING
1846 if (Opts.OptimizationLevel == 0) {
1848 }
else if (
const Arg *A = Args.getLastArg(options::OPT_finline_functions,
1849 options::OPT_finline_hint_functions,
1850 options::OPT_fno_inline_functions,
1851 options::OPT_fno_inline)) {
1854 if (A->getOption().matches(options::OPT_finline_functions))
1856 else if (A->getOption().matches(options::OPT_finline_hint_functions))
1866 Opts.DirectAccessExternalData =
1867 Args.hasArg(OPT_fdirect_access_external_data) ||
1868 (!Args.hasArg(OPT_fno_direct_access_external_data) &&
1871 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1873 llvm::StringSwitch<unsigned>(A->getValue())
1874 .Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1875 .Case(
"line-directives-only",
1876 llvm::codegenoptions::DebugDirectivesOnly)
1877 .Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1878 .Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1879 .Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1880 .Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1883 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1886 Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1892 Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1893 if (A->getOption().matches(OPT_fuse_ctor_homing) &&
1894 Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1895 Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1896 if (A->getOption().matches(OPT_fno_use_ctor_homing) &&
1897 Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1898 Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1901 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1902 auto Split = StringRef(Arg).split(
'=');
1906 for (
const auto &Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1907 auto Split = StringRef(Arg).split(
'=');
1911 const llvm::Triple::ArchType DebugEntryValueArchs[] = {
1912 llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1913 llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1914 llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el,
1915 llvm::Triple::riscv32, llvm::Triple::riscv64};
1918 llvm::is_contained(DebugEntryValueArchs, T.getArch()))
1919 Opts.EmitCallSiteInfo =
true;
1922 Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1927 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1928 Args.hasArg(OPT_new_struct_path_tbaa);
1930 Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1931 if (Opts.SimplifyLibCalls)
1934 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1935 (Opts.OptimizationLevel > 1));
1936 Opts.InterchangeLoops =
1937 Args.hasFlag(OPT_floop_interchange, OPT_fno_loop_interchange,
false);
1938 Opts.FuseLoops = Args.hasFlag(OPT_fexperimental_loop_fusion,
1939 OPT_fno_experimental_loop_fusion,
false);
1941 std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1943 Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1945 Opts.DebugNameTable =
static_cast<unsigned>(
1946 Args.hasArg(OPT_ggnu_pubnames)
1947 ? llvm::DICompileUnit::DebugNameTableKind::GNU
1948 : Args.hasArg(OPT_gpubnames)
1949 ? llvm::DICompileUnit::DebugNameTableKind::Default
1950 : llvm::DICompileUnit::DebugNameTableKind::None);
1951 if (
const Arg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1952 StringRef
Value = A->getValue();
1954 Diags.
Report(diag::err_drv_unsupported_option_argument)
1955 << A->getSpelling() << A->getValue();
1956 Opts.setDebugSimpleTemplateNames(
1957 StringRef(A->getValue()) ==
"simple"
1958 ? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1959 : llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1962 if (Args.hasArg(OPT_ftime_report, OPT_ftime_report_EQ, OPT_ftime_report_json,
1963 OPT_stats_file_timers)) {
1964 Opts.TimePasses =
true;
1967 if (
const Arg *EQ = Args.getLastArg(OPT_ftime_report_EQ)) {
1968 StringRef Val =
EQ->getValue();
1969 if (Val ==
"per-pass")
1970 Opts.TimePassesPerRun =
false;
1971 else if (Val ==
"per-pass-run")
1972 Opts.TimePassesPerRun =
true;
1974 Diags.
Report(diag::err_drv_invalid_value)
1975 <<
EQ->getAsString(Args) <<
EQ->getValue();
1978 if (Args.getLastArg(OPT_ftime_report_json))
1979 Opts.TimePassesJson =
true;
1982 Opts.PrepareForLTO =
false;
1983 Opts.PrepareForThinLTO =
false;
1984 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1985 Opts.PrepareForLTO =
true;
1986 StringRef S = A->getValue();
1988 Opts.PrepareForThinLTO =
true;
1989 else if (S !=
"full")
1990 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1991 if (Args.hasArg(OPT_funified_lto))
1992 Opts.PrepareForThinLTO =
true;
1994 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
1996 Diags.
Report(diag::err_drv_argument_only_allowed_with)
1997 << A->getAsString(Args) <<
"-x ir";
1999 std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2001 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2003 llvm::StringSwitch<std::string>(A->getValue())
2004 .Case(
"obj", OutputFile)
2005 .Default(llvm::sys::path::filename(OutputFile).str());
2008 const char *MemProfileBasename =
"memprof.profraw";
2009 if (Args.hasArg(OPT_fmemory_profile_EQ)) {
2010 SmallString<128> Path(Args.getLastArgValue(OPT_fmemory_profile_EQ));
2011 llvm::sys::path::append(Path, MemProfileBasename);
2013 }
else if (Args.hasArg(OPT_fmemory_profile))
2017 if (Args.hasArg(OPT_coverage_version_EQ)) {
2018 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2019 if (CoverageVersion.size() != 4) {
2020 Diags.
Report(diag::err_drv_invalid_value)
2021 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2031 for (
const auto &A : Args) {
2033 if (A->getOption().getID() == options::OPT_o ||
2034 A->getOption().getID() == options::OPT_INPUT ||
2035 A->getOption().getID() == options::OPT_x ||
2036 A->getOption().getID() == options::OPT_fembed_bitcode ||
2037 A->getOption().matches(options::OPT_W_Group))
2040 A->render(Args, ASL);
2041 for (
const auto &arg : ASL) {
2042 StringRef ArgStr(arg);
2043 llvm::append_range(Opts.
CmdArgs, ArgStr);
2049 auto XRayInstrBundles =
2050 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2051 if (XRayInstrBundles.empty())
2054 for (
const auto &A : XRayInstrBundles)
2058 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2059 StringRef Name = A->getValue();
2060 if (Name ==
"full") {
2061 Opts.CFProtectionReturn = 1;
2062 Opts.CFProtectionBranch = 1;
2063 }
else if (Name ==
"return")
2064 Opts.CFProtectionReturn = 1;
2065 else if (Name ==
"branch")
2066 Opts.CFProtectionBranch = 1;
2067 else if (Name !=
"none")
2068 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2071 if (Opts.CFProtectionBranch && T.isRISCV()) {
2072 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2074 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2075#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
2076 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
2077#include "clang/Basic/CFProtectionOptions.def"
2080 Opts.setCFBranchLabelScheme(Scheme);
2082 Diags.
Report(diag::err_drv_invalid_value)
2083 << A->getAsString(Args) << A->getValue();
2087 if (
const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2088 auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2089 .Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2090 .Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2091 .Default(llvm::FunctionReturnThunksKind::Invalid);
2094 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2095 << A->getSpelling() << T.getTriple();
2096 else if (Val == llvm::FunctionReturnThunksKind::Invalid)
2097 Diags.
Report(diag::err_drv_invalid_value)
2098 << A->getAsString(Args) << A->getValue();
2099 else if (Val == llvm::FunctionReturnThunksKind::Extern &&
2100 Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2101 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2102 << A->getAsString(Args)
2103 << Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2105 Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2109 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2110 CodeGenOptions::BitcodeFileToLink F;
2112 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2113 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
2122 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2123 StringRef Val = A->getValue();
2127 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2130 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2131 StringRef Val = A->getValue();
2134 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2140 Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2141 OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2145 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2146 << A->getSpelling() << T.str();
2148 const Option &O = A->getOption();
2149 if (O.matches(OPT_fpcc_struct_return) ||
2150 O.matches(OPT_maix_struct_return)) {
2153 assert(O.matches(OPT_freg_struct_return) ||
2154 O.matches(OPT_msvr4_struct_return));
2159 if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2161 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2162 << A->getSpelling() << T.str();
2172 if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2173 Diags.
Report(diag::err_roptr_requires_data_sections);
2175 Opts.XCOFFReadOnlyPointers =
true;
2178 if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2179 if (!T.isOSAIX() || T.isPPC32())
2180 Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2181 << A->getSpelling() << T.str();
2184 bool NeedLocTracking =
false;
2187 NeedLocTracking =
true;
2189 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2191 NeedLocTracking =
true;
2194 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2196 NeedLocTracking =
true;
2206 Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2216 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
2219 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2220 <<
"-fdiagnostics-show-hotness";
2224 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2226 llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2229 Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2230 <<
"-fdiagnostics-hotness-threshold=";
2236 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2237 <<
"-fdiagnostics-hotness-threshold=";
2242 Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2246 Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2247 <<
"-fdiagnostics-misexpect-tolerance=";
2253 Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2254 <<
"-fdiagnostics-misexpect-tolerance=";
2261 if (UsingSampleProfile)
2262 NeedLocTracking =
true;
2265 NeedLocTracking =
true;
2269 if (NeedLocTracking &&
2270 Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2271 Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2276 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2279 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2282 Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2287 "-fsanitize-skip-hot-cutoff=",
2288 Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2291 "-fsanitize-annotate-debug-info=",
2292 Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags,
2296 Args.getLastArgValue(OPT_fallow_runtime_check_skip_hot_cutoff_EQ);
2299 if (
V.getAsDouble(A) || A < 0.0 || A > 1.0) {
2300 Diags.
Report(diag::err_drv_invalid_value)
2301 <<
"-fallow-runtime-check-skip-hot-cutoff=" <<
V;
2307 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2312 if (Args.hasArg(options::OPT_ffinite_loops))
2314 else if (Args.hasArg(options::OPT_fno_finite_loops))
2317 Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2318 options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2319 if (!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2320 Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2322 Opts.StaticClosure = Args.hasArg(options::OPT_static_libclosure);
2330#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2331 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2332#include "clang/Options/Options.inc"
2333#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2338 for (
const auto &Dep : Opts.
ExtraDeps) {
2339 switch (Dep.second) {
2352 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2361 bool ShowLineMarkers) {
2365#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \
2366 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2367#include "clang/Options/Options.inc"
2368#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
2370 if (Args.hasArg(OPT_show_includes)) {
2385 if (!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2386 for (
const auto *A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2387 StringRef Val = A->getValue();
2388 if (!Val.contains(
'='))
2392 for (
const auto *A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2393 StringRef Val = A->getValue();
2394 if (!Val.contains(
'='))
2401 for (
const auto &Filename : Args.getAllArgValues(OPT_fprofile_list_EQ))
2405 for (
const auto *A : Args.filtered(OPT_fdepfile_entry))
2409 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
2410 StringRef Val = A->getValue();
2411 if (!Val.contains(
'='))
2419 if (Args.hasArg(OPT_header_include_format_EQ))
2420 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2424 Diags.
Report(diag::err_drv_print_header_cc1_invalid_filtering)
2428 if (Args.hasArg(OPT_header_include_filtering_EQ))
2429 Diags.
Report(diag::err_drv_print_header_cc1_invalid_combination)
2433 Diags.
Report(diag::err_drv_print_header_cc1_invalid_format)
2449 } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
2450 for (
auto *A : Args) {
2451 const Option &O = A->getOption();
2452 if (O.matches(options::OPT_fcolor_diagnostics)) {
2453 ShowColors = Colors_On;
2454 }
else if (O.matches(options::OPT_fno_color_diagnostics)) {
2455 ShowColors = Colors_Off;
2456 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
2457 StringRef
Value(A->getValue());
2458 if (
Value ==
"always")
2459 ShowColors = Colors_On;
2460 else if (
Value ==
"never")
2461 ShowColors = Colors_Off;
2462 else if (
Value ==
"auto")
2463 ShowColors = Colors_Auto;
2466 return ShowColors == Colors_On ||
2467 (ShowColors == Colors_Auto &&
2468 llvm::sys::Process::StandardErrHasColors());
2474 for (
const auto &Prefix : VerifyPrefixes) {
2477 auto BadChar = llvm::find_if(Prefix, [](
char C) {
2480 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2482 Diags.
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
2483 Diags.
Report(diag::note_drv_verify_prefix_spelling);
2493#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2494 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2495#include "clang/Options/Options.inc"
2496#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2505#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \
2506 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2507#include "clang/Options/Options.inc"
2508#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
2516#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2517 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2518#include "clang/Options/Options.inc"
2519#undef MIGRATOR_OPTION_WITH_MARSHALLING
2528#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \
2529 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
2530#include "clang/Options/Options.inc"
2531#undef MIGRATOR_OPTION_WITH_MARSHALLING
2536void CompilerInvocationBase::GenerateDiagnosticArgs(
2538 bool DefaultDiagColor) {
2540#define DIAG_OPTION_WITH_MARSHALLING(...) \
2541 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2542#include "clang/Options/Options.inc"
2543#undef DIAG_OPTION_WITH_MARSHALLING
2546 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2549 if (Opts.ShowColors)
2552 if (Opts.VerifyDiagnostics &&
2557 if (Prefix !=
"expected")
2560 if (Opts.VerifyDirectives) {
2568 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2571 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2573 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2575 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2577 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2582 if (
Warning ==
"undef-prefix")
2585 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2587 Consumer(StringRef(
"-W") +
Warning);
2593 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2594 "pass-analysis",
"no-pass-analysis",
2595 "pass-missed",
"no-pass-missed"};
2596 if (llvm::is_contained(IgnoredRemarks,
Remark))
2599 Consumer(StringRef(
"-R") +
Remark);
2603 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2608std::unique_ptr<DiagnosticOptions>
2610 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2611 unsigned MissingArgIndex, MissingArgCount;
2613 Argv.slice(1), MissingArgIndex, MissingArgCount);
2615 bool ShowColors =
true;
2616 if (std::optional<std::string> NoColor =
2617 llvm::sys::Process::GetEnv(
"NO_COLOR");
2618 NoColor && !NoColor->empty()) {
2633 bool DefaultDiagColor) {
2634 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2635 std::optional<DiagnosticsEngine> IgnoringDiags;
2637 IgnoringDiagOpts.emplace();
2640 Diags = &*IgnoringDiags;
2649#define DIAG_OPTION_WITH_MARSHALLING(...) \
2650 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2651#include "clang/Options/Options.inc"
2652#undef DIAG_OPTION_WITH_MARSHALLING
2654 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2657 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2661 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2662 Opts.VerifyDirectives = Args.hasArg(OPT_verify_directives);
2664 if (Args.hasArg(OPT_verify))
2669 Opts.VerifyDiagnostics =
false;
2674 "-verify-ignore-unexpected=",
2675 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2676 if (Args.hasArg(OPT_verify_ignore_unexpected))
2678 Opts.setVerifyIgnoreUnexpected(DiagMask);
2680 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2685 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2696 unsigned DefaultOpt = 0;
2699 !Args.hasArg(OPT_cl_opt_disable))
2702 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2703 if (A->getOption().matches(options::OPT_O0))
2706 if (A->getOption().matches(options::OPT_Ofast))
2709 assert(A->getOption().matches(options::OPT_O));
2711 StringRef S(A->getValue());
2712 if (S ==
"s" || S ==
"z")
2721 unsigned MaxOptLevel = 3;
2722 if (DefaultOpt > MaxOptLevel) {
2725 Diags.
Report(diag::warn_drv_optimization_value)
2726 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2727 DefaultOpt = MaxOptLevel;
2734 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2735 if (A->getOption().matches(options::OPT_O)) {
2736 switch (A->getValue()[0]) {
2754 std::string &BlockName,
2755 unsigned &MajorVersion,
2756 unsigned &MinorVersion,
2758 std::string &UserInfo) {
2760 Arg.split(Args,
':', 5);
2761 if (Args.size() < 5)
2764 BlockName = std::string(Args[0]);
2765 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2766 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2767 if (Args[3].getAsInteger(2, Hashed))
return true;
2768 if (Args.size() > 4)
2769 UserInfo = std::string(Args[4]);
2778 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2809 OPT_emit_reduced_module_interface},
2826 OPT_print_dependency_directives_minimized_source},
2833static std::optional<frontend::ActionKind>
2836 if (ActionOpt.second == Opt.getID())
2837 return ActionOpt.first;
2839 return std::nullopt;
2843static std::optional<OptSpecifier>
2846 if (ActionOpt.first == ProgramAction)
2847 return OptSpecifier(ActionOpt.second);
2849 return std::nullopt;
2855#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2856 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2857#include "clang/Options/Options.inc"
2858#undef FRONTEND_OPTION_WITH_MARSHALLING
2860 std::optional<OptSpecifier> ProgramActionOpt =
2868 if (!ProgramActionOpt) {
2871 "Frontend action without option.");
2872 GenerateProgramAction = [&]() {
2879 GenerateProgramAction = [&]() {
2887 llvm_unreachable(
"Default AST dump format.");
2894 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2907 GenerateProgramAction = [&]() {
2912 GenerateProgramAction();
2914 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2916 for (
const auto &PluginArg : PluginArgs.second)
2918 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2919 Opt.getKind(), 0, PluginArg);
2923 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2924 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2930 for (
const auto &Plugin : Opts.
Plugins)
2936 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2949 StringRef HeaderUnit =
"";
2954 HeaderUnit =
"-user";
2957 HeaderUnit =
"-system";
2960 HeaderUnit =
"-header-unit";
2963 StringRef Header = IsHeader ?
"-header" :
"";
2986 Lang =
"objective-c";
2989 Lang =
"objective-c++";
2992 Lang =
"assembler-with-cpp";
2996 "Generating -x argument for unknown language (not precompiled).");
3011 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3015 for (
const auto &Input : Opts.
Inputs)
3016 Consumer(Input.getFile());
3025#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3026 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3027#include "clang/Options/Options.inc"
3028#undef FRONTEND_OPTION_WITH_MARSHALLING
3031 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3032 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3034 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3037 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3038 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3041 .Default(std::numeric_limits<unsigned>::max());
3043 if (Val != std::numeric_limits<unsigned>::max())
3046 Diags.
Report(diag::err_drv_invalid_value)
3047 << A->getAsString(Args) << A->getValue();
3057 Args.hasArg(OPT_interface_stub_version_EQ)
3058 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3060 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3061 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3062 ArgStr ==
"experimental-tapi-elf-v1") {
3063 std::string ErrorMessage =
3064 "Invalid interface stub format: " + ArgStr.str() +
3066 Diags.
Report(diag::err_drv_invalid_value)
3067 <<
"Must specify a valid interface stub format type, ie: "
3068 "-interface-stub-version=ifs-v1"
3071 }
else if (!ArgStr.starts_with(
"ifs-")) {
3072 std::string ErrorMessage =
3073 "Invalid interface stub format: " + ArgStr.str() +
".";
3074 Diags.
Report(diag::err_drv_invalid_value)
3075 <<
"Must specify a valid interface stub format type, ie: "
3076 "-interface-stub-version=ifs-v1"
3091 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3092 const Arg *SavedAction =
nullptr;
3093 for (
const Arg *AA :
3094 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3095 if (AA->getOption().matches(OPT_main_file_name)) {
3096 SavedAction =
nullptr;
3097 }
else if (!SavedAction) {
3100 if (!A->getOption().matches(OPT_ast_dump_EQ))
3101 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3102 << SavedAction->getSpelling() << A->getSpelling();
3109 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3110 Opts.
Plugins.emplace_back(A->getValue(0));
3114 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3115 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3117 for (
const std::string &Arg :
3118 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3119 std::string BlockName;
3120 unsigned MajorVersion;
3121 unsigned MinorVersion;
3123 std::string UserInfo;
3125 MinorVersion, Hashed, UserInfo)) {
3126 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3133 std::make_shared<TestModuleFileExtension>(
3134 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3137 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3141 Diags.
Report(diag::err_drv_invalid_value)
3142 << A->getAsString(Args) << A->getValue();
3143 Diags.
Report(diag::note_command_line_code_loc_requirement);
3147 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3148 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3149 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3151 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3152 StringRef Val = A->getValue();
3153 if (!Val.contains(
'='))
3158 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3160 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3164 if (Args.hasArg(OPT_clangir_disable_passes))
3167 if (Args.hasArg(OPT_clangir_disable_verifier))
3171 if (Args.hasArg(OPT_aux_target_cpu))
3172 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3173 if (Args.hasArg(OPT_aux_target_feature))
3177 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3178 StringRef XValue = A->getValue();
3183 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3184 bool ModuleMap = XValue.consume_back(
"-module-map");
3187 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3193 if (IsHeader || Preprocessed) {
3194 if (XValue.consume_back(
"-header-unit"))
3196 else if (XValue.consume_back(
"-system"))
3198 else if (XValue.consume_back(
"-user"))
3204 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3208 DashX = llvm::StringSwitch<InputKind>(XValue)
3224 DashX = llvm::StringSwitch<InputKind>(XValue)
3232 DashX = llvm::StringSwitch<InputKind>(XValue)
3235 .Cases({
"ast",
"pcm",
"precompiled-header"},
3242 Diags.
Report(diag::err_drv_invalid_value)
3243 << A->getAsString(Args) << A->getValue();
3250 IsHeaderFile =
true;
3251 }
else if (IsHeaderFile)
3258 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3261 Inputs.push_back(
"-");
3265 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3267 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3271 StringRef(Inputs[i]).rsplit(
'.').second);
3280 bool IsSystem =
false;
3289 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3300#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3301 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3302#include "clang/Options/Options.inc"
3303#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3312 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3319 std::optional<bool> IsFramework,
3320 std::optional<bool> IgnoreSysRoot) {
3321 return llvm::is_contained(Groups, Entry.
Group) &&
3322 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3323 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3332 OptSpecifier Opt = [It, Matches]() {
3337 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3351 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3358 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3364 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3369 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3377 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3379 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3389 ? OPT_internal_isystem
3390 : OPT_internal_externc_isystem;
3394 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3396 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3400 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3401 : OPT_no_system_header_prefix;
3415#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3416 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3417#include "clang/Options/Options.inc"
3418#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3420 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3421 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3424 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3425 StringRef Val = A->getValue();
3426 if (Val.contains(
'=')) {
3427 auto Split = Val.split(
'=');
3429 std::string(Split.first), std::string(Split.second));
3432 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3435 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3436 StringRef MacroDef = A->getValue();
3438 llvm::CachedHashString(MacroDef.split(
'=').first));
3442 bool IsSysrootSpecified =
3443 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3447 auto PrefixHeaderPath = [IsSysrootSpecified,
3448 &Opts](
const llvm::opt::Arg *A,
3449 bool IsFramework =
false) -> std::string {
3450 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3451 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3453 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3454 llvm::StringRef(A->getValue()).substr(1));
3455 return std::string(Buffer);
3457 return A->getValue();
3460 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3461 bool IsFramework = A->getOption().matches(OPT_F);
3467 StringRef Prefix =
"";
3468 for (
const auto *A :
3469 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3470 if (A->getOption().matches(OPT_iprefix))
3471 Prefix = A->getValue();
3472 else if (A->getOption().matches(OPT_iwithprefix))
3478 for (
const auto *A : Args.filtered(OPT_idirafter))
3480 for (
const auto *A : Args.filtered(OPT_iquote))
3483 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3484 if (A->getOption().matches(OPT_iwithsysroot)) {
3491 for (
const auto *A : Args.filtered(OPT_iframework))
3493 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3498 for (
const auto *A : Args.filtered(OPT_c_isystem))
3500 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3502 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3504 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3508 for (
const auto *A :
3509 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3511 if (A->getOption().matches(OPT_internal_externc_isystem))
3513 Opts.
AddPath(A->getValue(), Group,
false,
true);
3515 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3519 for (
const auto *A :
3520 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3522 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3524 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3533 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3537 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3542 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3544 diags.
Report(diag::err_drv_invalid_value)
3545 << A->getAsString(Args) << A->getValue();
3547 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3553 if (Opts.PointerAuthIntrinsics)
3555 if (Opts.PointerAuthCalls)
3557 if (Opts.PointerAuthReturns)
3559 if (Opts.PointerAuthIndirectGotos)
3560 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3561 if (Opts.PointerAuthAuthTraps)
3563 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3564 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3565 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3566 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3567 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3568 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3569 if (Opts.PointerAuthFunctionTypeDiscrimination)
3570 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3571 if (Opts.PointerAuthInitFini)
3573 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3574 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3575 if (Opts.PointerAuthELFGOT)
3577 if (Opts.AArch64JumpTableHardening)
3578 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3579 if (Opts.PointerAuthObjcIsa)
3581 if (Opts.PointerAuthObjcInterfaceSel)
3582 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3583 if (Opts.PointerAuthObjcClassROPointers)
3584 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3585 if (Opts.PointerAuthBlockDescriptorPointers)
3586 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3591 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3592 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3593 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3594 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3595 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3596 Opts.PointerAuthVTPtrAddressDiscrimination =
3597 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3598 Opts.PointerAuthVTPtrTypeDiscrimination =
3599 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3600 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3601 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3602 Opts.PointerAuthFunctionTypeDiscrimination =
3603 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3604 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3605 Opts.PointerAuthInitFiniAddressDiscrimination =
3606 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3607 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3608 Opts.AArch64JumpTableHardening =
3609 Args.hasArg(OPT_faarch64_jump_table_hardening);
3610 Opts.PointerAuthBlockDescriptorPointers =
3611 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3612 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3613 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3614 Opts.PointerAuthObjcInterfaceSel =
3615 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3617 if (Opts.PointerAuthObjcInterfaceSel)
3618 Opts.PointerAuthObjcInterfaceSelKey =
3629 llvm_unreachable(
"should not parse language flags for this input");
3664 llvm_unreachable(
"unexpected input language");
3673 return "Objective-C";
3677 return "Objective-C++";
3681 return "C++ for OpenCL";
3700 llvm_unreachable(
"unknown input language");
3703void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3705 const llvm::Triple &T,
3710 if (Opts.ObjCAutoRefCount)
3712 if (Opts.PICLevel != 0)
3713 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3717 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3718 for (StringRef Sanitizer :
3720 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3726 OptSpecifier StdOpt;
3728 case LangStandard::lang_opencl10:
3729 case LangStandard::lang_opencl11:
3730 case LangStandard::lang_opencl12:
3731 case LangStandard::lang_opencl20:
3732 case LangStandard::lang_opencl30:
3733 case LangStandard::lang_openclcpp10:
3734 case LangStandard::lang_openclcpp2021:
3735 StdOpt = OPT_cl_std_EQ;
3738 StdOpt = OPT_std_EQ;
3743 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3745 if (Opts.IncludeDefaultHeader)
3746 GenerateArg(Consumer, OPT_finclude_default_header);
3747 if (Opts.DeclareOpenCLBuiltins)
3748 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3750 const LangOptions *
LangOpts = &Opts;
3752#define LANG_OPTION_WITH_MARSHALLING(...) \
3753 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3754#include "clang/Options/Options.inc"
3755#undef LANG_OPTION_WITH_MARSHALLING
3766 else if (Opts.ObjCAutoRefCount == 1)
3769 if (Opts.ObjCWeakRuntime)
3770 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3775 if (Opts.ObjCSubscriptingLegacyRuntime)
3776 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3779 if (Opts.GNUCVersion != 0) {
3780 unsigned Major = Opts.GNUCVersion / 100 / 100;
3781 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3782 unsigned Patch = Opts.GNUCVersion % 100;
3784 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3787 if (Opts.IgnoreXCOFFVisibility)
3788 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3796 if (Opts.PointerOverflowDefined)
3799 if (Opts.MSCompatibilityVersion != 0) {
3800 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3801 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3802 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3803 GenerateArg(Consumer, OPT_fms_compatibility_version,
3804 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3807 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3809 if (!Opts.Trigraphs)
3816 if (T.isOSzOS() && !Opts.ZOSExt)
3818 else if (Opts.ZOSExt)
3821 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3824 if (Opts.ConvergentFunctions)
3827 GenerateArg(Consumer, OPT_fno_convergent_functions);
3829 if (Opts.NoBuiltin && !Opts.Freestanding)
3832 if (!Opts.NoBuiltin)
3836 if (Opts.LongDoubleSize == 128)
3838 else if (Opts.LongDoubleSize == 64)
3840 else if (Opts.LongDoubleSize == 80)
3847 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3850 if (Opts.OpenMP != 51)
3851 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3853 if (!Opts.OpenMPUseTLS)
3856 if (Opts.OpenMPIsTargetDevice)
3857 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3859 if (Opts.OpenMPIRBuilder)
3860 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3863 if (Opts.OpenMPSimd) {
3866 if (Opts.OpenMP != 51)
3867 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3870 if (Opts.OpenMPThreadSubscription)
3871 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3873 if (Opts.OpenMPTeamSubscription)
3874 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3876 if (Opts.OpenMPTargetDebug != 0)
3877 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3878 Twine(Opts.OpenMPTargetDebug));
3880 if (Opts.OpenMPCUDANumSMs != 0)
3881 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3882 Twine(Opts.OpenMPCUDANumSMs));
3884 if (Opts.OpenMPCUDABlocksPerSM != 0)
3885 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3886 Twine(Opts.OpenMPCUDABlocksPerSM));
3888 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3889 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3890 Twine(Opts.OpenMPCUDAReductionBufNum));
3893 std::string Targets;
3894 llvm::raw_string_ostream
OS(Targets);
3897 [&OS](
const llvm::Triple &T) { OS << T.str(); },
",");
3898 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3901 if (Opts.OpenMPCUDAMode)
3917 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3920 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3921 for (StringRef Sanitizer :
3923 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3927 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3929 switch (Opts.getClangABICompat()) {
3930#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3931 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3932 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3934#define ABI_VER_MAJOR(Major) \
3935 case LangOptions::ClangABI::Ver##Major: \
3936 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3938#define ABI_VER_LATEST(Latest) \
3939 case LangOptions::ClangABI::Latest: \
3941#include "clang/Basic/ABIVersions.def"
3944 if (Opts.getSignReturnAddressScope() ==
3946 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3947 else if (Opts.getSignReturnAddressScope() ==
3949 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3951 if (Opts.getSignReturnAddressKey() ==
3953 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3959 if (Opts.RelativeCXXABIVTables)
3960 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3962 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3970 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3980 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
3981 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
3984 if (Opts.MatrixTypes) {
3985 if (Opts.getDefaultMatrixMemoryLayout() ==
3987 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
3988 if (Opts.getDefaultMatrixMemoryLayout() ==
3990 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
3994bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3996 std::vector<std::string> &Includes,
4006 if (Args.hasArg(OPT_fobjc_arc))
4007 Opts.ObjCAutoRefCount = 1;
4011 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4015 "-fsanitize-ignore-for-ubsan-feature=",
4016 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4027 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4030 Diags.
Report(diag::err_drv_invalid_value)
4031 << A->getAsString(Args) << A->getValue();
4033 for (
unsigned KindValue = 0;
4039 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4041 unsigned NumAliases = 0;
4042#define LANGSTANDARD(id, name, lang, desc, features, version)
4043#define LANGSTANDARD_ALIAS(id, alias) \
4044 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4045#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4046#include "clang/Basic/LangStandards.def"
4048#define LANGSTANDARD(id, name, lang, desc, features, version)
4049#define LANGSTANDARD_ALIAS(id, alias) \
4050 if (KindValue == LangStandard::lang_##id) Diag << alias;
4051#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4052#include "clang/Basic/LangStandards.def"
4060 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4068 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4070 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4071 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4072 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4073 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4074 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4075 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4076 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4077 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4078 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4079 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4083 Diags.
Report(diag::err_drv_invalid_value)
4084 << A->getAsString(Args) << A->getValue();
4087 LangStd = OpenCLLangStd;
4091 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4092 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4100#define LANG_OPTION_WITH_MARSHALLING(...) \
4101 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4102#include "clang/Options/Options.inc"
4103#undef LANG_OPTION_WITH_MARSHALLING
4105 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4106 StringRef Name = A->getValue();
4107 if (Name ==
"full") {
4108 Opts.CFProtectionBranch = 1;
4109 Opts.CFProtectionReturn = 1;
4110 }
else if (Name ==
"branch") {
4111 Opts.CFProtectionBranch = 1;
4112 }
else if (Name ==
"return") {
4113 Opts.CFProtectionReturn = 1;
4117 if (Opts.CFProtectionBranch) {
4118 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4120 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4121#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4122 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4123#include "clang/Basic/CFProtectionOptions.def"
4125 Opts.setCFBranchLabelScheme(Scheme);
4129 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4130 !Args.hasArg(OPT_sycl_std_EQ)) {
4140 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4141 StringRef value =
arg->getValue();
4143 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4146 if (Args.hasArg(OPT_fobjc_gc_only))
4148 else if (Args.hasArg(OPT_fobjc_gc))
4150 else if (Args.hasArg(OPT_fobjc_arc)) {
4151 Opts.ObjCAutoRefCount = 1;
4153 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4160 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4161 Opts.ObjCWeakRuntime = 1;
4167 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4168 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4169 assert(!Opts.ObjCWeak);
4171 Diags.
Report(diag::err_objc_weak_with_gc);
4172 }
else if (!Opts.ObjCWeakRuntime) {
4173 Diags.
Report(diag::err_objc_weak_unsupported);
4177 }
else if (Opts.ObjCAutoRefCount) {
4178 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4181 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4182 Opts.ObjCSubscriptingLegacyRuntime =
4186 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4189 VersionTuple GNUCVer;
4190 bool Invalid = GNUCVer.tryParse(A->getValue());
4191 unsigned Major = GNUCVer.getMajor();
4192 unsigned Minor = GNUCVer.getMinor().value_or(0);
4193 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4194 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4195 Diags.
Report(diag::err_drv_invalid_value)
4196 << A->getAsString(Args) << A->getValue();
4198 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4201 if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4202 Opts.IgnoreXCOFFVisibility = 1;
4204 if (Args.hasArg(OPT_ftrapv)) {
4208 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4210 else if (Args.hasArg(OPT_fwrapv))
4212 if (Args.hasArg(OPT_fwrapv_pointer))
4213 Opts.PointerOverflowDefined =
true;
4215 Opts.MSCompatibilityVersion = 0;
4216 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4218 if (VT.tryParse(A->getValue()))
4219 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4221 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4222 VT.getMinor().value_or(0) * 100000 +
4223 VT.getSubminor().value_or(0);
4231 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4234 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4237 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions, T.isOSzOS());
4239 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4240 && Opts.OpenCLVersion == 200);
4242 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4243 Opts.HLSL || T.isAMDGPU() || T.isNVPTX();
4244 Opts.ConvergentFunctions =
4245 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4246 HasConvergentOperations);
4248 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4249 if (!Opts.NoBuiltin)
4251 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4252 if (A->getOption().matches(options::OPT_mlong_double_64))
4253 Opts.LongDoubleSize = 64;
4254 else if (A->getOption().matches(options::OPT_mlong_double_80))
4255 Opts.LongDoubleSize = 80;
4256 else if (A->getOption().matches(options::OPT_mlong_double_128))
4257 Opts.LongDoubleSize = 128;
4259 Opts.LongDoubleSize = 0;
4261 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4267 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4269 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4270 << A->getSpelling() <<
"-fdefault-calling-conv";
4272 switch (T.getArch()) {
4273 case llvm::Triple::x86:
4276 case llvm::Triple::m68k:
4280 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4281 << A->getSpelling() << T.getTriple();
4287 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4289 bool IsSimdSpecified =
4290 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4292 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4294 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4295 Opts.OpenMPIsTargetDevice =
4296 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4297 Opts.OpenMPIRBuilder =
4298 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4299 bool IsTargetSpecified =
4300 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4302 if (Opts.OpenMP || Opts.OpenMPSimd) {
4304 Args, OPT_fopenmp_version_EQ,
4305 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4306 Opts.OpenMP = Version;
4309 if (!Opts.OpenMPIsTargetDevice) {
4310 switch (T.getArch()) {
4314 case llvm::Triple::nvptx:
4315 case llvm::Triple::nvptx64:
4316 Diags.
Report(diag::err_drv_omp_host_target_not_supported) << T.str();
4324 if ((Opts.OpenMPIsTargetDevice && T.isGPU()) || Opts.OpenCLCPlusPlus) {
4326 Opts.Exceptions = 0;
4327 Opts.CXXExceptions = 0;
4329 if (Opts.OpenMPIsTargetDevice && T.isNVPTX()) {
4330 Opts.OpenMPCUDANumSMs =
4332 Opts.OpenMPCUDANumSMs, Diags);
4333 Opts.OpenMPCUDABlocksPerSM =
4335 Opts.OpenMPCUDABlocksPerSM, Diags);
4337 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4338 Opts.OpenMPCUDAReductionBufNum, Diags);
4343 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4344 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4346 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4347 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4348 Opts.OpenMPTargetDebug = 1;
4351 if (Opts.OpenMPIsTargetDevice) {
4352 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4353 Opts.OpenMPTeamSubscription =
true;
4354 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4355 Opts.OpenMPThreadSubscription =
true;
4359 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4360 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4361 auto getArchPtrSize = [](
const llvm::Triple &T) {
4362 if (T.isArch16Bit())
4364 if (T.isArch32Bit())
4366 assert(T.isArch64Bit() &&
"Expected 64-bit architecture");
4370 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4371 llvm::Triple TT(A->getValue(i));
4373 if (TT.getArch() == llvm::Triple::UnknownArch ||
4374 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4375 TT.getArch() == llvm::Triple::spirv64 ||
4376 TT.getArch() == llvm::Triple::systemz ||
4377 TT.getArch() == llvm::Triple::loongarch64 ||
4378 TT.getArch() == llvm::Triple::nvptx ||
4379 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4380 TT.getArch() == llvm::Triple::x86 ||
4381 TT.getArch() == llvm::Triple::x86_64))
4382 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4383 else if (getArchPtrSize(T) != getArchPtrSize(TT))
4384 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4385 << A->getValue(i) << T.str();
4392 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4393 (T.isNVPTX() || T.isAMDGCN()) &&
4394 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4397 if (Args.hasArg(options::OPT_fopenacc))
4398 Opts.OpenACC =
true;
4400 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4401 StringRef Val = A->getValue();
4404 else if (Val ==
"on")
4406 else if (Val ==
"off")
4408 else if (Val ==
"fast-honor-pragmas")
4411 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4415 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4416 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4418 llvm::StringSwitch<unsigned>(A->getValue(i))
4421 .Case(
"add-unsigned-overflow-test",
4423 .Case(
"add-signed-overflow-test",
4426 .Case(
"unsigned-post-decr-while",
4436 "-fsanitize-ignore-for-ubsan-feature=",
4437 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4439 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4440 std::vector<std::string> systemIgnorelists =
4441 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4443 systemIgnorelists.begin(),
4444 systemIgnorelists.end());
4446 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4447 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4449 StringRef Ver = A->getValue();
4450 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4451 int Major, Minor = 0;
4455 if (!VerParts.first.starts_with(
"0") &&
4456 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4457 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4459 ? VerParts.second.size() == 1 &&
4460 !VerParts.second.getAsInteger(10, Minor)
4461 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4463#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4464 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4465 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4467#define ABI_VER_MAJOR(Major_) \
4468 if (Major <= Major_) \
4469 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4471#define ABI_VER_LATEST(Latest) \
4474#include "clang/Basic/ABIVersions.def"
4475 }
else if (Ver !=
"latest") {
4476 Diags.
Report(diag::err_drv_invalid_value)
4477 << A->getAsString(Args) << A->getValue();
4481 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4482 StringRef SignScope = A->getValue();
4484 if (SignScope.equals_insensitive(
"none"))
4485 Opts.setSignReturnAddressScope(
4487 else if (SignScope.equals_insensitive(
"all"))
4488 Opts.setSignReturnAddressScope(
4490 else if (SignScope.equals_insensitive(
"non-leaf"))
4491 Opts.setSignReturnAddressScope(
4494 Diags.
Report(diag::err_drv_invalid_value)
4495 << A->getAsString(Args) << SignScope;
4497 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4498 StringRef SignKey = A->getValue();
4499 if (!SignScope.empty() && !SignKey.empty()) {
4500 if (SignKey ==
"a_key")
4501 Opts.setSignReturnAddressKey(
4503 else if (SignKey ==
"b_key")
4504 Opts.setSignReturnAddressKey(
4507 Diags.
Report(diag::err_drv_invalid_value)
4508 << A->getAsString(Args) << SignKey;
4514 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4521 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI << T.str();
4527 Opts.RelativeCXXABIVTables =
4528 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4529 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4533 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4534 Opts.OmitVTableRTTI =
4535 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4536 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4537 if (Opts.OmitVTableRTTI && HasRTTI)
4538 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4540 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4541 auto Split = StringRef(A).split(
'=');
4543 {std::string(
Split.first), std::string(
Split.second)});
4547 !Args.getLastArg(OPT_fno_file_reproducible) &&
4548 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4549 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4550 Args.getLastArg(OPT_ffile_reproducible));
4553 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4555 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4556 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4558 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4560 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4561 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4564 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4565 std::ifstream SeedFile(A->getValue(0));
4567 if (!SeedFile.is_open())
4568 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4574 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4577 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4578 StringRef S = Arg->getValue();
4580 if (S.getAsInteger(0,
Value))
4581 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4586 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4587 StringRef S = Arg->getValue();
4588 if (
auto Mode = getAllocTokenModeFromString(S))
4591 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4595 if (Opts.MatrixTypes) {
4596 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4597 StringRef ClangValue = A->getValue();
4598 if (ClangValue ==
"row-major")
4599 Opts.setDefaultMatrixMemoryLayout(
4602 Opts.setDefaultMatrixMemoryLayout(
4605 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4606 StringRef OptValue = A->getValue();
4607 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4608 ClangValue != OptValue)
4609 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4610 << ClangValue << OptValue;
4619 if (T.isDXIL() || T.isSPIRVLogical()) {
4621 enum {
OS, Environment };
4623 int ExpectedOS = T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4625 if (T.getOSName().empty()) {
4626 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4627 << ExpectedOS <<
OS << T.str();
4628 }
else if (T.getEnvironmentName().empty()) {
4629 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4631 }
else if (!T.isShaderStageEnvironment()) {
4632 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4633 <<
ShaderStage << T.getEnvironmentName() << T.str();
4637 if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
4638 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4639 << ShaderModel << T.getOSName() << T.str();
4644 if (Args.getLastArg(OPT_fnative_half_type) ||
4645 Args.getLastArg(OPT_fnative_int16_type)) {
4646 const LangStandard &Std =
4648 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4649 T.getOSVersion() >= VersionTuple(6, 2)))
4650 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4651 <<
"-enable-16bit-types" <<
true << Std.
getName()
4652 << T.getOSVersion().getAsString();
4654 }
else if (T.isSPIRVLogical()) {
4655 if (!T.isVulkanOS() || T.getVulkanVersion() == VersionTuple(0)) {
4656 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4657 << VulkanEnv << T.getOSName() << T.str();
4659 if (Args.getLastArg(OPT_fnative_half_type) ||
4660 Args.getLastArg(OPT_fnative_int16_type)) {
4661 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4662 ?
"-fnative-half-type"
4663 :
"-fnative-int16-type";
4664 const LangStandard &Std =
4666 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4667 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4668 << Str <<
false << Std.
getName();
4671 llvm_unreachable(
"expected DXIL or SPIR-V target");
4674 Diags.
Report(diag::err_drv_hlsl_unsupported_target) << T.str();
4676 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4677 const LangStandard &Requested =
4679 const LangStandard &Recommended =
4681 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4732 llvm_unreachable(
"invalid frontend action");
4777 llvm_unreachable(
"invalid frontend action");
4787#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4788 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4789#include "clang/Options/Options.inc"
4790#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4793 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4796 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4803 for (
const auto &M : Opts.
Macros) {
4806 if (M.first ==
"__CET__=1" && !M.second &&
4807 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4809 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4810 !CodeGenOpts.CFProtectionBranch)
4812 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4813 CodeGenOpts.CFProtectionBranch)
4816 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4819 for (
const auto &I : Opts.
Includes) {
4822 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4823 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4828 if (LangOpts.HLSL && I ==
"hlsl.h")
4838 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4844 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4847 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4861#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4862 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4863#include "clang/Options/Options.inc"
4864#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4866 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4867 Args.hasArg(OPT_pch_through_hdrstop_use);
4869 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4872 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4873 StringRef
Value(A->getValue());
4874 size_t Comma =
Value.find(
',');
4876 unsigned EndOfLine = 0;
4878 if (Comma == StringRef::npos ||
4879 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4880 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4881 Diags.
Report(diag::err_drv_preamble_format);
4889 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4890 if (A->getOption().matches(OPT_D))
4897 for (
const auto *A : Args.filtered(OPT_include))
4898 Opts.
Includes.emplace_back(A->getValue());
4900 for (
const auto *A : Args.filtered(OPT_chain_include))
4903 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4904 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4906 if (Split.second.empty()) {
4907 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4914 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4915 StringRef Epoch = A->getValue();
4919 const uint64_t MaxTimestamp =
4920 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4922 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4923 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4924 << Epoch << MaxTimestamp;
4930 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4931 StringRef Val = A->getValue();
4942 Args.hasFlag(OPT_fdefine_target_os_macros,
4954#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4955 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4956#include "clang/Options/Options.inc"
4957#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4975#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4976 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4977#include "clang/Options/Options.inc"
4978#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4981 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4990#define TARGET_OPTION_WITH_MARSHALLING(...) \
4991 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4992#include "clang/Options/Options.inc"
4993#undef TARGET_OPTION_WITH_MARSHALLING
4999 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5009#define TARGET_OPTION_WITH_MARSHALLING(...) \
5010 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5011#include "clang/Options/Options.inc"
5012#undef TARGET_OPTION_WITH_MARSHALLING
5014 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5015 llvm::VersionTuple Version;
5016 if (Version.tryParse(A->getValue()))
5017 Diags.
Report(diag::err_drv_invalid_value)
5018 << A->getAsString(Args) << A->getValue();
5023 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5024 llvm::VersionTuple Version;
5025 if (Version.tryParse(A->getValue()))
5026 Diags.
Report(diag::err_drv_invalid_value)
5027 << A->getAsString(Args) << A->getValue();
5035bool CompilerInvocation::CreateFromArgsImpl(
5043 unsigned MissingArgIndex, MissingArgCount;
5044 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5045 MissingArgCount, VisibilityMask);
5049 if (MissingArgCount)
5050 Diags.
Report(diag::err_drv_missing_argument)
5051 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5054 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5055 auto ArgString = A->getAsString(Args);
5056 std::string Nearest;
5057 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5058 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5060 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5061 << ArgString << Nearest;
5094 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5108 Diags.
Report(diag::warn_drv_openacc_without_cir);
5121 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5122 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5123 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5124 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5137 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5143 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5154 llvm::driver::ProfileInstrKind::ProfileNone)
5155 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5165 const char *Argv0) {
5171 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5175 Args.push_back(
"-cc1");
5178 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5183 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5198#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5199 if constexpr (CK::Compatibility != CK::Benign) \
5200 HBuilder.add(LangOpts->Name);
5201#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5202 if constexpr (CK::Compatibility != CK::Benign) \
5203 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5204#include "clang/Basic/LangOptions.def"
5209 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5226 StringRef MacroDef =
Macro.first;
5228 llvm::CachedHashString(MacroDef.split(
'=').first)))
5232 HBuilder.add(
Macro);
5248#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5249#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5250 HBuilder.add(diagOpts.get##Name());
5251#include "clang/Basic/DiagnosticOptions.def"
5261 ext->hashExtension(HBuilder);
5268 HBuilder.add(*Minor);
5269 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5270 HBuilder.add(*Subminor);
5272 HBuilder.add(*Build);
5278#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5279 if constexpr (CK::Compatibility != CK::Benign) \
5280 HBuilder.add(CodeGenOpts->Name);
5281#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5282 if constexpr (CK::Compatibility != CK::Benign) \
5283 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5284#define DEBUGOPT(Name, Bits, Default, Compatibility)
5285#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5286#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5287#include "clang/Basic/CodeGenOptions.def"
5299#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5300 if constexpr (CK::Compatibility != CK::Benign) \
5301 HBuilder.add(CodeGenOpts->Name);
5302#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5303 if constexpr (CK::Compatibility != CK::Benign) \
5304 HBuilder.add(CodeGenOpts->Name);
5305#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5306 if constexpr (CK::Compatibility != CK::Benign) \
5307 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5308#include "clang/Basic/DebugOptions.def"
5315 if (!SanHash.
empty())
5316 HBuilder.add(SanHash.
Mask);
5318 llvm::MD5::MD5Result
Result;
5319 HBuilder.getHasher().final(
Result);
5321 return toString(llvm::APInt(64, Hash), 36,
false);
5325 llvm::function_ref<
bool(std::string &)> Predicate) {
5326#define RETURN_IF(PATH) \
5328 if (Predicate(PATH)) \
5332#define RETURN_IF_MANY(PATHS) \
5334 if (llvm::any_of(PATHS, Predicate)) \
5338 auto &HeaderSearchOpts = *this->
HSOpts;
5341 for (
auto &Entry : HeaderSearchOpts.UserEntries)
5342 if (Entry.IgnoreSysRoot)
5344 RETURN_IF(HeaderSearchOpts.ResourceDir);
5345 RETURN_IF(HeaderSearchOpts.ModuleCachePath);
5346 RETURN_IF(HeaderSearchOpts.ModuleUserBuildPath);
5347 for (
auto &[Name,
File] : HeaderSearchOpts.PrebuiltModuleFiles)
5361 if (Input.isBuffer())
5376 auto &FileSystemOpts = *this->
FSOpts;
5398 llvm::function_ref<
bool(StringRef)> Callback)
const {
5402 [&Callback](std::string &Path) {
return Callback(StringRef(Path)); });
5430 std::vector<std::string> Args{
"-cc1"};
5432 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5458 llvm::vfs::getRealFileSystem());
5466 Diags, std::move(BaseFS));
5472 if (VFSOverlayFiles.empty())
5477 for (
const auto &
File : VFSOverlayFiles) {
5478 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5481 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5486 std::move(Buffer.get()),
nullptr,
File,
5489 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 T extractMaskValue(T KeyPath)
static std::optional< IntTy > normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args, DiagnosticsEngine &Diags)
static T mergeMaskValue(T KeyPath, U Value)
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 bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
static auto makeFlagToValueNormalizer(T Value)
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)
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 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 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)
#define RETURN_IF_MANY(PATHS)
static std::string serializeXRayInstrumentationBundle(const XRayInstrSet &S)
static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor)
static T mergeForwardValue(T KeyPath, U Value)
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 T extractForwardValue(T KeyPath)
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.
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.
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.
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
OptRemark OptimizationRemarkAnalysis
Selected optimizations for which we should enable optimization analyses.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
The base class of CompilerInvocation.
std::shared_ptr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::shared_ptr< AnalyzerOptions > AnalyzerOpts
Options controlling the static analyzer.
std::shared_ptr< MigratorOptions > MigratorOpts
std::shared_ptr< PreprocessorOutputOptions > PreprocessorOutputOpts
Options controlling preprocessed output.
std::shared_ptr< APINotesOptions > APINotesOpts
Options controlling API notes.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
const FrontendOptions & getFrontendOpts() const
const CodeGenOptions & getCodeGenOpts() const
void visitPathsImpl(llvm::function_ref< bool(std::string &)> Predicate)
Visits paths stored in the invocation.
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
void visitPaths(llvm::function_ref< bool(StringRef)> Callback) const
Visitation.
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.
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()
DiagnosticOptions & getMutDiagnosticOpts()
DependencyOutputOptions & getMutDependencyOutputOpts()
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
HeaderIncludeFormatKind HeaderIncludeFormat
The format of header information.
std::string OutputFile
The file to write dependency output to.
HeaderIncludeFilteringKind HeaderIncludeFiltering
Determine whether header information should be filtered.
std::vector< std::string > Targets
A list of names to use as the targets in the dependency file; this list must contain at least one ent...
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
unsigned IncludeSystemHeaders
Include system header dependencies.
static llvm::IntrusiveRefCntPtr< DiagnosticIDs > create()
Options for controlling the compiler diagnostics engine.
std::string DiagnosticSuppressionMappingsFile
Path for the file that defines diagnostic suppression mappings.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > VerifyPrefixes
The prefixes for comment directives sought by -verify ("expected" by default).
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setClient(DiagnosticConsumer *client, bool ShouldOwnClient=true)
Set the diagnostic client associated with this diagnostic object.
unsigned getNumErrors() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
unsigned getNumWarnings() const
Keeps track of options that affect how file operations are performed.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input.
unsigned ClangIRDisablePasses
Disable Clang IR specific (CIR) passes.
std::map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
unsigned ClangIRDisableCIRVerifier
Disable Clang IR (CIR) verifier.
unsigned IsSystemModule
When using -emit-module, treat the modulemap as a system module.
unsigned 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 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–)
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
SanitizerSet UBSanFeatureIgnoredSanitize
Set of (UBSan) sanitizers that when enabled do not cause __has_feature(undefined_behavior_sanitizer) ...
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
clang::ObjCRuntime ObjCRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
SanitizerSet Sanitize
Set of enabled sanitizers.
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
bool UseTargetPathSeparator
Indicates whether to use target's platform-specific file separator when FILE macro is used and when c...
static void setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, std::vector< std::string > &Includes, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
std::string RandstructSeed
The seed used by the randomize structure layout feature.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint64_t > AllocTokenMax
Maximum number of allocation tokens (0 = target SIZE_MAX), nullopt if none set (use target SIZE_MAX).
LangStandard::Kind LangStd
The used language standard.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
bool SanitizeCoverage
Is at least one coverage instrumentation type enabled.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
The basic abstraction for the target Objective-C runtime.
bool allowsWeak() const
Does this runtime allow the use of __weak?
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
std::string getAsString() const
bool allowsARC() const
Does this runtime allow ARC at all?
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
Discrimination
Forms of extra discrimination.
ARM8_3Key
Hardware pointer-signing keys in ARM8.3.
static constexpr std::optional< PositiveAnalyzerOption > create(unsigned Val)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a pragma hdrstop to separ...
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
void resetNonModularOptions()
Reset any options that are not considered when building a module.
void addMacroUndef(StringRef Name)
std::set< std::string > DeserializedPCHDeclsToErrorOn
This is a set of names for decls that we do not want to be deserialized, and we emit an error if they...
std::vector< std::string > EmbedEntries
User specified embed entries.
void addMacroDef(StringRef Name)
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a pragma hdrstop is expected to indicate the beginnin...
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
std::vector< std::pair< std::string, bool > > Macros
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g....
unsigned ShowMacros
Print macro definitions.
unsigned ShowCPP
Print normal preprocessed output.
unsigned ShowLineMarkers
Show #line markers.
unsigned DirectivesOnly
Process directives but do not expand macros.
Encodes a location in the source.
static bool isSupportedCXXABI(const llvm::Triple &T, Kind Kind)
static const auto & getSpelling(Kind ABIKind)
static bool usesRelativeVTables(const llvm::Triple &T)
static bool isABI(StringRef Name)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
uint64_t LargeDataThreshold
llvm::VersionTuple DarwinTargetVariantSDKVersion
The version of the darwin target variant SDK which was used during the compilation.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
constexpr XRayInstrMask None
constexpr XRayInstrMask All
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
@ CXXSystem
Like System, but only used for C++.
@ Angled
Paths for '#include <>' added by '-I'.
@ CSystem
Like System, but only used for C.
@ System
Like Angled, but marks system directories.
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
@ ExternCSystem
Like System, but headers are implicitly wrapped in extern "C".
@ ObjCSystem
Like System, but only used for ObjC.
@ ObjCXXSystem
Like System, but only used for ObjC++.
@ After
Like System, but searched after the system directories.
@ GenerateHeaderUnit
Generate a C++20 header unit module from a header file.
@ VerifyPCH
Load and verify that a PCH file is usable.
@ PrintPreprocessedInput
-E mode.
@ RewriteTest
Rewriter playground.
@ ParseSyntaxOnly
Parse and perform semantic analysis.
@ TemplightDump
Dump template instantiations.
@ GenerateModuleInterface
Generate pre-compiled module from a standard C++ module interface unit.
@ EmitLLVM
Emit a .ll file.
@ PrintPreamble
Print the "preamble" of the input file.
@ InitOnly
Only execute frontend initialization.
@ ASTView
Parse ASTs and view them in Graphviz.
@ PluginAction
Run a plugin action,.
@ DumpRawTokens
Dump out raw tokens.
@ PrintDependencyDirectivesSourceMinimizerOutput
Print the output of the dependency directives source minimizer.
@ RewriteObjC
ObjC->C Rewriter.
@ RunPreprocessorOnly
Just lex, no output.
@ ModuleFileInfo
Dump information about a module file.
@ EmitCIR
Emit a .cir file.
@ DumpCompilerOptions
Dump the compiler configuration.
@ RunAnalysis
Run one or more source code analyses.
@ ASTPrint
Parse ASTs and print them.
@ GenerateReducedModuleInterface
Generate reduced module interface for a standard C++ module interface unit.
@ GenerateInterfaceStubs
Generate Interface Stub Files.
@ ASTDump
Parse ASTs and dump them.
@ DumpTokens
Dump out preprocessed tokens.
@ FixIt
Parse and apply any fixits to the source.
@ EmitAssembly
Emit a .s file.
@ EmitCodeGenOnly
Generate machine code, but don't emit anything.
@ RewriteMacros
Expand macros but not #includes.
@ EmitHTML
Translate input source into HTML.
@ GeneratePCH
Generate pre-compiled header.
@ EmitLLVMOnly
Generate LLVM IR, but do not emit anything.
@ GenerateModule
Generate pre-compiled module from a module map.
@ ASTDeclList
Parse ASTs and list Decl nodes.
bool EQ(InterpState &S, CodePtr OpPC)
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
The JSON file list parser is used to communicate input to InstallAPI.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromOverlayFiles(ArrayRef< std::string > VFSOverlayFiles, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS)
DiagnosticLevelMask
A bitmask representing the diagnostic levels used by VerifyDiagnosticConsumer.
const char * headerIncludeFormatKindToString(HeaderIncludeFormatKind K)
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
constexpr uint16_t BlockDescriptorConstantDiscriminator
Constant discriminator to be used with block descriptor pointers.
constexpr uint16_t IsaPointerConstantDiscriminator
Constant discriminator to be used with objective-c isa pointers.
const char * headerIncludeFilteringKindToString(HeaderIncludeFilteringKind K)
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ Success
Annotation was successful.
@ Parse
Parse the block; this code is always used.
constexpr uint16_t SuperPointerConstantDiscriminator
Constant discriminator to be used with objective-c superclass pointers.
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
constexpr uint16_t MethodListPointerConstantDiscriminator
Constant discriminator to be used with method list pointers.
constexpr uint16_t ClassROConstantDiscriminator
Constant discriminator to be used with objective-c class_ro_t pointers.
constexpr uint16_t InitFiniPointerConstantDiscriminator
Constant discriminator to be used with function pointers in .init_array and .fini_array.
@ 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.
bool parseSanitizerWeightedValue(StringRef Value, bool AllowGroups, SanitizerMaskCutoffs &Cutoffs)
Parse a single weighted value (e.g., 'undefined=0.05') from a -fsanitize= or -fno-sanitize= value lis...
@ Result
The result type of a method or function.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
XRayInstrMask parseXRayInstrValue(StringRef Value)
Parses a command line argument into a mask.
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void serializeXRayInstrValue(XRayInstrSet Set, SmallVectorImpl< StringRef > &Values)
Serializes a set into a list of command line arguments.
unsigned getOptimizationLevelSize(const llvm::opt::ArgList &Args)
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
void serializeSanitizerMaskCutoffs(const SanitizerMaskCutoffs &Cutoffs, SmallVectorImpl< std::string > &Values)
Serialize a SanitizerMaskCutoffs into command line arguments.
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...
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 InitFiniPointers
The ABI for function addresses in .init_array and .fini_array.
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)