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")
2564 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2567 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2569 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2571 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2573 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2578 if (
Warning ==
"undef-prefix")
2581 if (
Warning ==
"invalid-constexpr" ||
Warning ==
"no-invalid-constexpr")
2583 Consumer(StringRef(
"-W") +
Warning);
2589 StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2590 "pass-analysis",
"no-pass-analysis",
2591 "pass-missed",
"no-pass-missed"};
2592 if (llvm::is_contained(IgnoredRemarks,
Remark))
2595 Consumer(StringRef(
"-R") +
Remark);
2599 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2604std::unique_ptr<DiagnosticOptions>
2606 auto DiagOpts = std::make_unique<DiagnosticOptions>();
2607 unsigned MissingArgIndex, MissingArgCount;
2609 Argv.slice(1), MissingArgIndex, MissingArgCount);
2611 bool ShowColors =
true;
2612 if (std::optional<std::string> NoColor =
2613 llvm::sys::Process::GetEnv(
"NO_COLOR");
2614 NoColor && !NoColor->empty()) {
2629 bool DefaultDiagColor) {
2630 std::optional<DiagnosticOptions> IgnoringDiagOpts;
2631 std::optional<DiagnosticsEngine> IgnoringDiags;
2633 IgnoringDiagOpts.emplace();
2636 Diags = &*IgnoringDiags;
2645#define DIAG_OPTION_WITH_MARSHALLING(...) \
2646 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__)
2647#include "clang/Options/Options.inc"
2648#undef DIAG_OPTION_WITH_MARSHALLING
2650 llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2653 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2657 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2659 if (Args.hasArg(OPT_verify))
2664 Opts.VerifyDiagnostics =
false;
2669 "-verify-ignore-unexpected=",
2670 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2671 if (Args.hasArg(OPT_verify_ignore_unexpected))
2673 Opts.setVerifyIgnoreUnexpected(DiagMask);
2675 Diags->
Report(diag::warn_ignoring_ftabstop_value)
2680 if (
const Arg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2691 unsigned DefaultOpt = 0;
2694 !Args.hasArg(OPT_cl_opt_disable))
2697 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2698 if (A->getOption().matches(options::OPT_O0))
2701 if (A->getOption().matches(options::OPT_Ofast))
2704 assert(A->getOption().matches(options::OPT_O));
2706 StringRef S(A->getValue());
2707 if (S ==
"s" || S ==
"z")
2716 unsigned MaxOptLevel = 3;
2717 if (DefaultOpt > MaxOptLevel) {
2720 Diags.
Report(diag::warn_drv_optimization_value)
2721 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
2722 DefaultOpt = MaxOptLevel;
2729 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2730 if (A->getOption().matches(options::OPT_O)) {
2731 switch (A->getValue()[0]) {
2749 std::string &BlockName,
2750 unsigned &MajorVersion,
2751 unsigned &MinorVersion,
2753 std::string &UserInfo) {
2755 Arg.split(Args,
':', 5);
2756 if (Args.size() < 5)
2759 BlockName = std::string(Args[0]);
2760 if (Args[1].getAsInteger(10, MajorVersion))
return true;
2761 if (Args[2].getAsInteger(10, MinorVersion))
return true;
2762 if (Args[3].getAsInteger(2, Hashed))
return true;
2763 if (Args.size() > 4)
2764 UserInfo = std::string(Args[4]);
2773 static const std::pair<frontend::ActionKind, unsigned> Table[] = {
2804 OPT_emit_reduced_module_interface},
2821 OPT_print_dependency_directives_minimized_source},
2828static std::optional<frontend::ActionKind>
2831 if (ActionOpt.second == Opt.getID())
2832 return ActionOpt.first;
2834 return std::nullopt;
2838static std::optional<OptSpecifier>
2841 if (ActionOpt.first == ProgramAction)
2842 return OptSpecifier(ActionOpt.second);
2844 return std::nullopt;
2850#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
2851 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
2852#include "clang/Options/Options.inc"
2853#undef FRONTEND_OPTION_WITH_MARSHALLING
2855 std::optional<OptSpecifier> ProgramActionOpt =
2863 if (!ProgramActionOpt) {
2866 "Frontend action without option.");
2867 GenerateProgramAction = [&]() {
2874 GenerateProgramAction = [&]() {
2882 llvm_unreachable(
"Default AST dump format.");
2889 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2902 GenerateProgramAction = [&]() {
2907 GenerateProgramAction();
2909 for (
const auto &PluginArgs : Opts.
PluginArgs) {
2911 for (
const auto &PluginArg : PluginArgs.second)
2913 Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2914 Opt.getKind(), 0, PluginArg);
2918 if (
auto *TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2919 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2925 for (
const auto &Plugin : Opts.
Plugins)
2931 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2944 StringRef HeaderUnit =
"";
2949 HeaderUnit =
"-user";
2952 HeaderUnit =
"-system";
2955 HeaderUnit =
"-header-unit";
2958 StringRef Header = IsHeader ?
"-header" :
"";
2981 Lang =
"objective-c";
2984 Lang =
"objective-c++";
2987 Lang =
"assembler-with-cpp";
2991 "Generating -x argument for unknown language (not precompiled).");
3006 Lang + HeaderUnit + Header +
ModuleMap + Preprocessed);
3010 for (
const auto &Input : Opts.
Inputs)
3011 Consumer(Input.getFile());
3020#define FRONTEND_OPTION_WITH_MARSHALLING(...) \
3021 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3022#include "clang/Options/Options.inc"
3023#undef FRONTEND_OPTION_WITH_MARSHALLING
3026 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
3027 OptSpecifier Opt = OptSpecifier(A->getOption().getID());
3029 assert(ProgramAction &&
"Option specifier not in Action_Group.");
3032 (Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
3033 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
3036 .Default(std::numeric_limits<unsigned>::max());
3038 if (Val != std::numeric_limits<unsigned>::max())
3041 Diags.
Report(diag::err_drv_invalid_value)
3042 << A->getAsString(Args) << A->getValue();
3052 Args.hasArg(OPT_interface_stub_version_EQ)
3053 ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
3055 if (ArgStr ==
"experimental-yaml-elf-v1" ||
3056 ArgStr ==
"experimental-ifs-v1" || ArgStr ==
"experimental-ifs-v2" ||
3057 ArgStr ==
"experimental-tapi-elf-v1") {
3058 std::string ErrorMessage =
3059 "Invalid interface stub format: " + ArgStr.str() +
3061 Diags.
Report(diag::err_drv_invalid_value)
3062 <<
"Must specify a valid interface stub format type, ie: "
3063 "-interface-stub-version=ifs-v1"
3066 }
else if (!ArgStr.starts_with(
"ifs-")) {
3067 std::string ErrorMessage =
3068 "Invalid interface stub format: " + ArgStr.str() +
".";
3069 Diags.
Report(diag::err_drv_invalid_value)
3070 <<
"Must specify a valid interface stub format type, ie: "
3071 "-interface-stub-version=ifs-v1"
3086 if (!A->getSpelling().starts_with(
"-ast-dump")) {
3087 const Arg *SavedAction =
nullptr;
3088 for (
const Arg *AA :
3089 Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3090 if (AA->getOption().matches(OPT_main_file_name)) {
3091 SavedAction =
nullptr;
3092 }
else if (!SavedAction) {
3095 if (!A->getOption().matches(OPT_ast_dump_EQ))
3096 Diags.
Report(diag::err_fe_invalid_multiple_actions)
3097 << SavedAction->getSpelling() << A->getSpelling();
3104 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
3105 Opts.
Plugins.emplace_back(A->getValue(0));
3109 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
3110 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3112 for (
const std::string &Arg :
3113 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3114 std::string BlockName;
3115 unsigned MajorVersion;
3116 unsigned MinorVersion;
3118 std::string UserInfo;
3120 MinorVersion, Hashed, UserInfo)) {
3121 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3128 std::make_shared<TestModuleFileExtension>(
3129 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3132 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
3136 Diags.
Report(diag::err_drv_invalid_value)
3137 << A->getAsString(Args) << A->getValue();
3138 Diags.
Report(diag::note_command_line_code_loc_requirement);
3142 Opts.
Plugins = Args.getAllArgValues(OPT_load);
3143 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3144 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3146 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3147 StringRef Val = A->getValue();
3148 if (!Val.contains(
'='))
3153 Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module"
3155 if (Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3159 if (Args.hasArg(OPT_clangir_disable_passes))
3162 if (Args.hasArg(OPT_clangir_disable_verifier))
3166 if (Args.hasArg(OPT_aux_target_cpu))
3167 Opts.
AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3168 if (Args.hasArg(OPT_aux_target_feature))
3172 if (
const Arg *A = Args.getLastArg(OPT_x)) {
3173 StringRef XValue = A->getValue();
3178 bool Preprocessed = XValue.consume_back(
"-cpp-output");
3179 bool ModuleMap = XValue.consume_back(
"-module-map");
3182 XValue !=
"precompiled-header" && XValue.consume_back(
"-header");
3188 if (IsHeader || Preprocessed) {
3189 if (XValue.consume_back(
"-header-unit"))
3191 else if (XValue.consume_back(
"-system"))
3193 else if (XValue.consume_back(
"-user"))
3199 IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap &&
3203 DashX = llvm::StringSwitch<InputKind>(XValue)
3219 DashX = llvm::StringSwitch<InputKind>(XValue)
3227 DashX = llvm::StringSwitch<InputKind>(XValue)
3230 .Cases({
"ast",
"pcm",
"precompiled-header"},
3237 Diags.
Report(diag::err_drv_invalid_value)
3238 << A->getAsString(Args) << A->getValue();
3245 IsHeaderFile =
true;
3246 }
else if (IsHeaderFile)
3253 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3256 Inputs.push_back(
"-");
3260 Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3262 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
3266 StringRef(Inputs[i]).rsplit(
'.').second);
3275 bool IsSystem =
false;
3284 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3295#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3296 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3297#include "clang/Options/Options.inc"
3298#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3307 GenerateArg(Consumer, OPT_fprebuilt_module_path, Path);
3314 std::optional<bool> IsFramework,
3315 std::optional<bool> IgnoreSysRoot) {
3316 return llvm::is_contained(Groups, Entry.
Group) &&
3317 (!IsFramework || (Entry.
IsFramework == *IsFramework)) &&
3318 (!IgnoreSysRoot || (Entry.
IgnoreSysRoot == *IgnoreSysRoot));
3327 OptSpecifier Opt = [It, Matches]() {
3332 llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3346 It->Group ==
frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore;
3353 for (; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3359 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3364 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3372 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3374 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3384 ? OPT_internal_isystem
3385 : OPT_internal_externc_isystem;
3389 GenerateArg(Consumer, OPT_internal_iframework, It->Path);
3391 assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3395 OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix
3396 : OPT_no_system_header_prefix;
3410#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
3411 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
3412#include "clang/Options/Options.inc"
3413#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
3415 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
3416 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
3419 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
3420 StringRef Val = A->getValue();
3421 if (Val.contains(
'=')) {
3422 auto Split = Val.split(
'=');
3424 std::string(Split.first), std::string(Split.second));
3427 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
3430 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
3431 StringRef MacroDef = A->getValue();
3433 llvm::CachedHashString(MacroDef.split(
'=').first));
3437 bool IsSysrootSpecified =
3438 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3442 auto PrefixHeaderPath = [IsSysrootSpecified,
3443 &Opts](
const llvm::opt::Arg *A,
3444 bool IsFramework =
false) -> std::string {
3445 assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3446 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3448 llvm::sys::path::append(Buffer, Opts.
Sysroot,
3449 llvm::StringRef(A->getValue()).substr(1));
3450 return std::string(Buffer);
3452 return A->getValue();
3455 for (
const auto *A : Args.filtered(OPT_I, OPT_F)) {
3456 bool IsFramework = A->getOption().matches(OPT_F);
3462 StringRef Prefix =
"";
3463 for (
const auto *A :
3464 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3465 if (A->getOption().matches(OPT_iprefix))
3466 Prefix = A->getValue();
3467 else if (A->getOption().matches(OPT_iwithprefix))
3473 for (
const auto *A : Args.filtered(OPT_idirafter))
3475 for (
const auto *A : Args.filtered(OPT_iquote))
3478 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3479 if (A->getOption().matches(OPT_iwithsysroot)) {
3486 for (
const auto *A : Args.filtered(OPT_iframework))
3488 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
3493 for (
const auto *A : Args.filtered(OPT_c_isystem))
3495 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
3497 for (
const auto *A : Args.filtered(OPT_objc_isystem))
3499 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
3503 for (
const auto *A :
3504 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3506 if (A->getOption().matches(OPT_internal_externc_isystem))
3508 Opts.
AddPath(A->getValue(), Group,
false,
true);
3510 for (
const auto *A : Args.filtered(OPT_internal_iframework))
3514 for (
const auto *A :
3515 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3517 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3519 for (
const auto *A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3528 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3532 GenerateArg(Consumer, OPT_iapinotes_modules, Path);
3537 if (
const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3539 diags.
Report(diag::err_drv_invalid_value)
3540 << A->getAsString(Args) << A->getValue();
3542 for (
const Arg *A : Args.filtered(OPT_iapinotes_modules))
3548 if (Opts.PointerAuthIntrinsics)
3550 if (Opts.PointerAuthCalls)
3552 if (Opts.PointerAuthReturns)
3554 if (Opts.PointerAuthIndirectGotos)
3555 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3556 if (Opts.PointerAuthAuthTraps)
3558 if (Opts.PointerAuthVTPtrAddressDiscrimination)
3559 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3560 if (Opts.PointerAuthVTPtrTypeDiscrimination)
3561 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3562 if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3563 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3564 if (Opts.PointerAuthFunctionTypeDiscrimination)
3565 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3566 if (Opts.PointerAuthInitFini)
3568 if (Opts.PointerAuthInitFiniAddressDiscrimination)
3569 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3570 if (Opts.PointerAuthELFGOT)
3572 if (Opts.AArch64JumpTableHardening)
3573 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3574 if (Opts.PointerAuthObjcIsa)
3576 if (Opts.PointerAuthObjcInterfaceSel)
3577 GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
3578 if (Opts.PointerAuthObjcClassROPointers)
3579 GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
3580 if (Opts.PointerAuthBlockDescriptorPointers)
3581 GenerateArg(Consumer, OPT_fptrauth_block_descriptor_pointers);
3586 Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3587 Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3588 Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3589 Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3590 Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3591 Opts.PointerAuthVTPtrAddressDiscrimination =
3592 Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3593 Opts.PointerAuthVTPtrTypeDiscrimination =
3594 Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3595 Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3596 Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3597 Opts.PointerAuthFunctionTypeDiscrimination =
3598 Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3599 Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3600 Opts.PointerAuthInitFiniAddressDiscrimination =
3601 Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3602 Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3603 Opts.AArch64JumpTableHardening =
3604 Args.hasArg(OPT_faarch64_jump_table_hardening);
3605 Opts.PointerAuthBlockDescriptorPointers =
3606 Args.hasArg(OPT_fptrauth_block_descriptor_pointers);
3607 Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
3608 Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
3609 Opts.PointerAuthObjcInterfaceSel =
3610 Args.hasArg(OPT_fptrauth_objc_interface_sel);
3612 if (Opts.PointerAuthObjcInterfaceSel)
3613 Opts.PointerAuthObjcInterfaceSelKey =
3624 llvm_unreachable(
"should not parse language flags for this input");
3659 llvm_unreachable(
"unexpected input language");
3668 return "Objective-C";
3672 return "Objective-C++";
3676 return "C++ for OpenCL";
3695 llvm_unreachable(
"unknown input language");
3698void CompilerInvocationBase::GenerateLangArgs(
const LangOptions &Opts,
3700 const llvm::Triple &T,
3705 if (Opts.ObjCAutoRefCount)
3707 if (Opts.PICLevel != 0)
3708 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3712 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3713 for (StringRef Sanitizer :
3715 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ,
3721 OptSpecifier StdOpt;
3723 case LangStandard::lang_opencl10:
3724 case LangStandard::lang_opencl11:
3725 case LangStandard::lang_opencl12:
3726 case LangStandard::lang_opencl20:
3727 case LangStandard::lang_opencl30:
3728 case LangStandard::lang_openclcpp10:
3729 case LangStandard::lang_openclcpp2021:
3730 StdOpt = OPT_cl_std_EQ;
3733 StdOpt = OPT_std_EQ;
3738 GenerateArg(Consumer, StdOpt, LangStandard.getName());
3740 if (Opts.IncludeDefaultHeader)
3741 GenerateArg(Consumer, OPT_finclude_default_header);
3742 if (Opts.DeclareOpenCLBuiltins)
3743 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3745 const LangOptions *
LangOpts = &Opts;
3747#define LANG_OPTION_WITH_MARSHALLING(...) \
3748 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
3749#include "clang/Options/Options.inc"
3750#undef LANG_OPTION_WITH_MARSHALLING
3761 else if (Opts.ObjCAutoRefCount == 1)
3764 if (Opts.ObjCWeakRuntime)
3765 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3770 if (Opts.ObjCSubscriptingLegacyRuntime)
3771 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3774 if (Opts.GNUCVersion != 0) {
3775 unsigned Major = Opts.GNUCVersion / 100 / 100;
3776 unsigned Minor = (Opts.GNUCVersion / 100) % 100;
3777 unsigned Patch = Opts.GNUCVersion % 100;
3779 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Patch));
3782 if (Opts.IgnoreXCOFFVisibility)
3783 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3791 if (Opts.PointerOverflowDefined)
3794 if (Opts.MSCompatibilityVersion != 0) {
3795 unsigned Major = Opts.MSCompatibilityVersion / 10000000;
3796 unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100;
3797 unsigned Subminor = Opts.MSCompatibilityVersion % 100000;
3798 GenerateArg(Consumer, OPT_fms_compatibility_version,
3799 Twine(Major) +
"." + Twine(Minor) +
"." + Twine(Subminor));
3802 if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3804 if (!Opts.Trigraphs)
3811 if (T.isOSzOS() && !Opts.ZOSExt)
3813 else if (Opts.ZOSExt)
3816 if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3819 if (Opts.ConvergentFunctions)
3822 GenerateArg(Consumer, OPT_fno_convergent_functions);
3824 if (Opts.NoBuiltin && !Opts.Freestanding)
3827 if (!Opts.NoBuiltin)
3831 if (Opts.LongDoubleSize == 128)
3833 else if (Opts.LongDoubleSize == 64)
3835 else if (Opts.LongDoubleSize == 80)
3842 if (Opts.OpenMP && !Opts.OpenMPSimd) {
3845 if (Opts.OpenMP != 51)
3846 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3848 if (!Opts.OpenMPUseTLS)
3851 if (Opts.OpenMPIsTargetDevice)
3852 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3854 if (Opts.OpenMPIRBuilder)
3855 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3858 if (Opts.OpenMPSimd) {
3861 if (Opts.OpenMP != 51)
3862 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3865 if (Opts.OpenMPThreadSubscription)
3866 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3868 if (Opts.OpenMPTeamSubscription)
3869 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3871 if (Opts.OpenMPTargetDebug != 0)
3872 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3873 Twine(Opts.OpenMPTargetDebug));
3875 if (Opts.OpenMPCUDANumSMs != 0)
3876 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3877 Twine(Opts.OpenMPCUDANumSMs));
3879 if (Opts.OpenMPCUDABlocksPerSM != 0)
3880 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3881 Twine(Opts.OpenMPCUDABlocksPerSM));
3883 if (Opts.OpenMPCUDAReductionBufNum != 1024)
3884 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3885 Twine(Opts.OpenMPCUDAReductionBufNum));
3888 std::string Targets;
3889 llvm::raw_string_ostream
OS(Targets);
3892 [&OS](
const llvm::Triple &T) { OS << T.str(); },
",");
3893 GenerateArg(Consumer, OPT_offload_targets_EQ, Targets);
3896 if (Opts.OpenMPCUDAMode)
3912 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3915 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3916 for (StringRef Sanitizer :
3918 GenerateArg(Consumer, OPT_fsanitize_ignore_for_ubsan_feature_EQ, Sanitizer);
3922 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3924 switch (Opts.getClangABICompat()) {
3925#define ABI_VER_MAJOR_MINOR(Major, Minor) \
3926 case LangOptions::ClangABI::Ver##Major##_##Minor: \
3927 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major "." #Minor); \
3929#define ABI_VER_MAJOR(Major) \
3930 case LangOptions::ClangABI::Ver##Major: \
3931 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, #Major ".0"); \
3933#define ABI_VER_LATEST(Latest) \
3934 case LangOptions::ClangABI::Latest: \
3936#include "clang/Basic/ABIVersions.def"
3939 if (Opts.getSignReturnAddressScope() ==
3941 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3942 else if (Opts.getSignReturnAddressScope() ==
3944 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3946 if (Opts.getSignReturnAddressKey() ==
3948 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3954 if (Opts.RelativeCXXABIVTables)
3955 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3957 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3965 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"=" + MP.second);
3975 StringRef S = llvm::getAllocTokenModeAsString(*Opts.
AllocTokenMode);
3976 GenerateArg(Consumer, OPT_falloc_token_mode_EQ, S);
3979 if (Opts.MatrixTypes) {
3980 if (Opts.getDefaultMatrixMemoryLayout() ==
3982 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"column-major");
3983 if (Opts.getDefaultMatrixMemoryLayout() ==
3985 GenerateArg(Consumer, OPT_fmatrix_memory_layout_EQ,
"row-major");
3989bool CompilerInvocation::ParseLangArgs(
LangOptions &Opts, ArgList &Args,
3991 std::vector<std::string> &Includes,
4001 if (Args.hasArg(OPT_fobjc_arc))
4002 Opts.ObjCAutoRefCount = 1;
4006 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
4010 "-fsanitize-ignore-for-ubsan-feature=",
4011 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4022 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
4025 Diags.
Report(diag::err_drv_invalid_value)
4026 << A->getAsString(Args) << A->getValue();
4028 for (
unsigned KindValue = 0;
4034 auto Diag = Diags.
Report(diag::note_drv_use_standard);
4036 unsigned NumAliases = 0;
4037#define LANGSTANDARD(id, name, lang, desc, features, version)
4038#define LANGSTANDARD_ALIAS(id, alias) \
4039 if (KindValue == LangStandard::lang_##id) ++NumAliases;
4040#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4041#include "clang/Basic/LangStandards.def"
4043#define LANGSTANDARD(id, name, lang, desc, features, version)
4044#define LANGSTANDARD_ALIAS(id, alias) \
4045 if (KindValue == LangStandard::lang_##id) Diag << alias;
4046#define LANGSTANDARD_ALIAS_DEPR(id, alias)
4047#include "clang/Basic/LangStandards.def"
4055 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4063 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
4065 llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4066 .Cases({
"cl",
"CL"}, LangStandard::lang_opencl10)
4067 .Cases({
"cl1.0",
"CL1.0"}, LangStandard::lang_opencl10)
4068 .Cases({
"cl1.1",
"CL1.1"}, LangStandard::lang_opencl11)
4069 .Cases({
"cl1.2",
"CL1.2"}, LangStandard::lang_opencl12)
4070 .Cases({
"cl2.0",
"CL2.0"}, LangStandard::lang_opencl20)
4071 .Cases({
"cl3.0",
"CL3.0"}, LangStandard::lang_opencl30)
4072 .Cases({
"clc++",
"CLC++"}, LangStandard::lang_openclcpp10)
4073 .Cases({
"clc++1.0",
"CLC++1.0"}, LangStandard::lang_openclcpp10)
4074 .Cases({
"clc++2021",
"CLC++2021"}, LangStandard::lang_openclcpp2021)
4078 Diags.
Report(diag::err_drv_invalid_value)
4079 << A->getAsString(Args) << A->getValue();
4082 LangStd = OpenCLLangStd;
4086 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4087 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4095#define LANG_OPTION_WITH_MARSHALLING(...) \
4096 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4097#include "clang/Options/Options.inc"
4098#undef LANG_OPTION_WITH_MARSHALLING
4100 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4101 StringRef Name = A->getValue();
4102 if (Name ==
"full") {
4103 Opts.CFProtectionBranch = 1;
4104 Opts.CFProtectionReturn = 1;
4105 }
else if (Name ==
"branch") {
4106 Opts.CFProtectionBranch = 1;
4107 }
else if (Name ==
"return") {
4108 Opts.CFProtectionReturn = 1;
4112 if (Opts.CFProtectionBranch) {
4113 if (
const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4115 llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4116#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
4117 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
4118#include "clang/Basic/CFProtectionOptions.def"
4120 Opts.setCFBranchLabelScheme(Scheme);
4124 if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4125 !Args.hasArg(OPT_sycl_std_EQ)) {
4135 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4136 StringRef value =
arg->getValue();
4138 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4141 if (Args.hasArg(OPT_fobjc_gc_only))
4143 else if (Args.hasArg(OPT_fobjc_gc))
4145 else if (Args.hasArg(OPT_fobjc_arc)) {
4146 Opts.ObjCAutoRefCount = 1;
4148 Diags.
Report(diag::err_arc_unsupported_on_runtime);
4155 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
4156 Opts.ObjCWeakRuntime = 1;
4162 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4163 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
4164 assert(!Opts.ObjCWeak);
4166 Diags.
Report(diag::err_objc_weak_with_gc);
4167 }
else if (!Opts.ObjCWeakRuntime) {
4168 Diags.
Report(diag::err_objc_weak_unsupported);
4172 }
else if (Opts.ObjCAutoRefCount) {
4173 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4176 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4177 Opts.ObjCSubscriptingLegacyRuntime =
4181 if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4184 VersionTuple GNUCVer;
4185 bool Invalid = GNUCVer.tryParse(A->getValue());
4186 unsigned Major = GNUCVer.getMajor();
4187 unsigned Minor = GNUCVer.getMinor().value_or(0);
4188 unsigned Patch = GNUCVer.getSubminor().value_or(0);
4189 if (
Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4190 Diags.
Report(diag::err_drv_invalid_value)
4191 << A->getAsString(Args) << A->getValue();
4193 Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4196 if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4197 Opts.IgnoreXCOFFVisibility = 1;
4199 if (Args.hasArg(OPT_ftrapv)) {
4203 std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4205 else if (Args.hasArg(OPT_fwrapv))
4207 if (Args.hasArg(OPT_fwrapv_pointer))
4208 Opts.PointerOverflowDefined =
true;
4210 Opts.MSCompatibilityVersion = 0;
4211 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4213 if (VT.tryParse(A->getValue()))
4214 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4216 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4217 VT.getMinor().value_or(0) * 100000 +
4218 VT.getSubminor().value_or(0);
4226 (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4229 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4232 Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions, T.isOSzOS());
4234 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4235 && Opts.OpenCLVersion == 200);
4237 bool HasConvergentOperations = Opts.
isTargetDevice() || Opts.OpenCL ||
4238 Opts.HLSL || T.isAMDGPU() || T.isNVPTX();
4239 Opts.ConvergentFunctions =
4240 Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4241 HasConvergentOperations);
4243 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4244 if (!Opts.NoBuiltin)
4246 if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4247 if (A->getOption().matches(options::OPT_mlong_double_64))
4248 Opts.LongDoubleSize = 64;
4249 else if (A->getOption().matches(options::OPT_mlong_double_80))
4250 Opts.LongDoubleSize = 80;
4251 else if (A->getOption().matches(options::OPT_mlong_double_128))
4252 Opts.LongDoubleSize = 128;
4254 Opts.LongDoubleSize = 0;
4256 if (Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4262 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
4264 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4265 << A->getSpelling() <<
"-fdefault-calling-conv";
4267 switch (T.getArch()) {
4268 case llvm::Triple::x86:
4271 case llvm::Triple::m68k:
4275 Diags.
Report(diag::err_drv_argument_not_allowed_with)
4276 << A->getSpelling() << T.getTriple();
4282 Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4284 bool IsSimdSpecified =
4285 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4287 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4289 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4290 Opts.OpenMPIsTargetDevice =
4291 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4292 Opts.OpenMPIRBuilder =
4293 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4294 bool IsTargetSpecified =
4295 Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ);
4297 if (Opts.OpenMP || Opts.OpenMPSimd) {
4299 Args, OPT_fopenmp_version_EQ,
4300 (IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4301 Opts.OpenMP = Version;
4304 if (!Opts.OpenMPIsTargetDevice) {
4305 switch (T.getArch()) {
4309 case llvm::Triple::nvptx:
4310 case llvm::Triple::nvptx64:
4311 Diags.
Report(diag::err_drv_omp_host_target_not_supported) << T.str();
4319 if ((Opts.OpenMPIsTargetDevice && T.isGPU()) || Opts.OpenCLCPlusPlus) {
4321 Opts.Exceptions = 0;
4322 Opts.CXXExceptions = 0;
4324 if (Opts.OpenMPIsTargetDevice && T.isNVPTX()) {
4325 Opts.OpenMPCUDANumSMs =
4327 Opts.OpenMPCUDANumSMs, Diags);
4328 Opts.OpenMPCUDABlocksPerSM =
4330 Opts.OpenMPCUDABlocksPerSM, Diags);
4332 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4333 Opts.OpenMPCUDAReductionBufNum, Diags);
4338 if (Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4339 Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4341 Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4342 if (!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4343 Opts.OpenMPTargetDebug = 1;
4346 if (Opts.OpenMPIsTargetDevice) {
4347 if (Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4348 Opts.OpenMPTeamSubscription =
true;
4349 if (Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4350 Opts.OpenMPThreadSubscription =
true;
4354 if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) {
4355 enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4356 auto getArchPtrSize = [](
const llvm::Triple &T) {
4357 if (T.isArch16Bit())
4359 if (T.isArch32Bit())
4361 assert(T.isArch64Bit() &&
"Expected 64-bit architecture");
4365 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
4366 llvm::Triple TT(A->getValue(i));
4368 if (TT.getArch() == llvm::Triple::UnknownArch ||
4369 !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4370 TT.getArch() == llvm::Triple::spirv64 ||
4371 TT.getArch() == llvm::Triple::systemz ||
4372 TT.getArch() == llvm::Triple::loongarch64 ||
4373 TT.getArch() == llvm::Triple::nvptx ||
4374 TT.getArch() == llvm::Triple::nvptx64 || TT.isAMDGCN() ||
4375 TT.getArch() == llvm::Triple::x86 ||
4376 TT.getArch() == llvm::Triple::x86_64))
4377 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4378 else if (getArchPtrSize(T) != getArchPtrSize(TT))
4379 Diags.
Report(diag::err_drv_incompatible_omp_arch)
4380 << A->getValue(i) << T.str();
4387 Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4388 (T.isNVPTX() || T.isAMDGCN()) &&
4389 Args.hasArg(options::OPT_fopenmp_cuda_mode);
4392 if (Args.hasArg(options::OPT_fopenacc))
4393 Opts.OpenACC =
true;
4395 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4396 StringRef Val = A->getValue();
4399 else if (Val ==
"on")
4401 else if (Val ==
"off")
4403 else if (Val ==
"fast-honor-pragmas")
4406 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4410 Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4411 for (
int i = 0, n = A->getNumValues(); i != n; ++i) {
4413 llvm::StringSwitch<unsigned>(A->getValue(i))
4416 .Case(
"add-unsigned-overflow-test",
4418 .Case(
"add-signed-overflow-test",
4421 .Case(
"unsigned-post-decr-while",
4431 "-fsanitize-ignore-for-ubsan-feature=",
4432 Args.getAllArgValues(OPT_fsanitize_ignore_for_ubsan_feature_EQ), Diags,
4434 Opts.
NoSanitizeFiles = Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4435 std::vector<std::string> systemIgnorelists =
4436 Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4438 systemIgnorelists.begin(),
4439 systemIgnorelists.end());
4441 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4442 Opts.setClangABICompat(LangOptions::ClangABI::Latest);
4444 StringRef Ver = A->getValue();
4445 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4446 int Major, Minor = 0;
4450 if (!VerParts.first.starts_with(
"0") &&
4451 !VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4452 Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4454 ? VerParts.second.size() == 1 &&
4455 !VerParts.second.getAsInteger(10, Minor)
4456 : VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4458#define ABI_VER_MAJOR_MINOR(Major_, Minor_) \
4459 if (std::tuple(Major, Minor) <= std::tuple(Major_, Minor_)) \
4460 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_##_##Minor_); \
4462#define ABI_VER_MAJOR(Major_) \
4463 if (Major <= Major_) \
4464 Opts.setClangABICompat(LangOptions::ClangABI::Ver##Major_); \
4466#define ABI_VER_LATEST(Latest) \
4469#include "clang/Basic/ABIVersions.def"
4470 }
else if (Ver !=
"latest") {
4471 Diags.
Report(diag::err_drv_invalid_value)
4472 << A->getAsString(Args) << A->getValue();
4476 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4477 StringRef SignScope = A->getValue();
4479 if (SignScope.equals_insensitive(
"none"))
4480 Opts.setSignReturnAddressScope(
4482 else if (SignScope.equals_insensitive(
"all"))
4483 Opts.setSignReturnAddressScope(
4485 else if (SignScope.equals_insensitive(
"non-leaf"))
4486 Opts.setSignReturnAddressScope(
4489 Diags.
Report(diag::err_drv_invalid_value)
4490 << A->getAsString(Args) << SignScope;
4492 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4493 StringRef SignKey = A->getValue();
4494 if (!SignScope.empty() && !SignKey.empty()) {
4495 if (SignKey ==
"a_key")
4496 Opts.setSignReturnAddressKey(
4498 else if (SignKey ==
"b_key")
4499 Opts.setSignReturnAddressKey(
4502 Diags.
Report(diag::err_drv_invalid_value)
4503 << A->getAsString(Args) << SignKey;
4509 StringRef
CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ);
4516 Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI << T.str();
4522 Opts.RelativeCXXABIVTables =
4523 Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4524 options::OPT_fno_experimental_relative_cxx_abi_vtables,
4528 bool HasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4529 Opts.OmitVTableRTTI =
4530 Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4531 options::OPT_fno_experimental_omit_vtable_rtti,
false);
4532 if (Opts.OmitVTableRTTI && HasRTTI)
4533 Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4535 for (
const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4536 auto Split = StringRef(A).split(
'=');
4538 {std::string(
Split.first), std::string(
Split.second)});
4542 !Args.getLastArg(OPT_fno_file_reproducible) &&
4543 (Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4544 Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4545 Args.getLastArg(OPT_ffile_reproducible));
4548 if (Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4550 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4551 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4553 if (Arg *A = Args.getLastArg(options::OPT_mvscale_streaming_min_EQ)) {
4555 if (StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4556 Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4559 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4560 std::ifstream SeedFile(A->getValue(0));
4562 if (!SeedFile.is_open())
4563 Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4569 if (
const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4572 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_max_EQ)) {
4573 StringRef S = Arg->getValue();
4575 if (S.getAsInteger(0,
Value))
4576 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4581 if (
const auto *Arg = Args.getLastArg(options::OPT_falloc_token_mode_EQ)) {
4582 StringRef S = Arg->getValue();
4583 if (
auto Mode = getAllocTokenModeFromString(S))
4586 Diags.
Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << S;
4590 if (Opts.MatrixTypes) {
4591 if (
const Arg *A = Args.getLastArg(OPT_fmatrix_memory_layout_EQ)) {
4592 StringRef ClangValue = A->getValue();
4593 if (ClangValue ==
"row-major")
4594 Opts.setDefaultMatrixMemoryLayout(
4597 Opts.setDefaultMatrixMemoryLayout(
4600 for (Arg *A : Args.filtered(options::OPT_mllvm)) {
4601 StringRef OptValue = A->getValue();
4602 if (OptValue.consume_front(
"-matrix-default-layout=") &&
4603 ClangValue != OptValue)
4604 Diags.
Report(diag::err_conflicting_matrix_layout_flags)
4605 << ClangValue << OptValue;
4614 if (T.isDXIL() || T.isSPIRVLogical()) {
4616 enum {
OS, Environment };
4618 int ExpectedOS = T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4620 if (T.getOSName().empty()) {
4621 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4622 << ExpectedOS <<
OS << T.str();
4623 }
else if (T.getEnvironmentName().empty()) {
4624 Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4626 }
else if (!T.isShaderStageEnvironment()) {
4627 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4628 <<
ShaderStage << T.getEnvironmentName() << T.str();
4632 if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
4633 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4634 << ShaderModel << T.getOSName() << T.str();
4639 if (Args.getLastArg(OPT_fnative_half_type) ||
4640 Args.getLastArg(OPT_fnative_int16_type)) {
4641 const LangStandard &Std =
4643 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018 &&
4644 T.getOSVersion() >= VersionTuple(6, 2)))
4645 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4646 <<
"-enable-16bit-types" <<
true << Std.
getName()
4647 << T.getOSVersion().getAsString();
4649 }
else if (T.isSPIRVLogical()) {
4650 if (!T.isVulkanOS() || T.getVulkanVersion() == VersionTuple(0)) {
4651 Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4652 << VulkanEnv << T.getOSName() << T.str();
4654 if (Args.getLastArg(OPT_fnative_half_type) ||
4655 Args.getLastArg(OPT_fnative_int16_type)) {
4656 const char *Str = Args.getLastArg(OPT_fnative_half_type)
4657 ?
"-fnative-half-type"
4658 :
"-fnative-int16-type";
4659 const LangStandard &Std =
4661 if (!(Opts.
LangStd >= LangStandard::lang_hlsl2018))
4662 Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4663 << Str <<
false << Std.
getName();
4666 llvm_unreachable(
"expected DXIL or SPIR-V target");
4669 Diags.
Report(diag::err_drv_hlsl_unsupported_target) << T.str();
4671 if (Opts.
LangStd < LangStandard::lang_hlsl202x) {
4672 const LangStandard &Requested =
4674 const LangStandard &Recommended =
4676 Diags.
Report(diag::warn_hlsl_langstd_minimal)
4727 llvm_unreachable(
"invalid frontend action");
4772 llvm_unreachable(
"invalid frontend action");
4782#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4783 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4784#include "clang/Options/Options.inc"
4785#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4788 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4791 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D);
4798 for (
const auto &M : Opts.
Macros) {
4801 if (M.first ==
"__CET__=1" && !M.second &&
4802 !CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4804 if (M.first ==
"__CET__=2" && !M.second && CodeGenOpts.CFProtectionReturn &&
4805 !CodeGenOpts.CFProtectionBranch)
4807 if (M.first ==
"__CET__=3" && !M.second && CodeGenOpts.CFProtectionReturn &&
4808 CodeGenOpts.CFProtectionBranch)
4811 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4814 for (
const auto &I : Opts.
Includes) {
4817 if (LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4818 ((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4823 if (LangOpts.HLSL && I ==
"hlsl.h")
4833 GenerateArg(Consumer, OPT_remap_file, RF.first +
";" + RF.second);
4839 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4842 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4856#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \
4857 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4858#include "clang/Options/Options.inc"
4859#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
4861 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
4862 Args.hasArg(OPT_pch_through_hdrstop_use);
4864 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4867 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4868 StringRef
Value(A->getValue());
4869 size_t Comma =
Value.find(
',');
4871 unsigned EndOfLine = 0;
4873 if (Comma == StringRef::npos ||
4874 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4875 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4876 Diags.
Report(diag::err_drv_preamble_format);
4884 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
4885 if (A->getOption().matches(OPT_D))
4892 for (
const auto *A : Args.filtered(OPT_include))
4893 Opts.
Includes.emplace_back(A->getValue());
4895 for (
const auto *A : Args.filtered(OPT_chain_include))
4898 for (
const auto *A : Args.filtered(OPT_remap_file)) {
4899 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4901 if (Split.second.empty()) {
4902 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4909 if (
const Arg *A = Args.getLastArg(OPT_source_date_epoch)) {
4910 StringRef Epoch = A->getValue();
4914 const uint64_t MaxTimestamp =
4915 std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4917 if (Epoch.getAsInteger(10,
V) ||
V > MaxTimestamp) {
4918 Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4919 << Epoch << MaxTimestamp;
4925 for (
const auto *A : Args.filtered(OPT_embed_dir_EQ)) {
4926 StringRef Val = A->getValue();
4937 Args.hasFlag(OPT_fdefine_target_os_macros,
4949#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4950 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4951#include "clang/Options/Options.inc"
4952#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4970#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \
4971 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
4972#include "clang/Options/Options.inc"
4973#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
4976 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4985#define TARGET_OPTION_WITH_MARSHALLING(...) \
4986 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__)
4987#include "clang/Options/Options.inc"
4988#undef TARGET_OPTION_WITH_MARSHALLING
4994 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
5004#define TARGET_OPTION_WITH_MARSHALLING(...) \
5005 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__)
5006#include "clang/Options/Options.inc"
5007#undef TARGET_OPTION_WITH_MARSHALLING
5009 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
5010 llvm::VersionTuple Version;
5011 if (Version.tryParse(A->getValue()))
5012 Diags.
Report(diag::err_drv_invalid_value)
5013 << A->getAsString(Args) << A->getValue();
5018 Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
5019 llvm::VersionTuple Version;
5020 if (Version.tryParse(A->getValue()))
5021 Diags.
Report(diag::err_drv_invalid_value)
5022 << A->getAsString(Args) << A->getValue();
5030bool CompilerInvocation::CreateFromArgsImpl(
5038 unsigned MissingArgIndex, MissingArgCount;
5039 InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
5040 MissingArgCount, VisibilityMask);
5044 if (MissingArgCount)
5045 Diags.
Report(diag::err_drv_missing_argument)
5046 << Args.getArgString(MissingArgIndex) << MissingArgCount;
5049 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
5050 auto ArgString = A->getAsString(Args);
5051 std::string Nearest;
5052 if (Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
5053 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
5055 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
5056 << ArgString << Nearest;
5089 !Diags.
isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) {
5103 Diags.
Report(diag::warn_drv_openacc_without_cir);
5116 !
LangOpts.Sanitize.has(SanitizerKind::Address) &&
5117 !
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
5118 !
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
5119 !
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5132 Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5138 Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5149 llvm::driver::ProfileInstrKind::ProfileNone)
5150 Diags.
Report(diag::err_drv_profile_instrument_use_path_with_no_kind);
5160 const char *Argv0) {
5166 return CreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5170 Args.push_back(
"-cc1");
5173 Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5178 llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5193#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
5194 if constexpr (CK::Compatibility != CK::Benign) \
5195 HBuilder.add(LangOpts->Name);
5196#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
5197 if constexpr (CK::Compatibility != CK::Benign) \
5198 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
5199#include "clang/Basic/LangOptions.def"
5204 HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5221 StringRef MacroDef =
Macro.first;
5223 llvm::CachedHashString(MacroDef.split(
'=').first)))
5227 HBuilder.add(
Macro);
5243#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name);
5244#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5245 HBuilder.add(diagOpts.get##Name());
5246#include "clang/Basic/DiagnosticOptions.def"
5256 ext->hashExtension(HBuilder);
5263 HBuilder.add(*Minor);
5264 if (
auto Subminor =
APINotesOpts.SwiftVersion.getSubminor())
5265 HBuilder.add(*Subminor);
5267 HBuilder.add(*Build);
5273#define CODEGENOPT(Name, Bits, Default, Compatibility) \
5274 if constexpr (CK::Compatibility != CK::Benign) \
5275 HBuilder.add(CodeGenOpts->Name);
5276#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
5277 if constexpr (CK::Compatibility != CK::Benign) \
5278 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5279#define DEBUGOPT(Name, Bits, Default, Compatibility)
5280#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
5281#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
5282#include "clang/Basic/CodeGenOptions.def"
5294#define DEBUGOPT(Name, Bits, Default, Compatibility) \
5295 if constexpr (CK::Compatibility != CK::Benign) \
5296 HBuilder.add(CodeGenOpts->Name);
5297#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) \
5298 if constexpr (CK::Compatibility != CK::Benign) \
5299 HBuilder.add(CodeGenOpts->Name);
5300#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) \
5301 if constexpr (CK::Compatibility != CK::Benign) \
5302 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name()));
5303#include "clang/Basic/DebugOptions.def"
5310 if (!SanHash.
empty())
5311 HBuilder.add(SanHash.
Mask);
5313 llvm::MD5::MD5Result
Result;
5314 HBuilder.getHasher().final(
Result);
5316 return toString(llvm::APInt(64, Hash), 36,
false);
5320 llvm::function_ref<
bool(std::string &)> Predicate) {
5321#define RETURN_IF(PATH) \
5323 if (Predicate(PATH)) \
5327#define RETURN_IF_MANY(PATHS) \
5329 if (llvm::any_of(PATHS, Predicate)) \
5333 auto &HeaderSearchOpts = *this->
HSOpts;
5336 for (
auto &Entry : HeaderSearchOpts.UserEntries)
5337 if (Entry.IgnoreSysRoot)
5339 RETURN_IF(HeaderSearchOpts.ResourceDir);
5340 RETURN_IF(HeaderSearchOpts.ModuleCachePath);
5341 RETURN_IF(HeaderSearchOpts.ModuleUserBuildPath);
5342 for (
auto &[Name,
File] : HeaderSearchOpts.PrebuiltModuleFiles)
5356 if (Input.isBuffer())
5371 auto &FileSystemOpts = *this->
FSOpts;
5393 llvm::function_ref<
bool(StringRef)> Callback)
const {
5397 [&Callback](std::string &Path) {
return Callback(StringRef(Path)); });
5425 std::vector<std::string> Args{
"-cc1"};
5427 [&Args](
const Twine &Arg) { Args.push_back(Arg.str()); });
5453 llvm::vfs::getRealFileSystem());
5461 Diags, std::move(BaseFS));
5467 if (VFSOverlayFiles.empty())
5472 for (
const auto &
File : VFSOverlayFiles) {
5473 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5476 Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5481 std::move(Buffer.get()),
nullptr,
File,
5484 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)