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);
3306#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3307 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3308#include "clang/Options/Options.inc"
3309#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3318 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3325 std::optional<bool> IsFramework,
3326 std::optional<bool> IgnoreSysRoot) {
3327 return llvm::is_contained(Groups, Entry.
Group) &&
3328 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3329 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3338 OptSpecifier Opt = [It, Matches]() {
3343 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3357 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3364 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3370 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3375 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3383 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3385 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3395 ? OPT_internal_isystem
3396 : OPT_internal_externc_isystem;
3400 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3402 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3406 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3407 : OPT_no_system_header_prefix;
3421#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3422 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3423#include "clang/Options/Options.inc"
3424#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3426 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3427 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3430 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3431 StringRef Val = A->getValue();
3432 if (Val.contains(
'=')) {
3433 auto Split = Val.split(
'=');
3435 std::string(Split.first), std::string(Split.second));
3438 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3441 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3442 StringRef MacroDef = A->getValue();
3444 llvm::CachedHashString(MacroDef.split(
'=').first));
3448 bool IsSysrootSpecified =
3449 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3453 auto PrefixHeaderPath = [IsSysrootSpecified,
3454 &Opts](
const llvm::opt::Arg *A,
3455 bool IsFramework =
false) -> std::string {
3456 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3457 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3459 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3460 llvm::StringRef(A->getValue()).substr(1));
3461 return std::string(Buffer);
3463 return A->getValue();
3466 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3467 bool IsFramework = A->getOption().matches(OPT_F);
3473 StringRef Prefix =
"";
3474 for (
const auto *A :
3475 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3476 if (A->getOption().matches(OPT_iprefix))
3477 Prefix = A->getValue();
3478 else if (A->getOption().matches(OPT_iwithprefix))
3484 for (
const auto *A : Args.filtered(OPT_idirafter))
3486 for (
const auto *A : Args.filtered(OPT_iquote))
3489 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3490 if (A->getOption().matches(OPT_iwithsysroot)) {
3497 for (
const auto *A : Args.filtered(OPT_iframework))
3499 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3504 for (
const auto *A : Args.filtered(OPT_c_isystem))
3506 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3508 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3510 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3514 for (
const auto *A :
3515 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3517 if (A->getOption().matches(OPT_internal_externc_isystem))
3519 Opts.
AddPath(A->getValue(), Group,
false,
true);
3521 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3525 for (
const auto *A :
3526 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3528 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3530 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3539 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3543 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3548 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3550 diags.
Report(diag::err_drv_invalid_value)
3551 << A->getAsString(Args) << A->getValue();
3553 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3559 if (Opts.PointerAuthIntrinsics)
3561 if (Opts.PointerAuthCalls)
3563 if (Opts.PointerAuthReturns)
3565 if (Opts.PointerAuthIndirectGotos)
3566 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3567 if (Opts.PointerAuthAuthTraps)
3569 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3570 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3571 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3572 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3573 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3574 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3575 if (Opts.PointerAuthFunctionTypeDiscrimination)
3576 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3577 if (Opts.PointerAuthInitFini)
3579 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3580 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3581 if (Opts.PointerAuthELFGOT)
3583 if (Opts.AArch64JumpTableHardening)
3584 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3585 if (Opts.PointerAuthObjcIsa)
3587 if (Opts.PointerAuthObjcInterfaceSel)
3588 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3589 if (Opts.PointerAuthObjcClassROPointers)
3590 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3591 if (Opts.PointerAuthBlockDescriptorPointers)
3592 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3597 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3598 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3599 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3600 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3601 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3602 Opts.PointerAuthVTPtrAddressDiscrimination =
3603 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3604 Opts.PointerAuthVTPtrTypeDiscrimination =
3605 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3606 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3607 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3608 Opts.PointerAuthFunctionTypeDiscrimination =
3609 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3610 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3611 Opts.PointerAuthInitFiniAddressDiscrimination =
3612 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3613 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3614 Opts.AArch64JumpTableHardening =
3615 Args.hasArg(OPT_faarch64_jump_table_hardening);
3616 Opts.PointerAuthBlockDescriptorPointers =
3617 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3618 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3619 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3620 Opts.PointerAuthObjcInterfaceSel =
3621 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3623 if (Opts.PointerAuthObjcInterfaceSel)
3624 Opts.PointerAuthObjcInterfaceSelKey =
3635 llvm_unreachable(
"should not parse language flags for this input");
3670 llvm_unreachable(
"unexpected input language");
3679 return "Objective-C";
3683 return "Objective-C++";
3687 return "C++ for OpenCL";
3706 llvm_unreachable(
"unknown input language");
3709void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3711 const llvm::Triple &T,
3716 if (Opts.ObjCAutoRefCount)
3718 if (Opts.PICLevel != 0)
3719 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3723 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3724 for (StringRef Sanitizer :
3726 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3732 OptSpecifier StdOpt;
3734 case LangStandard::lang_opencl10:
3735 case LangStandard::lang_opencl11:
3736 case LangStandard::lang_opencl12:
3737 case LangStandard::lang_opencl20:
3738 case LangStandard::lang_opencl30:
3739 case LangStandard::lang_openclcpp10:
3740 case LangStandard::lang_openclcpp2021:
3741 StdOpt = OPT_cl_std_EQ;
3744 StdOpt = OPT_std_EQ;
3749 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3751 if (Opts.IncludeDefaultHeader)
3752 GenerateArg(Consumer, OPT_finclude_default_header);
3753 if (Opts.DeclareOpenCLBuiltins)
3754 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3756 const LangOptions *
LangOpts = &Opts;
3758#define LANG_OPTION_WITH_MARSHALLING(...) \
3759 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3760#include "clang/Options/Options.inc"
3761#undef LANG_OPTION_WITH_MARSHALLING
3772 else if (Opts.ObjCAutoRefCount == 1)
3775 if (Opts.ObjCWeakRuntime)
3776 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3781 if (Opts.ObjCSubscriptingLegacyRuntime)
3782 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3785 if (Opts.GNUCVersion != 0) {
3786 unsigned Major = Opts.GNUCVersion / 100 / 100;
3787 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3788 unsigned Patch = Opts.GNUCVersion % 100;
3790 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3793 if (Opts.IgnoreXCOFFVisibility)
3794 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3802 if (Opts.PointerOverflowDefined)
3805 if (Opts.MSCompatibilityVersion != 0) {
3806 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3807 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3808 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3809 GenerateArg(Consumer, OPT_fms_compatibility_version,
3810 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3813 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3815 if (!Opts.Trigraphs)
3822 if (T.isOSzOS() && !Opts.ZOSExt)
3824 else if (Opts.ZOSExt)
3827 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3830 if (Opts.ConvergentFunctions)
3833 GenerateArg(Consumer, OPT_fno_convergent_functions);
3835 if (Opts.NoBuiltin && !Opts.Freestanding)
3838 if (!Opts.NoBuiltin)
3842 if (Opts.LongDoubleSize == 128)
3844 else if (Opts.LongDoubleSize == 64)
3846 else if (Opts.LongDoubleSize == 80)
3853 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3856 if (Opts.OpenMP != 51)
3857 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3859 if (!Opts.OpenMPUseTLS)
3862 if (Opts.OpenMPIsTargetDevice)
3863 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3865 if (Opts.OpenMPIRBuilder)
3866 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3869 if (Opts.OpenMPSimd) {
3872 if (Opts.OpenMP != 51)
3873 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3876 if (Opts.OpenMPThreadSubscription)
3877 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3879 if (Opts.OpenMPTeamSubscription)
3880 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3882 if (Opts.OpenMPTargetDebug != 0)
3883 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3884 Twine(Opts.OpenMPTargetDebug));
3886 if (Opts.OpenMPCUDANumSMs != 0)
3887 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3888 Twine(Opts.OpenMPCUDANumSMs));
3890 if (Opts.OpenMPCUDABlocksPerSM != 0)
3891 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3892 Twine(Opts.OpenMPCUDABlocksPerSM));
3894 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3895 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3896 Twine(Opts.OpenMPCUDAReductionBufNum));
3899 std::string Targets;
3900 llvm::raw_string_ostream
OS(Targets);
3903 [&OS](
const llvm::Triple &T) { OS << T.str(); },
",");
3904 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3907 if (Opts.OpenMPCUDAMode)
3923 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3926 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3927 for (StringRef Sanitizer :
3929 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3933 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3935 switch (Opts.getClangABICompat()) {
3936#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3937 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3938 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3940#define ABI_VER_MAJOR(Major) \
3941 case LangOptions::ClangABI::Ver##Major: \
3942 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3944#define ABI_VER_LATEST(Latest) \
3945 case LangOptions::ClangABI::Latest: \
3947#include "clang/Basic/ABIVersions.def"
3950 if (Opts.getSignReturnAddressScope() ==
3952 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3953 else if (Opts.getSignReturnAddressScope() ==
3955 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3957 if (Opts.getSignReturnAddressKey() ==
3959 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3965 if (Opts.RelativeCXXABIVTables)
3966 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3968 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3976 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3986 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
3987 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
3990 if (Opts.MatrixTypes) {
3991 if (Opts.getDefaultMatrixMemoryLayout() ==
3993 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
3994 if (Opts.getDefaultMatrixMemoryLayout() ==
3996 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
4000bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
4002 std::vector<std::string> &Includes,
4012 if (Args.hasArg(OPT_fobjc_arc))
4013 Opts.ObjCAutoRefCount = 1;
4017 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4021 "-fsanitize-ignore-for-ubsan-feature=",
4022 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4033 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4036 Diags.
Report(diag::err_drv_invalid_value)
4037 << A->getAsString(Args) << A->getValue();
4039 for (
unsigned KindValue = 0;
4045 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4047 unsigned NumAliases = 0;
4048#define LANGSTANDARD(id, name, lang, desc, features, version)
4049#define LANGSTANDARD_ALIAS(id, alias) \
4050 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4051#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4052#include "clang/Basic/LangStandards.def"
4054#define LANGSTANDARD(id, name, lang, desc, features, version)
4055#define LANGSTANDARD_ALIAS(id, alias) \
4056 if (KindValue == LangStandard::lang_##id) Diag << alias;
4057#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4058#include "clang/Basic/LangStandards.def"
4066 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4074 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4076 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4077 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4078 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4079 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4080 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4081 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4082 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4083 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4084 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4085 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4089 Diags.
Report(diag::err_drv_invalid_value)
4090 << A->getAsString(Args) << A->getValue();
4093 LangStd = OpenCLLangStd;
4097 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4098 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4106#define LANG_OPTION_WITH_MARSHALLING(...) \
4107 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4108#include "clang/Options/Options.inc"
4109#undef LANG_OPTION_WITH_MARSHALLING
4111 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4112 StringRef Name = A->getValue();
4113 if (Name ==
"full") {
4114 Opts.CFProtectionBranch = 1;
4115 Opts.CFProtectionReturn = 1;
4116 }
else if (Name ==
"branch") {
4117 Opts.CFProtectionBranch = 1;
4118 }
else if (Name ==
"return") {
4119 Opts.CFProtectionReturn = 1;
4123 if (Opts.CFProtectionBranch) {
4124 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4126 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4127#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4128 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4129#include "clang/Basic/CFProtectionOptions.def"
4131 Opts.setCFBranchLabelScheme(Scheme);
4135 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4136 !Args.hasArg(OPT_sycl_std_EQ)) {
4146 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4147 StringRef value =
arg->getValue();
4149 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4152 if (Args.hasArg(OPT_fobjc_gc_only))
4154 else if (Args.hasArg(OPT_fobjc_gc))
4156 else if (Args.hasArg(OPT_fobjc_arc)) {
4157 Opts.ObjCAutoRefCount = 1;
4159 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4166 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4167 Opts.ObjCWeakRuntime = 1;
4173 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4174 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4175 assert(!Opts.ObjCWeak);
4177 Diags.
Report(diag::err_objc_weak_with_gc);
4178 }
else if (!Opts.ObjCWeakRuntime) {
4179 Diags.
Report(diag::err_objc_weak_unsupported);
4183 }
else if (Opts.ObjCAutoRefCount) {
4184 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4187 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4188 Opts.ObjCSubscriptingLegacyRuntime =
4192 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4195 VersionTuple GNUCVer;
4196 bool Invalid = GNUCVer.tryParse(A->getValue());
4197 unsigned Major = GNUCVer.getMajor();
4198 unsigned Minor = GNUCVer.getMinor().value_or(0);
4199 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4200 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4201 Diags.
Report(diag::err_drv_invalid_value)
4202 << A->getAsString(Args) << A->getValue();
4204 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4207 if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4208 Opts.IgnoreXCOFFVisibility = 1;
4210 if (Args.hasArg(OPT_ftrapv)) {
4214 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4216 else if (Args.hasArg(OPT_fwrapv))
4218 if (Args.hasArg(OPT_fwrapv_pointer))
4219 Opts.PointerOverflowDefined =
true;
4221 Opts.MSCompatibilityVersion = 0;
4222 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4224 if (VT.tryParse(A->getValue()))
4225 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4227 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4228 VT.getMinor().value_or(0) * 100000 +
4229 VT.getSubminor().value_or(0);
4237 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4240 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4243 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions, T.isOSzOS());
4245 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4246 && Opts.OpenCLVersion == 200);
4248 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4249 Opts.HLSL || T.isAMDGPU() || T.isNVPTX();
4250 Opts.ConvergentFunctions =
4251 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4252 HasConvergentOperations);
4254 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4255 if (!Opts.NoBuiltin)
4257 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4258 if (A->getOption().matches(options::OPT_mlong_double_64))
4259 Opts.LongDoubleSize = 64;
4260 else if (A->getOption().matches(options::OPT_mlong_double_80))
4261 Opts.LongDoubleSize = 80;
4262 else if (A->getOption().matches(options::OPT_mlong_double_128))
4263 Opts.LongDoubleSize = 128;
4265 Opts.LongDoubleSize = 0;
4267 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4273 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4275 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4276 << A->getSpelling() <<
"-fdefault-calling-conv";
4278 switch (T.getArch()) {
4279 case llvm::Triple::x86:
4282 case llvm::Triple::m68k:
4286 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4287 << A->getSpelling() << T.getTriple();
4293 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4295 bool IsSimdSpecified =
4296 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4298 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4300 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4301 Opts.OpenMPIsTargetDevice =
4302 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4303 Opts.OpenMPIRBuilder =
4304 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4305 bool IsTargetSpecified =
4306 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4308 if (Opts.OpenMP || Opts.OpenMPSimd) {
4310 Args, OPT_fopenmp_version_EQ,
4311 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4312 Opts.OpenMP = Version;
4315 if (!Opts.OpenMPIsTargetDevice) {
4316 switch (T.getArch()) {
4320 case llvm::Triple::nvptx:
4321 case llvm::Triple::nvptx64:
4322 Diags.
Report(diag::err_drv_omp_host_target_not_supported) << T.str();
4330 if ((Opts.OpenMPIsTargetDevice && T.isGPU()) || Opts.OpenCLCPlusPlus) {
4332 Opts.Exceptions = 0;
4333 Opts.CXXExceptions = 0;
4335 if (Opts.OpenMPIsTargetDevice && T.isNVPTX()) {
4336 Opts.OpenMPCUDANumSMs =
4338 Opts.OpenMPCUDANumSMs, Diags);
4339 Opts.OpenMPCUDABlocksPerSM =
4341 Opts.OpenMPCUDABlocksPerSM, Diags);
4343 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4344 Opts.OpenMPCUDAReductionBufNum, Diags);
4349 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4350 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4352 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4353 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4354 Opts.OpenMPTargetDebug = 1;
4357 if (Opts.OpenMPIsTargetDevice) {
4358 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4359 Opts.OpenMPTeamSubscription =
true;
4360 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4361 Opts.OpenMPThreadSubscription =
true;
4365 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4366 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4367 auto getArchPtrSize = [](
const llvm::Triple &T) {
4368 if (T.isArch16Bit())
4370 if (T.isArch32Bit())
4372 assert(T.isArch64Bit() &&
"Expected 64-bit architecture");
4376 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4377 llvm::Triple TT(A->getValue(i));
4379 if (TT.getArch() == llvm::Triple::UnknownArch ||
4380 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4381 TT.getArch() == llvm::Triple::spirv64 ||
4382 TT.getArch() == llvm::Triple::systemz ||
4383 TT.getArch() == llvm::Triple::loongarch64 ||
4384 TT.getArch() == llvm::Triple::nvptx ||
4385 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4386 TT.getArch() == llvm::Triple::x86 ||
4387 TT.getArch() == llvm::Triple::x86_64))
4388 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4389 else if (getArchPtrSize(T) != getArchPtrSize(TT))
4390 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4391 << A->getValue(i) << T.str();
4398 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4399 (T.isNVPTX() || T.isAMDGCN()) &&
4400 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4403 if (Args.hasArg(options::OPT_fopenacc))
4404 Opts.OpenACC =
true;
4406 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4407 StringRef Val = A->getValue();
4410 else if (Val ==
"on")
4412 else if (Val ==
"off")
4414 else if (Val ==
"fast-honor-pragmas")
4417 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4421 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4422 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4424 llvm::StringSwitch<unsigned>(A->getValue(i))
4427 .Case(
"add-unsigned-overflow-test",
4429 .Case(
"add-signed-overflow-test",
4432 .Case(
"unsigned-post-decr-while",
4442 "-fsanitize-ignore-for-ubsan-feature=",
4443 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4445 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4446 std::vector<std::string> systemIgnorelists =
4447 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4449 systemIgnorelists.begin(),
4450 systemIgnorelists.end());
4452 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4453 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4455 StringRef Ver = A->getValue();
4456 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4457 int Major, Minor = 0;
4461 if (!VerParts.first.starts_with(
"0") &&
4462 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4463 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4465 ? VerParts.second.size() == 1 &&
4466 !VerParts.second.getAsInteger(10, Minor)
4467 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4469#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4470 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4471 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4473#define ABI_VER_MAJOR(Major_) \
4474 if (Major <= Major_) \
4475 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4477#define ABI_VER_LATEST(Latest) \
4480#include "clang/Basic/ABIVersions.def"
4481 }
else if (Ver !=
"latest") {
4482 Diags.
Report(diag::err_drv_invalid_value)
4483 << A->getAsString(Args) << A->getValue();
4487 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4488 StringRef SignScope = A->getValue();
4490 if (SignScope.equals_insensitive(
"none"))
4491 Opts.setSignReturnAddressScope(
4493 else if (SignScope.equals_insensitive(
"all"))
4494 Opts.setSignReturnAddressScope(
4496 else if (SignScope.equals_insensitive(
"non-leaf"))
4497 Opts.setSignReturnAddressScope(
4500 Diags.
Report(diag::err_drv_invalid_value)
4501 << A->getAsString(Args) << SignScope;
4503 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4504 StringRef SignKey = A->getValue();
4505 if (!SignScope.empty() && !SignKey.empty()) {
4506 if (SignKey ==
"a_key")
4507 Opts.setSignReturnAddressKey(
4509 else if (SignKey ==
"b_key")
4510 Opts.setSignReturnAddressKey(
4513 Diags.
Report(diag::err_drv_invalid_value)
4514 << A->getAsString(Args) << SignKey;
4520 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4527 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI << T.str();
4533 Opts.RelativeCXXABIVTables =
4534 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4535 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4539 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4540 Opts.OmitVTableRTTI =
4541 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4542 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4543 if (Opts.OmitVTableRTTI && HasRTTI)
4544 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4546 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4547 auto Split = StringRef(A).split(
'=');
4549 {std::string(
Split.first), std::string(
Split.second)});
4553 !Args.getLastArg(OPT_fno_file_reproducible) &&
4554 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4555 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4556 Args.getLastArg(OPT_ffile_reproducible));
4559 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4561 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4562 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4564 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4566 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4567 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4570 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4571 std::ifstream SeedFile(A->getValue(0));
4573 if (!SeedFile.is_open())
4574 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4580 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4583 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4584 StringRef S = Arg->getValue();
4586 if (S.getAsInteger(0,
Value))
4587 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4592 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4593 StringRef S = Arg->getValue();
4594 if (
auto Mode = getAllocTokenModeFromString(S))
4597 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4601 if (Opts.MatrixTypes) {
4602 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4603 StringRef ClangValue = A->getValue();
4604 if (ClangValue ==
"row-major")
4605 Opts.setDefaultMatrixMemoryLayout(
4608 Opts.setDefaultMatrixMemoryLayout(
4611 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4612 StringRef OptValue = A->getValue();
4613 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4614 ClangValue != OptValue)
4615 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4616 << ClangValue << OptValue;
4625 if (T.isDXIL() || T.isSPIRVLogical()) {
4627 enum {
OS, Environment };
4629 int ExpectedOS = T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4631 if (T.getOSName().empty()) {
4632 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4633 << ExpectedOS <<
OS << T.str();
4634 }
else if (T.getEnvironmentName().empty()) {
4635 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4637 }
else if (!T.isShaderStageEnvironment()) {
4638 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4639 <<
ShaderStage << T.getEnvironmentName() << T.str();
4643 if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
4644 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4645 << ShaderModel << T.getOSName() << T.str();
4650 if (Args.getLastArg(OPT_fnative_half_type) ||
4651 Args.getLastArg(OPT_fnative_int16_type)) {
4652 const LangStandard &Std =
4654 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4655 T.getOSVersion() >= VersionTuple(6, 2)))
4656 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4657 <<
"-enable-16bit-types" <<
true << Std.
getName()
4658 << T.getOSVersion().getAsString();
4660 }
else if (T.isSPIRVLogical()) {
4661 if (!T.isVulkanOS() || T.getVulkanVersion() == VersionTuple(0)) {
4662 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4663 << VulkanEnv << T.getOSName() << T.str();
4665 if (Args.getLastArg(OPT_fnative_half_type) ||
4666 Args.getLastArg(OPT_fnative_int16_type)) {
4667 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4668 ?
"-fnative-half-type"
4669 :
"-fnative-int16-type";
4670 const LangStandard &Std =
4672 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4673 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4674 << Str <<
false << Std.
getName();
4677 llvm_unreachable(
"expected DXIL or SPIR-V target");
4680 Diags.
Report(diag::err_drv_hlsl_unsupported_target) << T.str();
4682 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4683 const LangStandard &Requested =
4685 const LangStandard &Recommended =
4687 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4738 llvm_unreachable(
"invalid frontend action");
4783 llvm_unreachable(
"invalid frontend action");
4793#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4794 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4795#include "clang/Options/Options.inc"
4796#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4799 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4802 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4809 for (
const auto &M : Opts.
Macros) {
4812 if (M.first ==
"__CET__=1" && !M.second &&
4813 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4815 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4816 !CodeGenOpts.CFProtectionBranch)
4818 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4819 CodeGenOpts.CFProtectionBranch)
4822 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4825 for (
const auto &I : Opts.
Includes) {
4828 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4829 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4834 if (LangOpts.HLSL && I ==
"hlsl.h")
4844 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4850 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4853 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4867#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4868 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4869#include "clang/Options/Options.inc"
4870#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4872 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4873 Args.hasArg(OPT_pch_through_hdrstop_use);
4875 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4878 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4879 StringRef
Value(A->getValue());
4880 size_t Comma =
Value.find(
',');
4882 unsigned EndOfLine = 0;
4884 if (Comma == StringRef::npos ||
4885 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4886 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4887 Diags.
Report(diag::err_drv_preamble_format);
4895 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4896 if (A->getOption().matches(OPT_D))
4903 for (
const auto *A : Args.filtered(OPT_include))
4904 Opts.
Includes.emplace_back(A->getValue());
4906 for (
const auto *A : Args.filtered(OPT_chain_include))
4909 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4910 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4912 if (Split.second.empty()) {
4913 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4920 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4921 StringRef Epoch = A->getValue();
4925 const uint64_t MaxTimestamp =
4926 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4928 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4929 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4930 << Epoch << MaxTimestamp;
4936 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4937 StringRef Val = A->getValue();
4948 Args.hasFlag(OPT_fdefine_target_os_macros,
4960#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4961 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4962#include "clang/Options/Options.inc"
4963#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4981#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4982 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4983#include "clang/Options/Options.inc"
4984#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4987 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4996#define TARGET_OPTION_WITH_MARSHALLING(...) \
4997 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4998#include "clang/Options/Options.inc"
4999#undef TARGET_OPTION_WITH_MARSHALLING
5005 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5015#define TARGET_OPTION_WITH_MARSHALLING(...) \
5016 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5017#include "clang/Options/Options.inc"
5018#undef TARGET_OPTION_WITH_MARSHALLING
5020 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5021 llvm::VersionTuple Version;
5022 if (Version.tryParse(A->getValue()))
5023 Diags.
Report(diag::err_drv_invalid_value)
5024 << A->getAsString(Args) << A->getValue();
5029 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5030 llvm::VersionTuple Version;
5031 if (Version.tryParse(A->getValue()))
5032 Diags.
Report(diag::err_drv_invalid_value)
5033 << A->getAsString(Args) << A->getValue();
5041bool CompilerInvocation::CreateFromArgsImpl(
5049 unsigned MissingArgIndex, MissingArgCount;
5050 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5051 MissingArgCount, VisibilityMask);
5055 if (MissingArgCount)
5056 Diags.
Report(diag::err_drv_missing_argument)
5057 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5060 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5061 auto ArgString = A->getAsString(Args);
5062 std::string Nearest;
5063 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5064 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5066 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5067 << ArgString << Nearest;
5100 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5114 Diags.
Report(diag::warn_drv_openacc_without_cir);
5127 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5128 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5129 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5130 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5143 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5149 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5160 llvm::driver::ProfileInstrKind::ProfileNone)
5161 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5171 const char *Argv0) {
5177 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5181 Args.push_back(
"-cc1");
5184 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5189 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5204#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5205 if constexpr (CK::Compatibility != CK::Benign) \
5206 HBuilder.add(LangOpts->Name);
5207#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5208 if constexpr (CK::Compatibility != CK::Benign) \
5209 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5210#include "clang/Basic/LangOptions.def"
5215 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5232 StringRef MacroDef =
Macro.first;
5234 llvm::CachedHashString(MacroDef.split(
'=').first)))
5238 HBuilder.add(
Macro);
5254#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5255#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5256 HBuilder.add(diagOpts.get##Name());
5257#include "clang/Basic/DiagnosticOptions.def"
5267 ext->hashExtension(HBuilder);
5274 HBuilder.add(*Minor);
5275 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5276 HBuilder.add(*Subminor);
5278 HBuilder.add(*Build);
5284#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5285 if constexpr (CK::Compatibility != CK::Benign) \
5286 HBuilder.add(CodeGenOpts->Name);
5287#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5288 if constexpr (CK::Compatibility != CK::Benign) \
5289 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5290#define DEBUGOPT(Name, Bits, Default, Compatibility)
5291#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5292#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5293#include "clang/Basic/CodeGenOptions.def"
5305#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5306 if constexpr (CK::Compatibility != CK::Benign) \
5307 HBuilder.add(CodeGenOpts->Name);
5308#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5309 if constexpr (CK::Compatibility != CK::Benign) \
5310 HBuilder.add(CodeGenOpts->Name);
5311#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5312 if constexpr (CK::Compatibility != CK::Benign) \
5313 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5314#include "clang/Basic/DebugOptions.def"
5321 if (!SanHash.
empty())
5322 HBuilder.add(SanHash.
Mask);
5324 llvm::MD5::MD5Result
Result;
5325 HBuilder.getHasher().final(
Result);
5327 return toString(llvm::APInt(64, Hash), 36,
false);
5331 llvm::function_ref<
bool(std::string &)> Predicate) {
5332#define RETURN_IF(PATH) \
5334 if (Predicate(PATH)) \
5338#define RETURN_IF_MANY(PATHS) \
5340 if (llvm::any_of(PATHS, Predicate)) \
5344 auto &HeaderSearchOpts = *this->
HSOpts;
5347 for (
auto &Entry : HeaderSearchOpts.UserEntries)
5348 if (Entry.IgnoreSysRoot)
5350 RETURN_IF(HeaderSearchOpts.ResourceDir);
5351 RETURN_IF(HeaderSearchOpts.ModuleCachePath);
5352 RETURN_IF(HeaderSearchOpts.ModuleUserBuildPath);
5353 for (
auto &[Name,
File] : HeaderSearchOpts.PrebuiltModuleFiles)
5367 if (Input.isBuffer())
5382 auto &FileSystemOpts = *this->
FSOpts;
5404 llvm::function_ref<
bool(StringRef)> Callback)
const {
5408 [&Callback](std::string &Path) {
return Callback(StringRef(Path)); });
5436 std::vector<std::string> Args{
"-cc1"};
5438 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5464 llvm::vfs::getRealFileSystem());
5472 Diags, std::move(BaseFS));
5478 if (VFSOverlayFiles.empty())
5483 for (
const auto &
File : VFSOverlayFiles) {
5484 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5487 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5492 std::move(Buffer.get()),
nullptr,
File,
5495 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)