;
106using namespacedriver;
107using namespaceoptions;
118 if(Arg.getAsInteger(10, Val))
119 returnllvm::createStringError(llvm::inconvertibleErrorCode(),
120 "Not an integer: %s", Arg.data());
129template<
classT> std::shared_ptr<T> make_shared_copy(
const T&
X) {
130 returnstd::make_shared<T>(
X);
135 returnllvm::makeIntrusiveRefCnt<T>(
X);
157 LangOpts= make_shared_copy(
X.getLangOpts());
158 TargetOpts= make_shared_copy(
X.getTargetOpts());
160 HSOpts= make_shared_copy(
X.getHeaderSearchOpts());
161 PPOpts= make_shared_copy(
X.getPreprocessorOpts());
162 AnalyzerOpts= makeIntrusiveRefCntCopy(
X.getAnalyzerOpts());
166 FSOpts= make_shared_copy(
X.getFileSystemOpts());
206template<
typenameT>
207T&ensureOwned(std::shared_ptr<T> &Storage) {
208 if(Storage.use_count() > 1)
209Storage = std::make_shared<T>(*Storage);
213template<
typenameT>
215 if(Storage.useCount() > 1)
216Storage = llvm::makeIntrusiveRefCnt<T>(*Storage);
234 returnensureOwned(
HSOpts);
238 returnensureOwned(
PPOpts);
258 returnensureOwned(
FSOpts);
280#define OPTTABLE_STR_TABLE_CODE 281#include "clang/Driver/Options.inc" 282#undef OPTTABLE_STR_TABLE_CODE 285 returnOptionStrTable[Offset];
288#define SIMPLE_ENUM_VALUE_TABLE 289#include "clang/Driver/Options.inc" 290#undef SIMPLE_ENUM_VALUE_TABLE 296 if(Args.hasArg(Opt))
305 if(Args.hasArg(Opt))
315 unsignedSpellingOffset, Option::OptionClass,
320 constTwine &Spelling, Option::OptionClass,
326 return!std::is_same_v<T, uint64_t> && llvm::is_integral_or_enum<T>::value;
329template<
typename T,
330std::enable_if_t<!is_uint64_t_convertible<T>(),
bool> =
false>
332 return[
Value](OptSpecifier Opt,
unsigned,
constArgList &Args,
334 if(Args.hasArg(Opt))
340template<
typename T,
341std::enable_if_t<is_uint64_t_convertible<T>(),
bool> =
false>
347OptSpecifier OtherOpt) {
348 return[
Value, OtherValue,
349OtherOpt](OptSpecifier Opt,
unsigned,
constArgList &Args,
351 if(
constArg *A = Args.getLastArg(Opt, OtherOpt)) {
352 returnA->getOption().matches(Opt) ?
Value: OtherValue;
360Option::OptionClass,
unsigned,
boolKeyPath) {
361 if(KeyPath ==
Value)
367 constTwine &Spelling,
368Option::OptionClass OptClass,
unsigned,
369 constTwine &
Value) {
371 caseOption::SeparateClass:
372 caseOption::JoinedOrSeparateClass:
373 caseOption::JoinedAndSeparateClass:
377 caseOption::JoinedClass:
378 caseOption::CommaJoinedClass:
379Consumer(Spelling +
Value);
382llvm_unreachable(
"Cannot denormalize an option with option class " 383 "incompatible with string denormalization.");
387template<
typenameT>
390Option::OptionClass OptClass,
unsignedTableIndex,
T Value) {
392TableIndex, Twine(
Value));
395template<
typenameT>
397Option::OptionClass OptClass,
unsignedTableIndex,
402staticstd::optional<SimpleEnumValue>
404 for(
intI = 0,
E= Table.Size; I !=
E; ++I)
405 if(Name == Table.Table[I].Name)
406 returnTable.Table[I];
411staticstd::optional<SimpleEnumValue>
413 for(
intI = 0,
E= Table.Size; I !=
E; ++I)
415 returnTable.Table[I];
424assert(TableIndex < SimpleEnumValueTablesSize);
425 constSimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
427 auto*Arg = Args.getLastArg(Opt);
431StringRef ArgValue = Arg->getValue();
433 returnMaybeEnumVal->Value;
435Diags.
Report(diag::err_drv_invalid_value)
436<< Arg->getAsString(Args) << ArgValue;
441 unsignedSpellingOffset,
442Option::OptionClass OptClass,
443 unsignedTableIndex,
unsigned Value) {
444assert(TableIndex < SimpleEnumValueTablesSize);
445 constSimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
448TableIndex, MaybeEnumVal->Name);
450llvm_unreachable(
"The simple enum value was not correctly defined in " 451 "the tablegen option description");
455template<
typenameT>
457 unsignedSpellingOffset,
458Option::OptionClass OptClass,
459 unsignedTableIndex,
T Value) {
461TableIndex,
static_cast<unsigned>(
Value));
468 auto*Arg = Args.getLastArg(Opt);
471 returnstd::string(Arg->getValue());
474template<
typenameIntTy>
478 auto*Arg = Args.getLastArg(Opt);
482 if(StringRef(Arg->getValue()).getAsInteger(0, Res)) {
483Diags.
Report(diag::err_drv_invalid_int_value)
484<< Arg->getAsString(Args) << Arg->getValue();
490staticstd::optional<std::vector<std::string>>
493 returnArgs.getAllArgValues(Opt);
497 unsignedSpellingOffset,
498Option::OptionClass OptClass,
500 conststd::vector<std::string> &Values) {
502 caseOption::CommaJoinedClass: {
503std::string CommaJoinedValue;
504 if(!Values.empty()) {
505CommaJoinedValue.append(Values.front());
506 for(
conststd::string &
Value: llvm::drop_begin(Values, 1)) {
507CommaJoinedValue.append(
",");
508CommaJoinedValue.append(
Value);
512Option::OptionClass::JoinedClass, TableIndex,
516 caseOption::JoinedClass:
517 caseOption::SeparateClass:
518 caseOption::JoinedOrSeparateClass:
519 for(
conststd::string &
Value: Values)
523llvm_unreachable(
"Cannot denormalize an option with option class " 524 "incompatible with string vector denormalization.");
532 auto*Arg = Args.getLastArg(Opt);
535 returnllvm::Triple::normalize(Arg->getValue());
538template<
typenameT,
typenameU>
540 return static_cast<T>(
Value);
544 returnKeyPath |
Value;
551template<
typenameT,
typenameU, U Value>
556#define PARSE_OPTION_WITH_MARSHALLING( \ 557 ARGS, DIAGS, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, \ 558 ALIASARGS, FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \ 559 METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \ 560 IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \ 562 if ((VISIBILITY) & options::CC1Option) { \ 563 KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \ 565 KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \ 567 if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \ 569 MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \ 574#define GENERATE_OPTION_WITH_MARSHALLING( \ 575 CONSUMER, PREFIX_TYPE, SPELLING_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \ 576 FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \ 577 SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, \ 578 IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \ 579 if ((VISIBILITY) & options::CC1Option) { \ 580 [&](const auto &Extracted) { \ 583 static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \ 584 : (DEFAULT_VALUE)))) \ 585 DENORMALIZER(CONSUMER, SPELLING_OFFSET, Option::KIND##Class, \ 586 TABLE_INDEX, Extracted); \ 587 }(EXTRACTOR(KEYPATH)); \ 601CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
602CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
603CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
604CodeGenOpts.DisableFree = FrontendOpts.
DisableFree;
607CodeGenOpts.ClearASTBeforeBackend =
false;
609LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables;
610LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening;
613llvm::Triple
T(TargetOpts.
Triple);
614llvm::Triple::ArchType Arch =
T.getArch();
619 if(LangOpts.getExceptionHandling() !=
621 T.isWindowsMSVCEnvironment())
622Diags.
Report(diag::err_fe_invalid_exception_model)
623<<
static_cast<unsigned>(LangOpts.getExceptionHandling()) <<
T.str();
625 if(LangOpts.AppleKext && !LangOpts.CPlusPlus)
626Diags.
Report(diag::warn_c_kext);
628 if(LangOpts.NewAlignOverride &&
629!llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) {
630Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
631Diags.
Report(diag::err_fe_invalid_alignment)
632<< A->getAsString(Args) << A->getValue();
633LangOpts.NewAlignOverride = 0;
638 if(LangOpts.CPlusPlus11) {
639 if(Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) {
640Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals);
641Diags.
Report(diag::warn_drv_fraw_string_literals_in_cxx11)
642<<
bool(LangOpts.RawStringLiterals);
646LangOpts.RawStringLiterals =
true;
650 if(LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
651Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fsycl-is-device" 652<<
"-fsycl-is-host";
654 if(Args.hasArg(OPT_fgnu89_inline) && LangOpts.CPlusPlus)
655Diags.
Report(diag::err_drv_argument_not_allowed_with)
658 if(Args.hasArg(OPT_hlsl_entrypoint) && !LangOpts.HLSL)
659Diags.
Report(diag::err_drv_argument_not_allowed_with)
662 if(Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
663Diags.
Report(diag::warn_ignored_hip_only_option)
664<< Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
666 if(Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
667Diags.
Report(diag::warn_ignored_hip_only_option)
668<< Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
677 if(Args.hasArg(OPT_ffp_eval_method_EQ)) {
678 if(LangOpts.ApproxFunc)
679Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 0;
680 if(LangOpts.AllowFPReassoc)
681Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 1;
682 if(LangOpts.AllowRecip)
683Diags.
Report(diag::err_incompatible_fp_eval_method_options) << 2;
689 if(Args.getLastArg(OPT_cl_strict_aliasing) &&
691Diags.
Report(diag::warn_option_invalid_ocl_version)
693<< Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
695 if(Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
696 autoDefaultCC = LangOpts.getDefaultCallingConv();
700Arch != llvm::Triple::x86;
706Diags.
Report(diag::err_drv_argument_not_allowed_with)
707<< A->getSpelling() <<
T.getTriple();
719 unsignedDefaultOpt = 0;
722!Args.hasArg(OPT_cl_opt_disable))
725 if(Arg *A = Args.getLastArg(options::OPT_O_Group)) {
726 if(A->getOption().matches(options::OPT_O0))
729 if(A->getOption().matches(options::OPT_Ofast))
732assert(A->getOption().matches(options::OPT_O));
734StringRef S(A->getValue());
735 if(S ==
"s"|| S ==
"z")
748 if(Arg *A = Args.getLastArg(options::OPT_O_Group)) {
749 if(A->getOption().matches(options::OPT_O)) {
750 switch(A->getValue()[0]) {
764llvm::opt::OptSpecifier OptSpecifier) {
767Option::OptionClass::FlagClass, 0);
771llvm::opt::OptSpecifier OptSpecifier,
772 constTwine &
Value) {
810 boolCheckAgainstOriginalInvocation =
false,
811 boolForceRoundTrip =
false) {
813 boolDoRoundTripDefault =
true;
815 boolDoRoundTripDefault =
false;
818 boolDoRoundTrip = DoRoundTripDefault;
819 if(ForceRoundTrip) {
822 for(
const auto*Arg : CommandLineArgs) {
823 if(Arg == StringRef(
"-round-trip-args"))
825 if(Arg == StringRef(
"-no-round-trip-args"))
826DoRoundTrip =
false;
833 returnParse(RealInvocation, CommandLineArgs, Diags, Argv0);
838llvm::raw_string_ostream OS(Buffer);
839 for(
const char*Arg : Args) {
840llvm::sys::printArg(OS, Arg,
true);
852 if(!Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) ||
859 auto Success= Parse(RealInvocation, CommandLineArgs, Diags, Argv0);
865Diags.
Report(diag::err_cc1_round_trip_fail_then_ok);
866Diags.
Report(diag::note_cc1_round_trip_original)
867<< SerializeArgs(CommandLineArgs);
872llvm::BumpPtrAllocator Alloc;
873llvm::StringSaver StringPool(Alloc);
874 autoSA = [&StringPool](
constTwine &Arg) {
875 returnStringPool.save(Arg).data();
882Generate(DummyInvocation, GeneratedArgs, SA);
888 boolSuccess2 = Parse(RealInvocation, GeneratedArgs, Diags, Argv0);
893Diags.
Report(diag::err_cc1_round_trip_ok_then_fail);
894Diags.
Report(diag::note_cc1_round_trip_generated)
895<< 1 << SerializeArgs(GeneratedArgs);
900 if(CheckAgainstOriginalInvocation)
902ComparisonArgs.assign(CommandLineArgs.begin(), CommandLineArgs.end());
906Generate(RealInvocation, ComparisonArgs, SA);
911 returnstd::equal(A.begin(), A.end(), B.begin(), B.end(),
912[](
const char*AElem,
const char*BElem) {
913return StringRef(AElem) == StringRef(BElem);
920 if(!
Equal(GeneratedArgs, ComparisonArgs)) {
921Diags.
Report(diag::err_cc1_round_trip_mismatch);
922Diags.
Report(diag::note_cc1_round_trip_generated)
923<< 1 << SerializeArgs(GeneratedArgs);
924Diags.
Report(diag::note_cc1_round_trip_generated)
925<< 2 << SerializeArgs(ComparisonArgs);
929Diags.
Report(diag::remark_cc1_round_trip_generated)
930<< 1 << SerializeArgs(GeneratedArgs);
931Diags.
Report(diag::remark_cc1_round_trip_generated)
932<< 2 << SerializeArgs(ComparisonArgs);
944 returnCreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
948Args.push_back(
"-cc1");
951DummyInvocation1, DummyInvocation2, Args, Diags, Argv0,
956OptSpecifier GroupWithValue,
957std::vector<std::string> &Diagnostics) {
958 for(
auto*A : Args.filtered(Group)) {
959 if(A->getOption().getKind() == Option::FlagClass) {
962Diagnostics.push_back(
963std::string(A->getOption().getName().drop_front(1)));
964}
else if(A->getOption().matches(GroupWithValue)) {
967Diagnostics.push_back(
968std::string(A->getOption().getName().drop_front(1).rtrim(
"=-")));
971Diagnostics.push_back(A->getValue());
982std::vector<std::string> &Funcs) {
983std::vector<std::string> Values = Args.getAllArgValues(OPT_fno_builtin_);
985Funcs.insert(Funcs.end(), Values.begin(), BuiltinEnd);
992#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ 993 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 994#include "clang/Driver/Options.inc" 995#undef ANALYZER_OPTION_WITH_MARSHALLING 999#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ 1001 GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \ 1003#include "clang/StaticAnalyzer/Core/Analyses.def" 1005llvm_unreachable(
"Tried to generate unknown analysis constraint.");
1011#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ 1013 GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \ 1015#include "clang/StaticAnalyzer/Core/Analyses.def" 1017llvm_unreachable(
"Tried to generate unknown analysis diagnostic client.");
1023#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \ 1025 GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \ 1027#include "clang/StaticAnalyzer/Core/Analyses.def" 1029llvm_unreachable(
"Tried to generate unknown analysis purge mode.");
1035#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \ 1037 GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \ 1039#include "clang/StaticAnalyzer/Core/Analyses.def" 1041llvm_unreachable(
"Tried to generate unknown analysis inlining mode.");
1047CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker;
1056 for(
const auto&
C: Opts.
Config)
1057SortedConfigOpts.emplace_back(
C.getKey(),
C.getValue());
1058llvm::sort(SortedConfigOpts, llvm::less_first());
1060 for(
const auto&[Key,
Value] : SortedConfigOpts) {
1063 autoEntry = ConfigOpts.
Config.find(Key);
1064 if(Entry != ConfigOpts.
Config.end() && Entry->getValue() ==
Value)
1079#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ 1080 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 1081#include "clang/Driver/Options.inc" 1082#undef ANALYZER_OPTION_WITH_MARSHALLING 1084 if(Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
1085StringRef Name = A->getValue();
1087#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ 1088 .Case(CMDFLAG, NAME##Model) 1089#include "clang/StaticAnalyzer/Core/Analyses.def" 1092Diags.
Report(diag::err_drv_invalid_value)
1093<< A->getAsString(Args) << Name;
1096 if(
Value== AnalysisConstraints::Z3ConstraintsModel) {
1097Diags.
Report(diag::err_analyzer_not_built_with_z3);
1104 if(Arg *A = Args.getLastArg(OPT_analyzer_output)) {
1105StringRef Name = A->getValue();
1107#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ 1108 .Case(CMDFLAG, PD_##NAME) 1109#include "clang/StaticAnalyzer/Core/Analyses.def" 1112Diags.
Report(diag::err_drv_invalid_value)
1113<< A->getAsString(Args) << Name;
1119 if(Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
1120StringRef Name = A->getValue();
1122#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \ 1123 .Case(CMDFLAG, NAME) 1124#include "clang/StaticAnalyzer/Core/Analyses.def" 1127Diags.
Report(diag::err_drv_invalid_value)
1128<< A->getAsString(Args) << Name;
1134 if(Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
1135StringRef Name = A->getValue();
1137#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \ 1138 .Case(CMDFLAG, NAME) 1139#include "clang/StaticAnalyzer/Core/Analyses.def" 1142Diags.
Report(diag::err_drv_invalid_value)
1143<< A->getAsString(Args) << Name;
1150 for(
constArg *A :
1151Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
1153 boolIsEnabled = A->getOption().getID() == OPT_analyzer_checker;
1156StringRef CheckerAndPackageList = A->getValue();
1158CheckerAndPackageList.split(CheckersAndPackages,
",");
1159 for(
constStringRef &CheckerOrPackage : CheckersAndPackages)
1165 for(
const auto*A : Args.filtered(OPT_analyzer_config)) {
1169StringRef configList = A->getValue();
1171configList.split(configVals,
",");
1172 for(
const auto&configVal : configVals) {
1174std::tie(key, val) = configVal.split(
"=");
1177diag::err_analyzer_config_no_value) << configVal;
1180 if(val.contains(
'=')) {
1182diag::err_analyzer_config_multiple_values)
1191Diags.
Report(diag::err_analyzer_config_unknown) << key;
1196Opts.
Config[key] = std::string(val);
1206 for(
unsignedi = 0; i < Args.getNumInputArgStrings(); ++i) {
1209os << Args.getArgString(i);
1216StringRef OptionName, StringRef DefaultVal) {
1217 returnConfig.insert({OptionName, std::string(DefaultVal)}).first->second;
1222StringRef &OptionField, StringRef Name,
1223StringRef DefaultVal) {
1232 bool&OptionField, StringRef Name,
boolDefaultVal) {
1233 autoPossiblyInvalidVal =
1234llvm::StringSwitch<std::optional<bool>>(
1236.Case(
"true",
true)
1237.Case(
"false",
false)
1238.Default(std::nullopt);
1240 if(!PossiblyInvalidVal) {
1242Diags->
Report(diag::err_analyzer_config_invalid_input)
1243<< Name <<
"a boolean";
1245OptionField = DefaultVal;
1247OptionField = *PossiblyInvalidVal;
1252 unsigned&OptionField, StringRef Name,
1253 unsignedDefaultVal) {
1255OptionField = DefaultVal;
1256 boolHasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
1257.getAsInteger(0, OptionField);
1258 if(Diags && HasFailed)
1259Diags->
Report(diag::err_analyzer_config_invalid_input)
1260<< Name <<
"an unsigned";
1266 unsignedDefaultVal) {
1269 if(Parsed.has_value()) {
1270OptionField = Parsed.value();
1273 if(Diags && !Parsed.has_value())
1274Diags->
Report(diag::err_analyzer_config_invalid_input)
1275<< Name <<
"a positive";
1277OptionField = DefaultVal;
1285#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \ 1286 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL); 1287#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(...) 1288#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def" 1290assert(AnOpts.UserMode ==
"shallow"|| AnOpts.UserMode ==
"deep");
1291 const boolInShallowMode = AnOpts.UserMode ==
"shallow";
1293#define ANALYZER_OPTION(...) 1294#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \ 1295 SHALLOW_VAL, DEEP_VAL) \ 1296 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, \ 1297 InShallowMode ? SHALLOW_VAL : DEEP_VAL); 1298#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def" 1305 if(!AnOpts.RawSilencedCheckersAndPackages.empty()) {
1306std::vector<StringRef> Checkers =
1308std::vector<StringRef> Packages =
1312AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages,
";");
1314 for(
constStringRef &CheckerOrPackage : CheckersAndPackages) {
1316 boolIsChecker = CheckerOrPackage.contains(
'.');
1317 boolIsValidName = IsChecker
1318? llvm::is_contained(Checkers, CheckerOrPackage)
1319: llvm::is_contained(Packages, CheckerOrPackage);
1322Diags->
Report(diag::err_unknown_analyzer_checker_or_package)
1323<< CheckerOrPackage;
1333 if(AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
1334Diags->
Report(diag::err_analyzer_config_invalid_input)
1335<<
"track-conditions-debug"<<
"'track-conditions' to also be enabled";
1337 if(!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir))
1338Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"ctu-dir" 1341 if(!AnOpts.ModelPath.empty() &&
1342!llvm::sys::fs::is_directory(AnOpts.ModelPath))
1343Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"model-path" 1352 if(
Remark.hasValidPattern()) {
1357 GenerateArg(Consumer, OPT_R_Joined, StringRef(
"no-") + Name);
1366OptSpecifier OptEQ, StringRef Name) {
1369 autoInitializeResultPattern = [&Diags, &Args, &
Result](
constArg *A,
1370StringRef Pattern) {
1371 Result.Pattern = Pattern.str();
1373std::string RegexError;
1374 Result.Regex = std::make_shared<llvm::Regex>(
Result.Pattern);
1375 if(!
Result.Regex->isValid(RegexError)) {
1376Diags.
Report(diag::err_drv_optimization_remark_pattern)
1377<< RegexError << A->getAsString(Args);
1384 for(Arg *A : Args) {
1385 if(A->getOption().matches(OPT_R_Joined)) {
1386StringRef
Value= A->getValue();
1390 else if(
Value==
"everything")
1392 else if(
Value.split(
'-') == std::make_pair(StringRef(
"no"), Name))
1394 else if(
Value==
"no-everything")
1402 Result.Regex =
nullptr;
1404InitializeResultPattern(A,
".*");
1406}
else if(A->getOption().matches(OptEQ)) {
1408 if(!InitializeResultPattern(A, A->getValue()))
1417 conststd::vector<std::string> &Levels,
1421 for(
const auto&Level : Levels) {
1423llvm::StringSwitch<DiagnosticLevelMask>(Level)
1431Diags.
Report(diag::err_drv_invalid_value) << FlagName << Level;
1439 conststd::vector<std::string> &Sanitizers,
1441 for(
const auto&Sanitizer : Sanitizers) {
1444Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1458 conststd::vector<std::string> &Sanitizers,
1461 for(
const auto&Sanitizer : Sanitizers) {
1463Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
1472llvm::SplitString(Bundle, BundleParts,
",");
1473 for(
const auto&B : BundleParts) {
1477 D.Report(diag::err_drv_invalid_value) << FlagName << Bundle;
1491llvm::raw_string_ostream OS(Buffer);
1492llvm::interleave(BundleParts, OS, [&OS](StringRef Part) { OS << Part; },
",");
1498 constTwine &ProfileName,
1499llvm::vfs::FileSystem &FS,
1501 autoReaderOrErr = llvm::IndexedInstrProfReader::create(ProfileName, FS);
1502 if(
auto E= ReaderOrErr.takeError()) {
1504 "Error in reading profile %0: %1");
1505llvm::handleAllErrors(std::move(
E), [&](
constllvm::ErrorInfoBase &EI) {
1506Diags.
Report(DiagID) << ProfileName.str() << EI.message();
1510std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader =
1511std::move(ReaderOrErr.get());
1515 if(PGOReader->isIRLevelProfile() || PGOReader->hasMemoryProfile()) {
1516 if(PGOReader->hasCSIRLevelProfile())
1526 constllvm::Triple &Triple) {
1527assert(Triple.getArch() == llvm::Triple::aarch64);
1534 LangOpts.PointerAuthFunctionTypeDiscrimination ? Discrimination::Type
1535: Discrimination::None);
1538Key::ASDA,
LangOpts.PointerAuthVTPtrAddressDiscrimination,
1539 LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1540: Discrimination::None);
1542 if(
LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
1557 if(
LangOpts.PointerAuthInitFini) {
1559Key::ASIA,
LangOpts.PointerAuthInitFiniAddressDiscrimination,
1571 constllvm::Triple &Triple,
1573 if(!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1574!LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1575!LangOpts.AArch64JumpTableHardening)
1581voidCompilerInvocationBase::GenerateCodeGenArgs(
const CodeGenOptions&Opts,
1583 constllvm::Triple &
T,
1584 conststd::string &OutputFile,
1588 if(Opts.OptimizationLevel == 0)
1591 GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel));
1593#define CODEGEN_OPTION_WITH_MARSHALLING(...) \ 1594 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 1595#include "clang/Driver/Options.inc" 1596#undef CODEGEN_OPTION_WITH_MARSHALLING 1598 if(Opts.OptimizationLevel > 0) {
1602 GenerateArg(Consumer, OPT_finline_hint_functions);
1607 if(Opts.DirectAccessExternalData &&
LangOpts->PICLevel != 0)
1608 GenerateArg(Consumer, OPT_fdirect_access_external_data);
1609 else if(!Opts.DirectAccessExternalData &&
LangOpts->PICLevel == 0)
1610 GenerateArg(Consumer, OPT_fno_direct_access_external_data);
1612std::optional<StringRef> DebugInfoVal;
1613 switch(Opts.DebugInfo) {
1614 casellvm::codegenoptions::DebugLineTablesOnly:
1615DebugInfoVal =
"line-tables-only";
1617 casellvm::codegenoptions::DebugDirectivesOnly:
1618DebugInfoVal =
"line-directives-only";
1620 casellvm::codegenoptions::DebugInfoConstructor:
1621DebugInfoVal =
"constructor";
1623 casellvm::codegenoptions::LimitedDebugInfo:
1624DebugInfoVal =
"limited";
1626 casellvm::codegenoptions::FullDebugInfo:
1627DebugInfoVal =
"standalone";
1629 casellvm::codegenoptions::UnusedTypeInfo:
1630DebugInfoVal =
"unused-types";
1632 casellvm::codegenoptions::NoDebugInfo:
1633DebugInfoVal = std::nullopt;
1635 casellvm::codegenoptions::LocTrackingOnly:
1636DebugInfoVal = std::nullopt;
1640 GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal);
1644Prefix.first +
"="+ Prefix.second);
1647 GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ,
1648Prefix.first +
"="+ Prefix.second);
1650 if(Opts.NewStructPathTBAA)
1653 if(Opts.OptimizeSize == 1)
1655 else if(Opts.OptimizeSize == 2)
1663 if(Opts.UnrollLoops && Opts.OptimizationLevel <= 1)
1665 else if(!Opts.UnrollLoops && Opts.OptimizationLevel > 1)
1671 if(Opts.DebugNameTable ==
1672 static_cast<unsigned>(llvm::DICompileUnit::DebugNameTableKind::GNU))
1674 else if(Opts.DebugNameTable ==
1675 static_cast<unsigned>(
1676llvm::DICompileUnit::DebugNameTableKind::Default))
1679 if(Opts.DebugTemplateAlias)
1682 autoTNK = Opts.getDebugSimpleTemplateNames();
1683 if(TNK != llvm::codegenoptions::DebugTemplateNamesKind::Full) {
1684 if(TNK == llvm::codegenoptions::DebugTemplateNamesKind::Simple)
1685 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"simple");
1686 else if(TNK == llvm::codegenoptions::DebugTemplateNamesKind::Mangled)
1687 GenerateArg(Consumer, OPT_gsimple_template_names_EQ,
"mangled");
1692 if(Opts.TimePasses) {
1693 if(Opts.TimePassesPerRun)
1694 GenerateArg(Consumer, OPT_ftime_report_EQ,
"per-pass-run");
1699 if(Opts.PrepareForLTO && !Opts.PrepareForThinLTO)
1702 if(Opts.PrepareForThinLTO)
1709 GenerateArg(Consumer, OPT_save_temps_EQ,
"obj");
1711StringRef MemProfileBasename(
"memprof.profraw");
1732std::string InstrBundle =
1734 if(!InstrBundle.empty())
1735 GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle);
1738 if(Opts.CFProtectionReturn && Opts.CFProtectionBranch)
1739 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"full");
1740 else if(Opts.CFProtectionReturn)
1741 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"return");
1742 else if(Opts.CFProtectionBranch)
1743 GenerateArg(Consumer, OPT_fcf_protection_EQ,
"branch");
1745 if(Opts.CFProtectionBranch) {
1746 switch(Opts.getCFBranchLabelScheme()) {
1749#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \ 1750 case CFBranchLabelSchemeKind::Kind: \ 1751 GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \ 1753#include "clang/Basic/CFProtectionOptions.def" 1757 if(Opts.FunctionReturnThunks)
1758 GenerateArg(Consumer, OPT_mfunction_return_EQ,
"thunk-extern");
1761 boolBuiltint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded &&
1762F.PropagateAttrs && F.Internalize;
1764Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file,
1768 if(Opts.EmulatedTLS)
1776 GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ,
1781 T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return;
1785 T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return;
1789 if(Opts.EnableAIXExtendedAltivecABI)
1792 if(Opts.XCOFFReadOnlyPointers)
1810 GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ,
1815 GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ,
1819 GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer);
1822 GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
1824 for(StringRef Sanitizer :
1826 GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1830 for(std::string Sanitizer : Values)
1831 GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer);
1833 if(!Opts.EmitVersionIdentMetadata)
1836 switch(Opts.FiniteLoops) {
1848boolCompilerInvocation::ParseCodeGenArgs(
CodeGenOptions&Opts, ArgList &Args,
1851 constllvm::Triple &
T,
1852 conststd::string &OutputFile,
1858 unsignedMaxOptLevel = 3;
1859 if(OptimizationLevel > MaxOptLevel) {
1862Diags.
Report(diag::warn_drv_optimization_value)
1863<< Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O"<< MaxOptLevel;
1864OptimizationLevel = MaxOptLevel;
1866Opts.OptimizationLevel = OptimizationLevel;
1875#define CODEGEN_OPTION_WITH_MARSHALLING(...) \ 1876 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 1877#include "clang/Driver/Options.inc" 1878#undef CODEGEN_OPTION_WITH_MARSHALLING 1882 if(Opts.OptimizationLevel == 0) {
1884}
else if(
constArg *A = Args.getLastArg(options::OPT_finline_functions,
1885options::OPT_finline_hint_functions,
1886options::OPT_fno_inline_functions,
1887options::OPT_fno_inline)) {
1890 if(A->getOption().matches(options::OPT_finline_functions))
1892 else if(A->getOption().matches(options::OPT_finline_hint_functions))
1902Opts.DirectAccessExternalData =
1903Args.hasArg(OPT_fdirect_access_external_data) ||
1904(!Args.hasArg(OPT_fno_direct_access_external_data) &&
1907 if(Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
1909llvm::StringSwitch<unsigned>(A->getValue())
1910.Case(
"line-tables-only", llvm::codegenoptions::DebugLineTablesOnly)
1911.Case(
"line-directives-only",
1912llvm::codegenoptions::DebugDirectivesOnly)
1913.Case(
"constructor", llvm::codegenoptions::DebugInfoConstructor)
1914.Case(
"limited", llvm::codegenoptions::LimitedDebugInfo)
1915.Case(
"standalone", llvm::codegenoptions::FullDebugInfo)
1916.Case(
"unused-types", llvm::codegenoptions::UnusedTypeInfo)
1919Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1922Opts.setDebugInfo(
static_cast<llvm::codegenoptions::DebugInfoKind
>(Val));
1928Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) {
1929 if(A->getOption().matches(OPT_fuse_ctor_homing) &&
1930Opts.getDebugInfo() == llvm::codegenoptions::LimitedDebugInfo)
1931Opts.setDebugInfo(llvm::codegenoptions::DebugInfoConstructor);
1932 if(A->getOption().matches(OPT_fno_use_ctor_homing) &&
1933Opts.getDebugInfo() == llvm::codegenoptions::DebugInfoConstructor)
1934Opts.setDebugInfo(llvm::codegenoptions::LimitedDebugInfo);
1937 for(
const auto&Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
1938 auto Split= StringRef(Arg).split(
'=');
1942 for(
const auto&Arg : Args.getAllArgValues(OPT_fcoverage_prefix_map_EQ)) {
1943 auto Split= StringRef(Arg).split(
'=');
1947 constllvm::Triple::ArchType DebugEntryValueArchs[] = {
1948llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
1949llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
1950llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el};
1953llvm::is_contained(DebugEntryValueArchs,
T.getArch()))
1954Opts.EmitCallSiteInfo =
true;
1957Diags.
Report(diag::warn_ignoring_verify_debuginfo_preserve_export)
1962Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
1963Args.hasArg(OPT_new_struct_path_tbaa);
1965Opts.SimplifyLibCalls = !
LangOpts->NoBuiltin;
1966 if(Opts.SimplifyLibCalls)
1969Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
1970(Opts.OptimizationLevel > 1));
1972std::string(Args.getLastArgValue(OPT_fbinutils_version_EQ));
1974Opts.DebugTemplateAlias = Args.hasArg(OPT_gtemplate_alias);
1976Opts.DebugNameTable =
static_cast<unsigned>(
1977Args.hasArg(OPT_ggnu_pubnames)
1978? llvm::DICompileUnit::DebugNameTableKind::GNU
1979: Args.hasArg(OPT_gpubnames)
1980? llvm::DICompileUnit::DebugNameTableKind::Default
1981: llvm::DICompileUnit::DebugNameTableKind::None);
1982 if(
constArg *A = Args.getLastArg(OPT_gsimple_template_names_EQ)) {
1983StringRef
Value= A->getValue();
1984 if(
Value!=
"simple"&&
Value!=
"mangled")
1985Diags.
Report(diag::err_drv_unsupported_option_argument)
1986<< A->getSpelling() << A->getValue();
1987Opts.setDebugSimpleTemplateNames(
1988StringRef(A->getValue()) ==
"simple" 1989? llvm::codegenoptions::DebugTemplateNamesKind::Simple
1990: llvm::codegenoptions::DebugTemplateNamesKind::Mangled);
1993 if(
constArg *A = Args.getLastArg(OPT_ftime_report, OPT_ftime_report_EQ)) {
1994Opts.TimePasses =
true;
1997 if(A->getOption().getID() == OPT_ftime_report_EQ) {
1998StringRef Val = A->getValue();
1999 if(Val ==
"per-pass")
2000Opts.TimePassesPerRun =
false;
2001 else if(Val ==
"per-pass-run")
2002Opts.TimePassesPerRun =
true;
2004Diags.
Report(diag::err_drv_invalid_value)
2005<< A->getAsString(Args) << A->getValue();
2009Opts.PrepareForLTO =
false;
2010Opts.PrepareForThinLTO =
false;
2011 if(Arg *A = Args.getLastArg(OPT_flto_EQ)) {
2012Opts.PrepareForLTO =
true;
2013StringRef S = A->getValue();
2015Opts.PrepareForThinLTO =
true;
2016 else if(S !=
"full")
2017Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
2018 if(Args.hasArg(OPT_funified_lto))
2019Opts.PrepareForThinLTO =
true;
2021 if(Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
2023Diags.
Report(diag::err_drv_argument_only_allowed_with)
2024<< A->getAsString(Args) <<
"-x ir";
2026std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
2028 if(Arg *A = Args.getLastArg(OPT_save_temps_EQ))
2030llvm::StringSwitch<std::string>(A->getValue())
2031.Case(
"obj", OutputFile)
2032.Default(llvm::sys::path::filename(OutputFile).str());
2035 const char*MemProfileBasename =
"memprof.profraw";
2036 if(Args.hasArg(OPT_fmemory_profile_EQ)) {
2038std::string(Args.getLastArgValue(OPT_fmemory_profile_EQ)));
2039llvm::sys::path::append(
Path, MemProfileBasename);
2041}
else if(Args.hasArg(OPT_fmemory_profile))
2045 if(Args.hasArg(OPT_coverage_version_EQ)) {
2046StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
2047 if(CoverageVersion.size() != 4) {
2048Diags.
Report(diag::err_drv_invalid_value)
2049<< Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
2059 for(
const auto&A : Args) {
2061 if(A->getOption().getID() == options::OPT_o ||
2062A->getOption().getID() == options::OPT_INPUT ||
2063A->getOption().getID() == options::OPT_x ||
2064A->getOption().getID() == options::OPT_fembed_bitcode ||
2065A->getOption().matches(options::OPT_W_Group))
2068A->render(Args, ASL);
2069 for(
const auto&arg : ASL) {
2070StringRef ArgStr(arg);
2071Opts.
CmdArgs.insert(Opts.
CmdArgs.end(), ArgStr.begin(), ArgStr.end());
2073Opts.
CmdArgs.push_back(
'\0');
2077 autoXRayInstrBundles =
2078Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
2079 if(XRayInstrBundles.empty())
2082 for(
const auto&A : XRayInstrBundles)
2086 if(
constArg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2087StringRef Name = A->getValue();
2088 if(Name ==
"full") {
2089Opts.CFProtectionReturn = 1;
2090Opts.CFProtectionBranch = 1;
2091}
else if(Name ==
"return")
2092Opts.CFProtectionReturn = 1;
2093 else if(Name ==
"branch")
2094Opts.CFProtectionBranch = 1;
2095 else if(Name !=
"none")
2096Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
2099 if(Opts.CFProtectionBranch &&
T.isRISCV()) {
2100 if(
constArg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
2102llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
2103#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \ 2104 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind) 2105#include "clang/Basic/CFProtectionOptions.def" 2108Opts.setCFBranchLabelScheme(Scheme);
2110Diags.
Report(diag::err_drv_invalid_value)
2111<< A->getAsString(Args) << A->getValue();
2115 if(
constArg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
2116 autoVal = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
2117.Case(
"keep", llvm::FunctionReturnThunksKind::Keep)
2118.Case(
"thunk-extern", llvm::FunctionReturnThunksKind::Extern)
2119.Default(llvm::FunctionReturnThunksKind::Invalid);
2122Diags.
Report(diag::err_drv_argument_not_allowed_with)
2123<< A->getSpelling() <<
T.getTriple();
2124 else if(Val == llvm::FunctionReturnThunksKind::Invalid)
2125Diags.
Report(diag::err_drv_invalid_value)
2126<< A->getAsString(Args) << A->getValue();
2127 else if(Val == llvm::FunctionReturnThunksKind::Extern &&
2128Args.getLastArgValue(OPT_mcmodel_EQ) ==
"large")
2129Diags.
Report(diag::err_drv_argument_not_allowed_with)
2130<< A->getAsString(Args)
2131<< Args.getLastArg(OPT_mcmodel_EQ)->getAsString(Args);
2133Opts.FunctionReturnThunks =
static_cast<unsigned>(Val);
2137Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
2140 if(A->getOption().matches(OPT_mlink_builtin_bitcode)) {
2141F.
LinkFlags= llvm::Linker::Flags::LinkOnlyNeeded;
2150 if(Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
2151StringRef Val = A->getValue();
2155Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2158 if(Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
2159StringRef Val = A->getValue();
2162Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2168Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
2169OPT_maix_struct_return, OPT_msvr4_struct_return)) {
2173Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2174<< A->getSpelling() <<
T.str();
2176 constOption &O = A->getOption();
2177 if(O.matches(OPT_fpcc_struct_return) ||
2178O.matches(OPT_maix_struct_return)) {
2181assert(O.matches(OPT_freg_struct_return) ||
2182O.matches(OPT_msvr4_struct_return));
2187 if(Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
2189Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2190<< A->getSpelling() <<
T.str();
2200 if(!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections,
false))
2201Diags.
Report(diag::err_roptr_requires_data_sections);
2203Opts.XCOFFReadOnlyPointers =
true;
2206 if(Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
2207 if(!
T.isOSAIX() ||
T.isPPC32())
2208Diags.
Report(diag::err_drv_unsupported_opt_for_target)
2209<< A->getSpelling() <<
T.str();
2212 boolNeedLocTracking =
false;
2215NeedLocTracking =
true;
2217 if(Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
2219NeedLocTracking =
true;
2222 if(Arg *A = Args.getLastArg(OPT_opt_record_format)) {
2224NeedLocTracking =
true;
2234Diags, Args, OPT_Rpass_analysis_EQ,
"pass-analysis");
2244 if(Opts.DiagnosticsWithHotness && !UsingProfile &&
2247Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2248<<
"-fdiagnostics-show-hotness";
2252Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
2254llvm::remarks::parseHotnessThresholdOption(
arg->getValue());
2257Diags.
Report(diag::err_drv_invalid_diagnotics_hotness_threshold)
2258<<
"-fdiagnostics-hotness-threshold=";
2264Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
2265<<
"-fdiagnostics-hotness-threshold=";
2270Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
2274Diags.
Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance)
2275<<
"-fdiagnostics-misexpect-tolerance=";
2281Diags.
Report(diag::warn_drv_diagnostics_misexpect_requires_pgo)
2282<<
"-fdiagnostics-misexpect-tolerance=";
2289 if(UsingSampleProfile)
2290NeedLocTracking =
true;
2293NeedLocTracking =
true;
2297 if(NeedLocTracking &&
2298Opts.getDebugInfo() == llvm::codegenoptions::NoDebugInfo)
2299Opts.setDebugInfo(llvm::codegenoptions::LocTrackingOnly);
2304Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
2307Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
2310Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2315 "-fsanitize-skip-hot-cutoff=",
2316Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags);
2318Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
2323 if(Args.hasArg(options::OPT_ffinite_loops))
2325 else if(Args.hasArg(options::OPT_fno_finite_loops))
2328Opts.EmitIEEENaNCompliantInsts = Args.hasFlag(
2329options::OPT_mamdgpu_ieee, options::OPT_mno_amdgpu_ieee,
true);
2330 if(!Opts.EmitIEEENaNCompliantInsts && !LangOptsRef.NoHonorNaNs)
2331Diags.
Report(diag::err_drv_amdgpu_ieee_without_no_honor_nans);
2339#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ 2340 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 2341#include "clang/Driver/Options.inc" 2342#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING 2347 for(
const auto&Dep : Opts.
ExtraDeps) {
2348 switch(Dep.second) {
2361 GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first);
2370 boolShowLineMarkers) {
2374#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ 2375 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 2376#include "clang/Driver/Options.inc" 2377#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING 2379 if(Args.hasArg(OPT_show_includes)) {
2394 if(!Args.hasArg(OPT_fno_sanitize_ignorelist)) {
2395 for(
const auto*A : Args.filtered(OPT_fsanitize_ignorelist_EQ)) {
2396StringRef Val = A->getValue();
2397 if(!Val.contains(
'='))
2401 for(
const auto*A : Args.filtered(OPT_fsanitize_system_ignorelist_EQ)) {
2402StringRef Val = A->getValue();
2403 if(!Val.contains(
'='))
2410 for(
const auto&
Filename: Args.getAllArgValues(OPT_fprofile_list_EQ))
2414 for(
const auto*A : Args.filtered(OPT_fdepfile_entry))
2418 for(
const auto*A : Args.filtered(OPT_fmodule_file)) {
2419StringRef Val = A->getValue();
2420 if(!Val.contains(
'='))
2430Diags.
Report(diag::err_drv_print_header_env_var_combination_cc1)
2431<< Args.getLastArg(OPT_header_include_format_EQ)->getValue()
2432<< Args.getLastArg(OPT_header_include_filtering_EQ)->getValue();
2446}
ShowColors= DefaultColor ? Colors_Auto : Colors_Off;
2447 for(
auto*A : Args) {
2448 constOption &O = A->getOption();
2449 if(O.matches(options::OPT_fcolor_diagnostics)) {
2451}
else if(O.matches(options::OPT_fno_color_diagnostics)) {
2453}
else if(O.matches(options::OPT_fdiagnostics_color_EQ)) {
2454StringRef
Value(A->getValue());
2455 if(
Value==
"always")
2457 else if(
Value==
"never")
2459 else if(
Value==
"auto")
2465llvm::sys::Process::StandardErrHasColors());
2471 for(
const auto&Prefix : VerifyPrefixes) {
2474 autoBadChar = llvm::find_if(Prefix, [](
char C) {
2477 if(BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
2479Diags.
Report(diag::err_drv_invalid_value) <<
"-verify="<< Prefix;
2480Diags.
Report(diag::note_drv_verify_prefix_spelling);
2490#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ 2491 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 2492#include "clang/Driver/Options.inc" 2493#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING 2502#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ 2503 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 2504#include "clang/Driver/Options.inc" 2505#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING 2513#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ 2514 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 2515#include "clang/Driver/Options.inc" 2516#undef MIGRATOR_OPTION_WITH_MARSHALLING 2525#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ 2526 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 2527#include "clang/Driver/Options.inc" 2528#undef MIGRATOR_OPTION_WITH_MARSHALLING 2533voidCompilerInvocationBase::GenerateDiagnosticArgs(
2535 boolDefaultDiagColor) {
2537#define DIAG_OPTION_WITH_MARSHALLING(...) \ 2538 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 2539#include "clang/Driver/Options.inc" 2540#undef DIAG_OPTION_WITH_MARSHALLING 2543 GenerateArg(Consumer, OPT_diagnostic_serialized_file,
2546 if(Opts.ShowColors)
2549 if(Opts.VerifyDiagnostics &&
2554 if(Prefix !=
"expected")
2561 GenerateArg(Consumer, OPT_verify_ignore_unexpected);
2564 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"note");
2566 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"remark");
2568 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"warning");
2570 GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ,
"error");
2575 if(
Warning==
"undef-prefix")
2578 if(
Warning==
"invalid-constexpr"||
Warning==
"no-invalid-constexpr")
2580Consumer(StringRef(
"-W") +
Warning);
2586StringRef IgnoredRemarks[] = {
"pass",
"no-pass",
2587 "pass-analysis",
"no-pass-analysis",
2588 "pass-missed",
"no-pass-missed"};
2589 if(llvm::is_contained(IgnoredRemarks,
Remark))
2592Consumer(StringRef(
"-R") +
Remark);
2596 GenerateArg(Consumer, OPT_warning_suppression_mappings_EQ,
2601std::unique_ptr<DiagnosticOptions>
2603 autoDiagOpts = std::make_unique<DiagnosticOptions>();
2604 unsignedMissingArgIndex, MissingArgCount;
2606Argv.slice(1), MissingArgIndex, MissingArgCount);
2609 if(std::optional<std::string> NoColor =
2610llvm::sys::Process::GetEnv(
"NO_COLOR");
2611NoColor && !NoColor->empty()) {
2626 boolDefaultDiagColor) {
2627std::optional<DiagnosticsEngine> IgnoringDiags;
2631Diags = &*IgnoringDiags;
2640#define DIAG_OPTION_WITH_MARSHALLING(...) \ 2641 PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__) 2642#include "clang/Driver/Options.inc" 2643#undef DIAG_OPTION_WITH_MARSHALLING 2645llvm::sys::Process::UseANSIEscapeCodes(Opts.UseANSIEscapeCodes);
2648Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
2652Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
2654 if(Args.hasArg(OPT_verify))
2659Opts.VerifyDiagnostics =
false;
2664 "-verify-ignore-unexpected=",
2665Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
2666 if(Args.hasArg(OPT_verify_ignore_unexpected))
2668Opts.setVerifyIgnoreUnexpected(DiagMask);
2670Diags->
Report(diag::warn_ignoring_ftabstop_value)
2675 if(
constArg *A = Args.getLastArg(OPT_warning_suppression_mappings_EQ))
2689std::string &BlockName,
2690 unsigned&MajorVersion,
2691 unsigned&MinorVersion,
2693std::string &UserInfo) {
2695Arg.split(Args,
':', 5);
2696 if(Args.size() < 5)
2699BlockName = std::string(Args[0]);
2700 if(Args[1].getAsInteger(10, MajorVersion))
return true;
2701 if(Args[2].getAsInteger(10, MinorVersion))
return true;
2702 if(Args[3].getAsInteger(2, Hashed))
return true;
2703 if(Args.size() > 4)
2704UserInfo = std::string(Args[4]);
2713 static conststd::pair<frontend::ActionKind, unsigned> Table[] = {
2744OPT_emit_reduced_module_interface},
2761OPT_print_dependency_directives_minimized_source},
2768staticstd::optional<frontend::ActionKind>
2771 if(ActionOpt.second == Opt.getID())
2772 returnActionOpt.first;
2774 returnstd::nullopt;
2778staticstd::optional<OptSpecifier>
2781 if(ActionOpt.first == ProgramAction)
2782 returnOptSpecifier(ActionOpt.second);
2784 returnstd::nullopt;
2790#define FRONTEND_OPTION_WITH_MARSHALLING(...) \ 2791 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 2792#include "clang/Driver/Options.inc" 2793#undef FRONTEND_OPTION_WITH_MARSHALLING 2795std::optional<OptSpecifier> ProgramActionOpt =
2799std::function<void()> GenerateProgramAction = [&]() {
2803 if(!ProgramActionOpt) {
2806 "Frontend action without option.");
2807GenerateProgramAction = [&]() {
2814GenerateProgramAction = [&]() {
2822llvm_unreachable(
"Default AST dump format.");
2829 GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format);
2842GenerateProgramAction = [&]() {
2847GenerateProgramAction();
2849 for(
const auto&PluginArgs : Opts.
PluginArgs) {
2851 for(
const auto&PluginArg : PluginArgs.second)
2853Opt.getPrefix() + Opt.getName() + PluginArgs.first,
2854Opt.getKind(), 0, PluginArg);
2858 if(
auto*TestExt = dyn_cast_or_null<TestModuleFileExtension>(Ext.get()))
2859 GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str());
2865 for(
const auto&Plugin : Opts.
Plugins)
2870 for(
const auto&ModuleFile : Opts.
ModuleFiles)
2871 GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);
2878 GenerateArg(Consumer, OPT_aux_target_feature, Feature);
2884StringRef HeaderUnit =
"";
2889HeaderUnit =
"-user";
2892HeaderUnit =
"-system";
2895HeaderUnit =
"-header-unit";
2898StringRef Header = IsHeader ?
"-header":
"";
2921Lang =
"objective-c";
2924Lang =
"objective-c++";
2927Lang =
"assembler-with-cpp";
2931 "Generating -x argument for unknown language (not precompiled).");
2946Lang + HeaderUnit + Header +
ModuleMap+ Preprocessed);
2950 for(
const auto&Input : Opts.
Inputs)
2951Consumer(Input.getFile());
2960#define FRONTEND_OPTION_WITH_MARSHALLING(...) \ 2961 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 2962#include "clang/Driver/Options.inc" 2963#undef FRONTEND_OPTION_WITH_MARSHALLING 2966 if(
constArg *A = Args.getLastArg(OPT_Action_Group)) {
2967OptSpecifier Opt = OptSpecifier(A->getOption().getID());
2969assert(ProgramAction &&
"Option specifier not in Action_Group.");
2972(Opt == OPT_ast_dump_all_EQ || Opt == OPT_ast_dump_EQ)) {
2973 unsignedVal = llvm::StringSwitch<unsigned>(A->getValue())
2976.Default(std::numeric_limits<unsigned>::max());
2978 if(Val != std::numeric_limits<unsigned>::max())
2981Diags.
Report(diag::err_drv_invalid_value)
2982<< A->getAsString(Args) << A->getValue();
2992Args.hasArg(OPT_interface_stub_version_EQ)
2993? Args.getLastArgValue(OPT_interface_stub_version_EQ)
2995 if(ArgStr ==
"experimental-yaml-elf-v1"||
2996ArgStr ==
"experimental-ifs-v1"|| ArgStr ==
"experimental-ifs-v2"||
2997ArgStr ==
"experimental-tapi-elf-v1") {
2998std::string ErrorMessage =
2999 "Invalid interface stub format: "+ ArgStr.str() +
3001Diags.
Report(diag::err_drv_invalid_value)
3002<<
"Must specify a valid interface stub format type, ie: " 3003 "-interface-stub-version=ifs-v1" 3006}
else if(!ArgStr.starts_with(
"ifs-")) {
3007std::string ErrorMessage =
3008 "Invalid interface stub format: "+ ArgStr.str() +
".";
3009Diags.
Report(diag::err_drv_invalid_value)
3010<<
"Must specify a valid interface stub format type, ie: " 3011 "-interface-stub-version=ifs-v1" 3026 if(!A->getSpelling().starts_with(
"-ast-dump")) {
3027 constArg *SavedAction =
nullptr;
3028 for(
constArg *AA :
3029Args.filtered(OPT_Action_Group, OPT_main_file_name)) {
3030 if(AA->getOption().matches(OPT_main_file_name)) {
3031SavedAction =
nullptr;
3032}
else if(!SavedAction) {
3035 if(!A->getOption().matches(OPT_ast_dump_EQ))
3036Diags.
Report(diag::err_fe_invalid_multiple_actions)
3037<< SavedAction->getSpelling() << A->getSpelling();
3044 if(
constArg* A = Args.getLastArg(OPT_plugin)) {
3045Opts.
Plugins.emplace_back(A->getValue(0));
3049 for(
const auto*AA : Args.filtered(OPT_plugin_arg))
3050Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
3052 for(
conststd::string &Arg :
3053Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
3054std::string BlockName;
3055 unsignedMajorVersion;
3056 unsignedMinorVersion;
3058std::string UserInfo;
3060MinorVersion, Hashed, UserInfo)) {
3061Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
3068std::make_shared<TestModuleFileExtension>(
3069BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
3072 if(
constArg *A = Args.getLastArg(OPT_code_completion_at)) {
3076Diags.
Report(diag::err_drv_invalid_value)
3077<< A->getAsString(Args) << A->getValue();
3080Opts.
Plugins= Args.getAllArgValues(OPT_load);
3081Opts.
ASTDumpDecls= Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
3082Opts.
ASTDumpAll= Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
3084 for(
const auto*A : Args.filtered(OPT_fmodule_file)) {
3085StringRef Val = A->getValue();
3086 if(!Val.contains(
'='))
3091Diags.
Report(diag::err_drv_argument_only_allowed_with) <<
"-fsystem-module" 3093 if(Args.hasArg(OPT_fclangir) || Args.hasArg(OPT_emit_cir))
3096 if(Args.hasArg(OPT_aux_target_cpu))
3097Opts.
AuxTargetCPU= std::string(Args.getLastArgValue(OPT_aux_target_cpu));
3098 if(Args.hasArg(OPT_aux_target_feature))
3102 if(
constArg *A = Args.getLastArg(OPT_x)) {
3103StringRef XValue = A->getValue();
3108 boolPreprocessed = XValue.consume_back(
"-cpp-output");
3109 bool ModuleMap= XValue.consume_back(
"-module-map");
3112XValue !=
"precompiled-header"&& XValue.consume_back(
"-header");
3118 if(IsHeader || Preprocessed) {
3119 if(XValue.consume_back(
"-header-unit"))
3121 else if(XValue.consume_back(
"-system"))
3123 else if(XValue.consume_back(
"-user"))
3129IsHeaderFile = IsHeader && !Preprocessed && !
ModuleMap&&
3133DashX = llvm::StringSwitch<InputKind>(XValue)
3149DashX = llvm::StringSwitch<InputKind>(XValue)
3157DashX = llvm::StringSwitch<InputKind>(XValue)
3160.Cases(
"ast",
"pcm",
"precompiled-header",
3167Diags.
Report(diag::err_drv_invalid_value)
3168<< A->getAsString(Args) << A->getValue();
3175IsHeaderFile =
true;
3176}
else if(IsHeaderFile)
3183std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
3186Inputs.push_back(
"-");
3190Diags.
Report(diag::err_drv_header_unit_extra_inputs) << Inputs[1];
3192 for(
unsignedi = 0, e = Inputs.size(); i != e; ++i) {
3196StringRef(Inputs[i]).rsplit(
'.').second);
3205 boolIsSystem =
false;
3214Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
3217Opts.
DashX= DashX;
3224std::string ClangExecutable =
3225llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
3232#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ 3233 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 3234#include "clang/Driver/Options.inc" 3235#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING 3250 GenerateArg(Consumer, OPT_fmodules_ignore_macro, Macro.val());
3254std::optional<bool> IsFramework,
3255std::optional<bool> IgnoreSysRoot) {
3256 returnllvm::is_contained(Groups, Entry.
Group) &&
3257(!IsFramework || (Entry.
IsFramework== *IsFramework)) &&
3258(!IgnoreSysRoot || (Entry.
IgnoreSysRoot== *IgnoreSysRoot));
3265 for(; It < End && Matches(*It, {
frontend::Angled}, std::nullopt,
true);
3267OptSpecifier Opt = [It, Matches]() {
3272llvm_unreachable(
"Unexpected HeaderSearchOptions::Entry.");
3286It->Group ==
frontend::After? OPT_iwithprefix : OPT_iwithprefixbefore;
3293 for(; It < End && Matches(*It, {
frontend::After},
false,
true); ++It)
3295 for(; It < End && Matches(*It, {
frontend::Quoted},
false,
true); ++It)
3297 for(; It < End && Matches(*It, {
frontend::System},
false, std::nullopt);
3299 GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot,
3303 for(; It < End && Matches(*It, {
frontend::System},
true,
false); ++It)
3304 GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path);
3310 GenerateArg(Consumer, OPT_cxx_isystem, It->Path);
3312 GenerateArg(Consumer, OPT_objc_isystem, It->Path);
3314 GenerateArg(Consumer, OPT_objcxx_isystem, It->Path);
3324? OPT_internal_isystem
3325: OPT_internal_externc_isystem;
3329assert(It == End &&
"Unhandled HeaderSearchOption::Entry.");
3333OptSpecifier Opt =
P.IsSystemHeader ? OPT_system_header_prefix
3334: OPT_no_system_header_prefix;
3344 conststd::string &WorkingDir) {
3349#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ 3350 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 3351#include "clang/Driver/Options.inc" 3352#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING 3354 if(
constArg *A = Args.getLastArg(OPT_stdlib_EQ))
3355Opts.
UseLibcxx= (strcmp(A->getValue(),
"libc++") == 0);
3359 if(!(
P.empty() || llvm::sys::path::is_absolute(
P))) {
3360 if(WorkingDir.empty())
3361llvm::sys::fs::make_absolute(
P);
3363llvm::sys::fs::make_absolute(WorkingDir,
P);
3365llvm::sys::path::remove_dots(
P);
3369 for(
const auto*A : Args.filtered(OPT_fmodule_file)) {
3370StringRef Val = A->getValue();
3371 if(Val.contains(
'=')) {
3372 autoSplit = Val.split(
'=');
3374std::string(Split.first), std::string(Split.second));
3377 for(
const auto*A : Args.filtered(OPT_fprebuilt_module_path))
3380 for(
const auto*A : Args.filtered(OPT_fmodules_ignore_macro)) {
3381StringRef MacroDef = A->getValue();
3383llvm::CachedHashString(MacroDef.split(
'=').first));
3387 boolIsSysrootSpecified =
3388Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
3392 autoPrefixHeaderPath = [IsSysrootSpecified,
3393&Opts](
constllvm::opt::Arg *A,
3394 boolIsFramework =
false) -> std::string {
3395assert(A->getNumValues() &&
"Unexpected empty search path flag!");
3396 if(IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
3398llvm::sys::path::append(Buffer, Opts.
Sysroot,
3399llvm::StringRef(A->getValue()).substr(1));
3400 returnstd::string(Buffer);
3402 returnA->getValue();
3405 for(
const auto*A : Args.filtered(OPT_I, OPT_F)) {
3406 boolIsFramework = A->getOption().matches(OPT_F);
3408IsFramework,
true);
3412StringRef Prefix =
"";
3413 for(
const auto*A :
3414Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
3415 if(A->getOption().matches(OPT_iprefix))
3416Prefix = A->getValue();
3417 else if(A->getOption().matches(OPT_iwithprefix))
3423 for(
const auto*A : Args.filtered(OPT_idirafter))
3425 for(
const auto*A : Args.filtered(OPT_iquote))
3428 for(
const auto*A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) {
3429 if(A->getOption().matches(OPT_iwithsysroot)) {
3436 for(
const auto*A : Args.filtered(OPT_iframework))
3438 for(
const auto*A : Args.filtered(OPT_iframeworkwithsysroot))
3443 for(
const auto*A : Args.filtered(OPT_c_isystem))
3445 for(
const auto*A : Args.filtered(OPT_cxx_isystem))
3447 for(
const auto*A : Args.filtered(OPT_objc_isystem))
3449 for(
const auto*A : Args.filtered(OPT_objcxx_isystem))
3453 for(
const auto*A :
3454Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
3456 if(A->getOption().matches(OPT_internal_externc_isystem))
3458Opts.
AddPath(A->getValue(), Group,
false,
true);
3462 for(
const auto*A :
3463Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
3465A->getValue(), A->getOption().matches(OPT_system_header_prefix));
3467 for(
const auto*A : Args.filtered(OPT_ivfsoverlay, OPT_vfsoverlay))
3476 GenerateArg(Consumer, OPT_fapinotes_swift_version,
3485 if(
constArg *A = Args.getLastArg(OPT_fapinotes_swift_version)) {
3487diags.
Report(diag::err_drv_invalid_value)
3488<< A->getAsString(Args) << A->getValue();
3490 for(
constArg *A : Args.filtered(OPT_iapinotes_modules))
3496 if(Opts.PointerAuthIntrinsics)
3498 if(Opts.PointerAuthCalls)
3500 if(Opts.PointerAuthReturns)
3502 if(Opts.PointerAuthIndirectGotos)
3503 GenerateArg(Consumer, OPT_fptrauth_indirect_gotos);
3504 if(Opts.PointerAuthAuthTraps)
3506 if(Opts.PointerAuthVTPtrAddressDiscrimination)
3507 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3508 if(Opts.PointerAuthVTPtrTypeDiscrimination)
3509 GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3510 if(Opts.PointerAuthTypeInfoVTPtrDiscrimination)
3511 GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3512 if(Opts.PointerAuthFunctionTypeDiscrimination)
3513 GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3514 if(Opts.PointerAuthInitFini)
3516 if(Opts.PointerAuthInitFiniAddressDiscrimination)
3517 GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
3518 if(Opts.PointerAuthELFGOT)
3520 if(Opts.AArch64JumpTableHardening)
3521 GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
3526Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3527Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3528Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3529Opts.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
3530Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3531Opts.PointerAuthVTPtrAddressDiscrimination =
3532Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3533Opts.PointerAuthVTPtrTypeDiscrimination =
3534Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3535Opts.PointerAuthTypeInfoVTPtrDiscrimination =
3536Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3537Opts.PointerAuthFunctionTypeDiscrimination =
3538Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3539Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3540Opts.PointerAuthInitFiniAddressDiscrimination =
3541Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
3542Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3543Opts.AArch64JumpTableHardening =
3544Args.hasArg(OPT_faarch64_jump_table_hardening);
3554llvm_unreachable(
"should not parse language flags for this input");
3589llvm_unreachable(
"unexpected input language");
3598 return "Objective-C";
3602 return "Objective-C++";
3606 return "C++ for OpenCL";
3625llvm_unreachable(
"unknown input language");
3628voidCompilerInvocationBase::GenerateLangArgs(
const LangOptions&Opts,
3630 constllvm::Triple &
T,
3635 if(Opts.ObjCAutoRefCount)
3637 if(Opts.PICLevel != 0)
3638 GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel));
3642 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3647OptSpecifier StdOpt;
3649 caseLangStandard::lang_opencl10:
3650 caseLangStandard::lang_opencl11:
3651 caseLangStandard::lang_opencl12:
3652 caseLangStandard::lang_opencl20:
3653 caseLangStandard::lang_opencl30:
3654 caseLangStandard::lang_openclcpp10:
3655 caseLangStandard::lang_openclcpp2021:
3656StdOpt = OPT_cl_std_EQ;
3659StdOpt = OPT_std_EQ;
3666 if(Opts.IncludeDefaultHeader)
3667 GenerateArg(Consumer, OPT_finclude_default_header);
3668 if(Opts.DeclareOpenCLBuiltins)
3669 GenerateArg(Consumer, OPT_fdeclare_opencl_builtins);
3673#define LANG_OPTION_WITH_MARSHALLING(...) \ 3674 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 3675#include "clang/Driver/Options.inc" 3676#undef LANG_OPTION_WITH_MARSHALLING 3687 else if(Opts.ObjCAutoRefCount == 1)
3690 if(Opts.ObjCWeakRuntime)
3691 GenerateArg(Consumer, OPT_fobjc_runtime_has_weak);
3696 if(Opts.ObjCSubscriptingLegacyRuntime)
3697 GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime);
3700 if(Opts.GNUCVersion != 0) {
3701 unsignedMajor = Opts.GNUCVersion / 100 / 100;
3702 unsignedMinor = (Opts.GNUCVersion / 100) % 100;
3703 unsignedPatch = Opts.GNUCVersion % 100;
3705Twine(Major) +
"."+ Twine(Minor) +
"."+ Twine(Patch));
3708 if(Opts.IgnoreXCOFFVisibility)
3709 GenerateArg(Consumer, OPT_mignore_xcoff_visibility);
3717 if(Opts.PointerOverflowDefined)
3720 if(Opts.MSCompatibilityVersion != 0) {
3721 unsignedMajor = Opts.MSCompatibilityVersion / 10000000;
3722 unsignedMinor = (Opts.MSCompatibilityVersion / 100000) % 100;
3723 unsignedSubminor = Opts.MSCompatibilityVersion % 100000;
3724 GenerateArg(Consumer, OPT_fms_compatibility_version,
3725Twine(Major) +
"."+ Twine(Minor) +
"."+ Twine(Subminor));
3728 if((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
3730 if(!Opts.Trigraphs)
3737 if(
T.isOSzOS() && !Opts.ZOSExt)
3739 else if(Opts.ZOSExt)
3742 if(Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200))
3745 if(Opts.ConvergentFunctions)
3746 GenerateArg(Consumer, OPT_fconvergent_functions);
3748 GenerateArg(Consumer, OPT_fno_convergent_functions);
3750 if(Opts.NoBuiltin && !Opts.Freestanding)
3753 if(!Opts.NoBuiltin)
3757 if(Opts.LongDoubleSize == 128)
3759 else if(Opts.LongDoubleSize == 64)
3761 else if(Opts.LongDoubleSize == 80)
3768 if(Opts.OpenMP && !Opts.OpenMPSimd) {
3771 if(Opts.OpenMP != 51)
3772 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3774 if(!Opts.OpenMPUseTLS)
3777 if(Opts.OpenMPIsTargetDevice)
3778 GenerateArg(Consumer, OPT_fopenmp_is_target_device);
3780 if(Opts.OpenMPIRBuilder)
3781 GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder);
3784 if(Opts.OpenMPSimd) {
3787 if(Opts.OpenMP != 51)
3788 GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP));
3791 if(Opts.OpenMPThreadSubscription)
3792 GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription);
3794 if(Opts.OpenMPTeamSubscription)
3795 GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription);
3797 if(Opts.OpenMPTargetDebug != 0)
3798 GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ,
3799Twine(Opts.OpenMPTargetDebug));
3801 if(Opts.OpenMPCUDANumSMs != 0)
3802 GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ,
3803Twine(Opts.OpenMPCUDANumSMs));
3805 if(Opts.OpenMPCUDABlocksPerSM != 0)
3806 GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ,
3807Twine(Opts.OpenMPCUDABlocksPerSM));
3809 if(Opts.OpenMPCUDAReductionBufNum != 1024)
3810 GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3811Twine(Opts.OpenMPCUDAReductionBufNum));
3814std::string Targets;
3815llvm::raw_string_ostream OS(Targets);
3818[&OS](
constllvm::Triple &
T) { OS << T.str(); },
",");
3819 GenerateArg(Consumer, OPT_fopenmp_targets_EQ, Targets);
3825 if(Opts.OpenMPCUDAMode)
3831 GenerateArg(Consumer, OPT_openacc_macro_override,
3839 GenerateArg(Consumer, OPT_ffp_contract,
"fast");
3845 GenerateArg(Consumer, OPT_ffp_contract,
"fast-honor-pragmas");
3848 GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer);
3852 GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F);
3854 switch(Opts.getClangABICompat()) {
3856 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"3.8");
3859 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"4.0");
3862 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"6.0");
3865 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"7.0");
3868 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"9.0");
3871 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"11.0");
3874 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"12.0");
3877 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"14.0");
3880 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"15.0");
3883 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"17.0");
3886 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"18.0");
3889 GenerateArg(Consumer, OPT_fclang_abi_compat_EQ,
"19.0");
3895 if(Opts.getSignReturnAddressScope() ==
3897 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"all");
3898 else if(Opts.getSignReturnAddressScope() ==
3900 GenerateArg(Consumer, OPT_msign_return_address_EQ,
"non-leaf");
3902 if(Opts.getSignReturnAddressKey() ==
3904 GenerateArg(Consumer, OPT_msign_return_address_key_EQ,
"b_key");
3910 if(Opts.RelativeCXXABIVTables)
3911 GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables);
3913 GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables);
3918 GenerateArg(Consumer, OPT_fno_file_reproducible);
3921 GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first +
"="+ MP.second);
3927boolCompilerInvocation::ParseLangArgs(
LangOptions&Opts, ArgList &Args,
3929std::vector<std::string> &Includes,
3939 if(Args.hasArg(OPT_fobjc_arc))
3940Opts.ObjCAutoRefCount = 1;
3944Opts.PIE = Args.hasArg(OPT_pic_is_pie);
3956 if(
constArg *A = Args.getLastArg(OPT_std_EQ)) {
3959Diags.
Report(diag::err_drv_invalid_value)
3960<< A->getAsString(Args) << A->getValue();
3962 for(
unsignedKindValue = 0;
3968 auto Diag= Diags.
Report(diag::note_drv_use_standard);
3969 Diag<<
Std.getName() <<
Std.getDescription();
3970 unsignedNumAliases = 0;
3971#define LANGSTANDARD(id, name, lang, desc, features) 3972#define LANGSTANDARD_ALIAS(id, alias) \ 3973 if (KindValue == LangStandard::lang_##id) ++NumAliases; 3974#define LANGSTANDARD_ALIAS_DEPR(id, alias) 3975#include "clang/Basic/LangStandards.def" 3977#define LANGSTANDARD(id, name, lang, desc, features) 3978#define LANGSTANDARD_ALIAS(id, alias) \ 3979 if (KindValue == LangStandard::lang_##id) Diag << alias; 3980#define LANGSTANDARD_ALIAS_DEPR(id, alias) 3981#include "clang/Basic/LangStandards.def" 3989Diags.
Report(diag::err_drv_argument_not_allowed_with)
3997 if(
constArg *A = Args.getLastArg(OPT_cl_std_EQ)) {
3999= llvm::StringSwitch<LangStandard::Kind>(A->getValue())
4000.Cases(
"cl",
"CL", LangStandard::lang_opencl10)
4001.Cases(
"cl1.0",
"CL1.0", LangStandard::lang_opencl10)
4002.Cases(
"cl1.1",
"CL1.1", LangStandard::lang_opencl11)
4003.Cases(
"cl1.2",
"CL1.2", LangStandard::lang_opencl12)
4004.Cases(
"cl2.0",
"CL2.0", LangStandard::lang_opencl20)
4005.Cases(
"cl3.0",
"CL3.0", LangStandard::lang_opencl30)
4006.Cases(
"clc++",
"CLC++", LangStandard::lang_openclcpp10)
4007.Cases(
"clc++1.0",
"CLC++1.0", LangStandard::lang_openclcpp10)
4008.Cases(
"clc++2021",
"CLC++2021", LangStandard::lang_openclcpp2021)
4012Diags.
Report(diag::err_drv_invalid_value)
4013<< A->getAsString(Args) << A->getValue();
4016LangStd = OpenCLLangStd;
4020Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
4021Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
4029#define LANG_OPTION_WITH_MARSHALLING(...) \ 4030 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 4031#include "clang/Driver/Options.inc" 4032#undef LANG_OPTION_WITH_MARSHALLING 4034 if(
constArg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4035StringRef Name = A->getValue();
4036 if(Name ==
"full"|| Name ==
"branch") {
4037Opts.CFProtectionBranch = 1;
4041 if(Opts.CFProtectionBranch) {
4042 if(
constArg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
4044llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
4045#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \ 4046 .Case(#FlagVal, CFBranchLabelSchemeKind::Kind) 4047#include "clang/Basic/CFProtectionOptions.def" 4049Opts.setCFBranchLabelScheme(Scheme);
4053 if((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
4054!Args.hasArg(OPT_sycl_std_EQ)) {
4064 if(Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
4065StringRef value =
arg->getValue();
4067Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
4070 if(Args.hasArg(OPT_fobjc_gc_only))
4072 else if(Args.hasArg(OPT_fobjc_gc))
4074 else if(Args.hasArg(OPT_fobjc_arc)) {
4075Opts.ObjCAutoRefCount = 1;
4077Diags.
Report(diag::err_arc_unsupported_on_runtime);
4084 if(Args.hasArg(OPT_fobjc_runtime_has_weak))
4085Opts.ObjCWeakRuntime = 1;
4091 if(
autoweakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
4092 if(!weakArg->getOption().matches(OPT_fobjc_weak)) {
4093assert(!Opts.ObjCWeak);
4095Diags.
Report(diag::err_objc_weak_with_gc);
4096}
else if(!Opts.ObjCWeakRuntime) {
4097Diags.
Report(diag::err_objc_weak_unsupported);
4101}
else if(Opts.ObjCAutoRefCount) {
4102Opts.ObjCWeak = Opts.ObjCWeakRuntime;
4105 if(Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
4106Opts.ObjCSubscriptingLegacyRuntime =
4110 if(Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
4113VersionTuple GNUCVer;
4114 bool Invalid= GNUCVer.tryParse(A->getValue());
4115 unsignedMajor = GNUCVer.getMajor();
4116 unsignedMinor = GNUCVer.getMinor().value_or(0);
4117 unsignedPatch = GNUCVer.getSubminor().value_or(0);
4118 if(
Invalid|| GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
4119Diags.
Report(diag::err_drv_invalid_value)
4120<< A->getAsString(Args) << A->getValue();
4122Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
4125 if(
T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility)))
4126Opts.IgnoreXCOFFVisibility = 1;
4128 if(Args.hasArg(OPT_ftrapv)) {
4132std::string(Args.getLastArgValue(OPT_ftrapv_handler));
4134 else if(Args.hasArg(OPT_fwrapv))
4136 if(Args.hasArg(OPT_fwrapv_pointer))
4137Opts.PointerOverflowDefined =
true;
4139Opts.MSCompatibilityVersion = 0;
4140 if(
constArg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
4142 if(VT.tryParse(A->getValue()))
4143Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
4145Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
4146VT.getMinor().value_or(0) * 100000 +
4147VT.getSubminor().value_or(0);
4155(!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17 && !Opts.C23) ||
4158Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
4161Args.hasFlag(OPT_fzos_extensions, OPT_fno_zos_extensions,
T.isOSzOS());
4163Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
4164&& Opts.OpenCLVersion == 200);
4166 boolHasConvergentOperations = Opts.OpenMPIsTargetDevice || Opts.OpenCL ||
4167Opts.CUDAIsDevice || Opts.SYCLIsDevice ||
4168Opts.HLSL ||
T.isAMDGPU() ||
T.isNVPTX();
4169Opts.ConvergentFunctions =
4170Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions,
4171HasConvergentOperations);
4173Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
4174 if(!Opts.NoBuiltin)
4176 if(Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
4177 if(A->getOption().matches(options::OPT_mlong_double_64))
4178Opts.LongDoubleSize = 64;
4179 else if(A->getOption().matches(options::OPT_mlong_double_80))
4180Opts.LongDoubleSize = 80;
4181 else if(A->getOption().matches(options::OPT_mlong_double_128))
4182Opts.LongDoubleSize = 128;
4184Opts.LongDoubleSize = 0;
4186 if(Opts.FastRelaxedMath || Opts.CLUnsafeMath)
4192 if(Arg *A = Args.getLastArg(OPT_mrtd)) {
4194Diags.
Report(diag::err_drv_argument_not_allowed_with)
4195<< A->getSpelling() <<
"-fdefault-calling-conv";
4197 switch(
T.getArch()) {
4198 casellvm::Triple::x86:
4201 casellvm::Triple::m68k:
4205Diags.
Report(diag::err_drv_argument_not_allowed_with)
4206<< A->getSpelling() <<
T.getTriple();
4212Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 51 : 0;
4214 boolIsSimdSpecified =
4215Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
4217Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
4219Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
4220Opts.OpenMPIsTargetDevice =
4221Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_target_device);
4222Opts.OpenMPIRBuilder =
4223Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
4224 boolIsTargetSpecified =
4225Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ);
4227 if(Opts.OpenMP || Opts.OpenMPSimd) {
4229Args, OPT_fopenmp_version_EQ,
4230(IsSimdSpecified || IsTargetSpecified) ? 51 : Opts.OpenMP, Diags))
4231Opts.OpenMP = Version;
4234 if(!Opts.OpenMPIsTargetDevice) {
4235 switch(
T.getArch()) {
4239 casellvm::Triple::nvptx:
4240 casellvm::Triple::nvptx64:
4241Diags.
Report(diag::err_drv_omp_host_target_not_supported) <<
T.str();
4249 if((Opts.OpenMPIsTargetDevice && (
T.isNVPTX() ||
T.isAMDGCN())) ||
4250Opts.OpenCLCPlusPlus) {
4252Opts.Exceptions = 0;
4253Opts.CXXExceptions = 0;
4255 if(Opts.OpenMPIsTargetDevice &&
T.isNVPTX()) {
4256Opts.OpenMPCUDANumSMs =
4258Opts.OpenMPCUDANumSMs, Diags);
4259Opts.OpenMPCUDABlocksPerSM =
4261Opts.OpenMPCUDABlocksPerSM, Diags);
4263Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
4264Opts.OpenMPCUDAReductionBufNum, Diags);
4269 if(Opts.OpenMPIsTargetDevice && (Args.hasArg(OPT_fopenmp_target_debug) ||
4270Args.hasArg(OPT_fopenmp_target_debug_EQ))) {
4272Args, OPT_fopenmp_target_debug_EQ, Opts.OpenMPTargetDebug, Diags);
4273 if(!Opts.OpenMPTargetDebug && Args.hasArg(OPT_fopenmp_target_debug))
4274Opts.OpenMPTargetDebug = 1;
4277 if(Opts.OpenMPIsTargetDevice) {
4278 if(Args.hasArg(OPT_fopenmp_assume_teams_oversubscription))
4279Opts.OpenMPTeamSubscription =
true;
4280 if(Args.hasArg(OPT_fopenmp_assume_threads_oversubscription))
4281Opts.OpenMPThreadSubscription =
true;
4285 if(Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
4286 enumArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
4287 autogetArchPtrSize = [](
constllvm::Triple &
T) {
4288 if(
T.isArch16Bit())
4290 if(
T.isArch32Bit())
4292assert(
T.isArch64Bit() &&
"Expected 64-bit architecture");
4296 for(
unsignedi = 0; i < A->getNumValues(); ++i) {
4297llvm::Triple TT(A->getValue(i));
4299 if(TT.getArch() == llvm::Triple::UnknownArch ||
4300!(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
4301TT.getArch() == llvm::Triple::spirv64 ||
4302TT.getArch() == llvm::Triple::systemz ||
4303TT.getArch() == llvm::Triple::loongarch64 ||
4304TT.getArch() == llvm::Triple::nvptx ||
4305TT.getArch() == llvm::Triple::nvptx64 ||
4306TT.getArch() == llvm::Triple::amdgcn ||
4307TT.getArch() == llvm::Triple::x86 ||
4308TT.getArch() == llvm::Triple::x86_64))
4309Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
4310 else if(getArchPtrSize(
T) != getArchPtrSize(TT))
4311Diags.
Report(diag::err_drv_incompatible_omp_arch)
4312<< A->getValue(i) <<
T.str();
4320 if(Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) {
4323Diags.
Report(diag::err_drv_omp_host_ir_file_not_found)
4328Opts.OpenMPCUDAMode = Opts.OpenMPIsTargetDevice &&
4329(
T.isNVPTX() ||
T.isAMDGCN()) &&
4330Args.hasArg(options::OPT_fopenmp_cuda_mode);
4333 if(Args.hasArg(options::OPT_fopenacc)) {
4334Opts.OpenACC =
true;
4336 if(Arg *A = Args.getLastArg(options::OPT_openacc_macro_override))
4343Opts.Optimize = Opt != 0;
4344Opts.OptimizeSize = OptSize != 0;
4349Opts.NoInlineDefine = !Opts.Optimize;
4350 if(Arg *InlineArg = Args.getLastArg(
4351options::OPT_finline_functions, options::OPT_finline_hint_functions,
4352options::OPT_fno_inline_functions, options::OPT_fno_inline))
4353 if(InlineArg->getOption().matches(options::OPT_fno_inline))
4354Opts.NoInlineDefine =
true;
4356 if(Arg *A = Args.getLastArg(OPT_ffp_contract)) {
4357StringRef Val = A->getValue();
4360 else if(Val ==
"on")
4362 else if(Val ==
"off")
4364 else if(Val ==
"fast-honor-pragmas")
4367Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
4371Args.getLastArg(OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
4372 for(
inti = 0, n = A->getNumValues(); i != n; ++i) {
4374llvm::StringSwitch<unsigned>(A->getValue(i))
4377.Case(
"add-unsigned-overflow-test",
4379.Case(
"add-signed-overflow-test",
4382.Case(
"unsigned-post-decr-while",
4391Opts.
NoSanitizeFiles= Args.getAllArgValues(OPT_fsanitize_ignorelist_EQ);
4392std::vector<std::string> systemIgnorelists =
4393Args.getAllArgValues(OPT_fsanitize_system_ignorelist_EQ);
4395systemIgnorelists.begin(),
4396systemIgnorelists.end());
4398 if(Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
4401StringRef Ver = A->getValue();
4402std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
4403 unsignedMajor, Minor = 0;
4407 if(!VerParts.first.starts_with(
"0") &&
4408!VerParts.first.getAsInteger(10, Major) && 3 <= Major &&
4409Major <= MAX_CLANG_ABI_COMPAT_VERSION &&
4411? VerParts.second.size() == 1 &&
4412!VerParts.second.getAsInteger(10, Minor)
4413: VerParts.first.size() == Ver.size() || VerParts.second ==
"0")) {
4415 if(Major == 3 && Minor <= 8)
4417 else if(Major <= 4)
4419 else if(Major <= 6)
4421 else if(Major <= 7)
4423 else if(Major <= 9)
4425 else if(Major <= 11)
4427 else if(Major <= 12)
4429 else if(Major <= 14)
4431 else if(Major <= 15)
4433 else if(Major <= 17)
4435 else if(Major <= 18)
4437 else if(Major <= 19)
4439}
else if(Ver !=
"latest") {
4440Diags.
Report(diag::err_drv_invalid_value)
4441<< A->getAsString(Args) << A->getValue();
4445 if(Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
4446StringRef SignScope = A->getValue();
4448 if(SignScope.equals_insensitive(
"none"))
4449Opts.setSignReturnAddressScope(
4451 else if(SignScope.equals_insensitive(
"all"))
4452Opts.setSignReturnAddressScope(
4454 else if(SignScope.equals_insensitive(
"non-leaf"))
4455Opts.setSignReturnAddressScope(
4458Diags.
Report(diag::err_drv_invalid_value)
4459<< A->getAsString(Args) << SignScope;
4461 if(Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
4462StringRef SignKey = A->getValue();
4463 if(!SignScope.empty() && !SignKey.empty()) {
4464 if(SignKey ==
"a_key")
4465Opts.setSignReturnAddressKey(
4467 else if(SignKey ==
"b_key")
4468Opts.setSignReturnAddressKey(
4471Diags.
Report(diag::err_drv_invalid_value)
4472<< A->getAsString(Args) << SignKey;
4478StringRef
CXXABI= Args.getLastArgValue(OPT_fcxx_abi_EQ);
4485Diags.
Report(diag::err_unsupported_cxx_abi) <<
CXXABI<<
T.str();
4491Opts.RelativeCXXABIVTables =
4492Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables,
4493options::OPT_fno_experimental_relative_cxx_abi_vtables,
4497 boolHasRTTI = !Args.hasArg(options::OPT_fno_rtti);
4498Opts.OmitVTableRTTI =
4499Args.hasFlag(options::OPT_fexperimental_omit_vtable_rtti,
4500options::OPT_fno_experimental_omit_vtable_rtti,
false);
4501 if(Opts.OmitVTableRTTI && HasRTTI)
4502Diags.
Report(diag::err_drv_using_omit_rtti_component_without_no_rtti);
4504 for(
const auto&A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
4505 auto Split= StringRef(A).split(
'=');
4507{std::string(
Split.first), std::string(
Split.second)});
4511!Args.getLastArg(OPT_fno_file_reproducible) &&
4512(Args.getLastArg(OPT_ffile_compilation_dir_EQ) ||
4513Args.getLastArg(OPT_fmacro_prefix_map_EQ) ||
4514Args.getLastArg(OPT_ffile_reproducible));
4517 if(Arg *A = Args.getLastArg(options::OPT_mvscale_min_EQ)) {
4519 if(StringRef(A->getValue()).getAsInteger(10, VScaleMin) || VScaleMin == 0)
4520Diags.
Report(diag::err_cc1_unbounded_vscale_min);
4523 if(
constArg *A = Args.getLastArg(OPT_frandomize_layout_seed_file_EQ)) {
4524std::ifstream SeedFile(A->getValue(0));
4526 if(!SeedFile.is_open())
4527Diags.
Report(diag::err_drv_cannot_open_randomize_layout_seed_file)
4533 if(
constArg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ))
4540 if(
T.isDXIL() ||
T.isSPIRVLogical()) {
4542 enum{ OS, Environment };
4544 intExpectedOS =
T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
4546 if(
T.getOSName().empty()) {
4547Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4548<< ExpectedOS << OS <<
T.str();
4549}
else if(
T.getEnvironmentName().empty()) {
4550Diags.
Report(diag::err_drv_hlsl_bad_shader_required_in_target)
4552}
else if(!
T.isShaderStageEnvironment()) {
4553Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4558 if(!
T.isShaderModelOS() ||
T.getOSVersion() == VersionTuple(0)) {
4559Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4560<< ShaderModel <<
T.getOSName() <<
T.str();
4565 if(Args.getLastArg(OPT_fnative_half_type)) {
4568 if(!(Opts.
LangStd>= LangStandard::lang_hlsl2018 &&
4569 T.getOSVersion() >= VersionTuple(6, 2)))
4570Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4571<<
"-enable-16bit-types"<<
true<<
Std.getName()
4572<<
T.getOSVersion().getAsString();
4574}
else if(
T.isSPIRVLogical()) {
4575 if(!
T.isVulkanOS() ||
T.getVulkanVersion() == VersionTuple(0)) {
4576Diags.
Report(diag::err_drv_hlsl_bad_shader_unsupported)
4577<< VulkanEnv <<
T.getOSName() <<
T.str();
4579 if(Args.getLastArg(OPT_fnative_half_type)) {
4582 if(!(Opts.
LangStd>= LangStandard::lang_hlsl2018))
4583Diags.
Report(diag::err_drv_hlsl_16bit_types_unsupported)
4584<<
"-fnative-half-type"<<
false<<
Std.getName();
4587llvm_unreachable(
"expected DXIL or SPIR-V target");
4590Diags.
Report(diag::err_drv_hlsl_unsupported_target) <<
T.str();
4592 if(Opts.
LangStd< LangStandard::lang_hlsl202x) {
4597Diags.
Report(diag::warn_hlsl_langstd_minimal)
4648llvm_unreachable(
"invalid frontend action");
4658#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ 4659 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 4660#include "clang/Driver/Options.inc" 4661#undef PREPROCESSOR_OPTION_WITH_MARSHALLING 4664 GenerateArg(Consumer, OPT_pch_through_hdrstop_use);
4667 GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl,
D);
4674 for(
const auto&M : Opts.
Macros) {
4677 if(M.first ==
"__CET__=1"&& !M.second &&
4678!CodeGenOpts.CFProtectionReturn && CodeGenOpts.CFProtectionBranch)
4680 if(M.first ==
"__CET__=2"&& !M.second && CodeGenOpts.CFProtectionReturn &&
4681!CodeGenOpts.CFProtectionBranch)
4683 if(M.first ==
"__CET__=3"&& !M.second && CodeGenOpts.CFProtectionReturn &&
4684CodeGenOpts.CFProtectionBranch)
4687 GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first);
4690 for(
const auto&I : Opts.
Includes) {
4693 if(LangOpts.OpenCL && LangOpts.IncludeDefaultHeader &&
4694((LangOpts.DeclareOpenCLBuiltins && I ==
"opencl-c-base.h") ||
4695I ==
"opencl-c.h"))
4699 if(LangOpts.HLSL && I ==
"hlsl.h")
4709 GenerateArg(Consumer, OPT_remap_file, RF.first +
";"+ RF.second);
4715 GenerateArg(Consumer, OPT_fdefine_target_os_macros);
4718 GenerateArg(Consumer, OPT_embed_dir_EQ, EmbedEntry);
4732#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ 4733 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 4734#include "clang/Driver/Options.inc" 4735#undef PREPROCESSOR_OPTION_WITH_MARSHALLING 4737Opts.
PCHWithHdrStop= Args.hasArg(OPT_pch_through_hdrstop_create) ||
4738Args.hasArg(OPT_pch_through_hdrstop_use);
4740 for(
const auto*A : Args.filtered(OPT_error_on_deserialized_pch_decl))
4743 if(
constArg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
4744StringRef
Value(A->getValue());
4745 size_tComma =
Value.find(
',');
4747 unsignedEndOfLine = 0;
4749 if(Comma == StringRef::npos ||
4750 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
4751 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
4752Diags.
Report(diag::err_drv_preamble_format);
4760 if(
constArg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
4761StringRef Name = A->getValue();
4762 if(Name ==
"branch")
4764 else if(Name ==
"return")
4766 else if(Name ==
"full")
4771 for(
const auto*A : Args.filtered(OPT_D, OPT_U)) {
4772 if(A->getOption().matches(OPT_D))
4779 for(
const auto*A : Args.filtered(OPT_include))
4780Opts.
Includes.emplace_back(A->getValue());
4782 for(
const auto*A : Args.filtered(OPT_chain_include))
4785 for(
const auto*A : Args.filtered(OPT_remap_file)) {
4786std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
4788 if(Split.second.empty()) {
4789Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
4796 if(
constArg *A = Args.getLastArg(OPT_source_date_epoch)) {
4797StringRef Epoch = A->getValue();
4801 constuint64_t MaxTimestamp =
4802std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799);
4804 if(Epoch.getAsInteger(10,
V) ||
V> MaxTimestamp) {
4805Diags.
Report(diag::err_fe_invalid_source_date_epoch)
4806<< Epoch << MaxTimestamp;
4812 for(
const auto*A : Args.filtered(OPT_embed_dir_EQ)) {
4813StringRef Val = A->getValue();
4824Args.hasFlag(OPT_fdefine_target_os_macros,
4836#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ 4837 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 4838#include "clang/Driver/Options.inc" 4839#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING 4857#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ 4858 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 4859#include "clang/Driver/Options.inc" 4860#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING 4863Opts.
ShowMacros= Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
4872#define TARGET_OPTION_WITH_MARSHALLING(...) \ 4873 GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) 4874#include "clang/Driver/Options.inc" 4875#undef TARGET_OPTION_WITH_MARSHALLING 4881 GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ,
4891#define TARGET_OPTION_WITH_MARSHALLING(...) \ 4892 PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) 4893#include "clang/Driver/Options.inc" 4894#undef TARGET_OPTION_WITH_MARSHALLING 4896 if(Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
4897llvm::VersionTuple Version;
4898 if(Version.tryParse(A->getValue()))
4899Diags.
Report(diag::err_drv_invalid_value)
4900<< A->getAsString(Args) << A->getValue();
4905Args.getLastArg(options::OPT_darwin_target_variant_sdk_version_EQ)) {
4906llvm::VersionTuple Version;
4907 if(Version.tryParse(A->getValue()))
4908Diags.
Report(diag::err_drv_invalid_value)
4909<< A->getAsString(Args) << A->getValue();
4917boolCompilerInvocation::CreateFromArgsImpl(
4925 unsignedMissingArgIndex, MissingArgCount;
4926InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
4927MissingArgCount, VisibilityMask);
4931 if(MissingArgCount)
4932Diags.
Report(diag::err_drv_missing_argument)
4933<< Args.getArgString(MissingArgIndex) << MissingArgCount;
4936 for(
const auto*A : Args.filtered(OPT_UNKNOWN)) {
4937 autoArgString = A->getAsString(Args);
4938std::string Nearest;
4939 if(Opts.findNearest(ArgString, Nearest, VisibilityMask) > 1)
4940Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
4942Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
4943<< ArgString << Nearest;
4968 if(
Warning==
"misexpect"&&
4982 if(
LangOpts.OpenMPIsTargetDevice)
4992!
LangOpts.Sanitize.has(SanitizerKind::Address) &&
4993!
LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
4994!
LangOpts.Sanitize.has(SanitizerKind::Memory) &&
4995!
LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
5008Diags.
Report(diag::err_fe_dependency_file_requires_MT);
5014Diags.
Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
5028Diags, llvm::vfs::getRealFileSystem());
5042 const char*Argv0) {
5048 returnCreateFromArgsImpl(Invocation, CommandLineArgs, Diags, Argv0);
5052Args.push_back(
"-cc1");
5055Invocation, DummyInvocation, CommandLineArgs, Diags, Argv0);
5060llvm::HashBuilder<llvm::MD5, llvm::endianness::native> HBuilder;
5073#define LANGOPT(Name, Bits, Default, Description) HBuilder.add(LangOpts->Name); 5074#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5075 HBuilder.add(static_cast<unsigned>(LangOpts->get##Name())); 5076#define BENIGN_LANGOPT(Name, Bits, Default, Description) 5077#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 5078#include "clang/Basic/LangOptions.def" 5080HBuilder.addRange(
getLangOpts().ModuleFeatures);
5083HBuilder.addRange(
getLangOpts().CommentOpts.BlockCommandNames);
5100StringRef MacroDef = Macro.first;
5102llvm::CachedHashString(MacroDef.split(
'=').first)))
5106HBuilder.add(Macro);
5122#define DIAGOPT(Name, Bits, Default) HBuilder.add(diagOpts.Name); 5123#define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5124 HBuilder.add(diagOpts.get##Name()); 5125#include "clang/Basic/DiagnosticOptions.def" 5135ext->hashExtension(HBuilder);
5141 if(
autoMinor =
APINotesOpts.SwiftVersion.getMinor())
5142HBuilder.add(*Minor);
5143 if(
autoSubminor =
APINotesOpts.SwiftVersion.getSubminor())
5144HBuilder.add(*Subminor);
5145 if(
autoBuild =
APINotesOpts.SwiftVersion.getBuild())
5146HBuilder.add(*Build);
5156#define DEBUGOPT(Name, Bits, Default) HBuilder.add(CodeGenOpts->Name); 5157#define VALUE_DEBUGOPT(Name, Bits, Default) HBuilder.add(CodeGenOpts->Name); 5158#define ENUM_DEBUGOPT(Name, Type, Bits, Default) \ 5159 HBuilder.add(static_cast<unsigned>(CodeGenOpts->get##Name())); 5160#define BENIGN_DEBUGOPT(Name, Bits, Default) 5161#define BENIGN_VALUE_DEBUGOPT(Name, Bits, Default) 5162#define BENIGN_ENUM_DEBUGOPT(Name, Type, Bits, Default) 5163#include "clang/Basic/DebugOptions.def" 5170 if(!SanHash.
empty())
5171HBuilder.add(SanHash.
Mask);
5173llvm::MD5::MD5Result
Result;
5174HBuilder.getHasher().final(
Result);
5176 return toString(llvm::APInt(64, Hash), 36,
false);
5204std::vector<std::string> Args{
"-cc1"};
5206[&Args](
constTwine &Arg) { Args.push_back(Arg.str()); });
5232llvm::vfs::getRealFileSystem());
5240Diags, std::move(BaseFS));
5246 if(VFSOverlayFiles.empty())
5251 for(
const auto&
File: VFSOverlayFiles) {
5252llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
5255Diags.
Report(diag::err_missing_vfs_overlay_file) <<
File;
5260std::move(Buffer.get()),
nullptr,
File,
5263Diags.
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 unsigned getOptimizationLevelSize(ArgList &Args)
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)
llvm::function_ref< bool(CompilerInvocation &, ArrayRef< const char * >, DiagnosticsEngine &, const char *)> ParseFn
llvm::function_ref< void(CompilerInvocation &, SmallVectorImpl< const char * > &, CompilerInvocation::StringAllocator)> GenerateFn
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 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 void setPGOUseInstrumentor(CodeGenOptions &Opts, const Twine &ProfileName, llvm::vfs::FileSystem &FS, DiagnosticsEngine &Diags)
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 ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, const std::string &WorkingDir)
static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, bool &IsHeaderFile)
static auto makeBooleanOptionDenormalizer(bool Value)
static void GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, ArgumentConsumer Consumer, frontend::ActionKind Action)
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action)
static std::string serializeXRayInstrumentationBundle(const XRayInstrSet &S)
static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags)
static 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)
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)
static unsigned getOptimizationLevel(ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
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 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.
Defines the clang::TargetOptions class.
Defines version macros and version-related utility functions for Clang.
Defines the clang::Visibility enumeration and various utility functions.
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.
Implements C++ ABI-specific semantic analysis functions.
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).
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 StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
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
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::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< 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
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
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
AnalyzerOptionsRef AnalyzerOpts
Options controlling the static analyzer.
IntrusiveRefCntPtr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
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 std::string GetResourcesPath(const char *Argv0, void *MainAddr)
Get the directory where the compiler headers reside, relative to the compiler binary (found by the pa...
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()
std::string getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
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()
std::shared_ptr< LangOptions > LangOpts
Base class internals.
TargetOptions & getTargetOpts()
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.
Used for handling and querying diagnostic IDs.
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.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
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.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
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.
std::map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
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.
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.
The kind of a file that we've been handed as an input.
bool isPreprocessed() const
InputKind withHeaderUnit(HeaderUnitKind HU) const
bool isUnknown() const
Is the input kind fully-unknown?
InputKind getPreprocessed() const
HeaderUnitKind getHeaderUnitKind() const
InputKind getHeader() const
InputKind withFormat(Format F) const
Language getLanguage() const
@ 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â)
@ Ver6
Attempt to be ABI-compatible with code generated by Clang 6.0.x (SVN r321711).
@ Ver18
Attempt to be ABI-compatible with code generated by Clang 18.0.x.
@ Ver4
Attempt to be ABI-compatible with code generated by Clang 4.0.x (SVN r291814).
@ Ver14
Attempt to be ABI-compatible with code generated by Clang 14.0.x.
@ Ver11
Attempt to be ABI-compatible with code generated by Clang 11.0.x (git 2e10b7a39b93).
@ Ver19
Attempt to be ABI-compatible with code generated by Clang 19.0.x.
@ Ver15
Attempt to be ABI-compatible with code generated by Clang 15.0.x.
@ Ver17
Attempt to be ABI-compatible with code generated by Clang 17.0.x.
@ Ver7
Attempt to be ABI-compatible with code generated by Clang 7.0.x (SVN r338536).
@ Latest
Conform to the underlying platform's C and C++ ABIs as closely as we can.
@ Ver3_8
Attempt to be ABI-compatible with code generated by Clang 3.8.x (SVN r257626).
@ Ver12
Attempt to be ABI-compatible with code generated by Clang 12.0.x (git 8e464dd76bef).
@ Ver9
Attempt to be ABI-compatible with code generated by Clang 9.0.x (SVN r351319).
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
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.
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 OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
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().
LangStandard::Kind LangStd
The used language standard.
std::string OpenACCMacroOverride
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 sepa...
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 beginni...
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.
Action - Represent an abstract compilation step to perform.
static std::string GetResourcesPath(StringRef BinaryPath)
Takes the path to a binary that's either in bin/ or lib/ and returns the path to clang's resource dir...
constexpr XRayInstrMask None
constexpr XRayInstrMask All
const llvm::opt::OptTable & getDriverOptTable()
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.
@ EmitBC
Emit a .bc file.
@ 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,.
@ EmitObj
Emit a .o file.
@ 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.
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.
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.
std::unique_ptr< DiagnosticOptions > CreateAndPopulateDiagOpts(ArrayRef< const char * > Argv)
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
@ HIFIL_Only_Direct_System
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 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.
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.
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
void serializeSanitizerMaskCutoffs(const SanitizerMaskCutoffs &Cutoffs, SmallVectorImpl< std::string > &Values)
Serialize a SanitizerMaskCutoffs into values for -fsanitize= or -fno-sanitize=.
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 FunctionProtoType * T
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.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true)
Fill out Opts based on the options given in Args.
@ Success
Template argument deduction was successful.
AnalysisInliningMode
AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
Diagnostic wrappers for TextAPI types for error reporting.
__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.
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 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 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 FunctionPointers
The ABI for C function 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 CXXVirtualFunctionPointers
The ABI for most C++ virtual function pointers, i.e. v-table entries.
bool IndirectGotos
Do indirect goto label addresses need to be authenticated?
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
bool empty() const
Returns true if no sanitizers are enabled.
SanitizerMask Mask
Bitmask of enabled sanitizers.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4