28 #include "clang/Config/config.h" 46 #include "llvm/ADT/APInt.h" 47 #include "llvm/ADT/ArrayRef.h" 48 #include "llvm/ADT/CachedHashString.h" 49 #include "llvm/ADT/Hashing.h" 50 #include "llvm/ADT/None.h" 51 #include "llvm/ADT/Optional.h" 52 #include "llvm/ADT/SmallString.h" 53 #include "llvm/ADT/SmallVector.h" 54 #include "llvm/ADT/StringRef.h" 55 #include "llvm/ADT/StringSwitch.h" 56 #include "llvm/ADT/Triple.h" 57 #include "llvm/ADT/Twine.h" 58 #include "llvm/IR/DebugInfoMetadata.h" 59 #include "llvm/Linker/Linker.h" 60 #include "llvm/MC/MCTargetOptions.h" 61 #include "llvm/Option/Arg.h" 62 #include "llvm/Option/ArgList.h" 63 #include "llvm/Option/OptSpecifier.h" 64 #include "llvm/Option/OptTable.h" 65 #include "llvm/Option/Option.h" 66 #include "llvm/ProfileData/InstrProfReader.h" 67 #include "llvm/Support/CodeGen.h" 68 #include "llvm/Support/Compiler.h" 69 #include "llvm/Support/Error.h" 70 #include "llvm/Support/ErrorHandling.h" 71 #include "llvm/Support/ErrorOr.h" 72 #include "llvm/Support/FileSystem.h" 73 #include "llvm/Support/Host.h" 74 #include "llvm/Support/MathExtras.h" 75 #include "llvm/Support/MemoryBuffer.h" 76 #include "llvm/Support/Path.h" 77 #include "llvm/Support/Process.h" 78 #include "llvm/Support/Regex.h" 79 #include "llvm/Support/VersionTuple.h" 80 #include "llvm/Support/VirtualFileSystem.h" 81 #include "llvm/Support/raw_ostream.h" 82 #include "llvm/Target/TargetOptions.h" 94 using namespace clang;
95 using namespace driver;
96 using namespace options;
126 DefaultOpt = llvm::CodeGenOpt::Default;
128 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
129 if (A->getOption().matches(options::OPT_O0))
132 if (A->getOption().matches(options::OPT_Ofast))
133 return llvm::CodeGenOpt::Aggressive;
135 assert(A->getOption().matches(options::OPT_O));
137 StringRef S(A->getValue());
138 if (S ==
"s" || S ==
"z" || S.empty())
139 return llvm::CodeGenOpt::Default;
142 return llvm::CodeGenOpt::Less;
151 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
152 if (A->getOption().matches(options::OPT_O)) {
153 switch (A->getValue()[0]) {
167 OptSpecifier GroupWithValue,
168 std::vector<std::string> &Diagnostics) {
169 for (
auto *A : Args.filtered(Group)) {
170 if (A->getOption().getKind() == Option::FlagClass) {
173 Diagnostics.push_back(A->getOption().getName().drop_front(1));
174 }
else if (A->getOption().matches(GroupWithValue)) {
176 Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim(
"=-"));
179 for (
const auto *Arg : A->getValues())
180 Diagnostics.emplace_back(Arg);
191 std::vector<std::string> &Funcs) {
193 for (
const auto &Arg : Args) {
194 const Option &O = Arg->getOption();
195 if (O.matches(options::OPT_fno_builtin_)) {
196 const char *FuncName = Arg->getValue();
198 Values.push_back(FuncName);
201 Funcs.insert(Funcs.end(), Values.begin(), Values.end());
207 if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {
208 StringRef Name = A->getValue();
211 .Case(CMDFLAG, NAME##Model)
212 #include "clang/StaticAnalyzer/Core/Analyses.def" 215 Diags.
Report(diag::err_drv_invalid_value)
216 << A->getAsString(Args) << Name;
223 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
224 StringRef Name = A->getValue();
227 .Case(CMDFLAG, NAME##Model)
228 #include "clang/StaticAnalyzer/Core/Analyses.def" 231 Diags.
Report(diag::err_drv_invalid_value)
232 << A->getAsString(Args) << Name;
239 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
240 StringRef Name = A->getValue();
243 .Case(CMDFLAG, PD_##NAME)
244 #include "clang/StaticAnalyzer/Core/Analyses.def" 247 Diags.
Report(diag::err_drv_invalid_value)
248 << A->getAsString(Args) << Name;
255 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
256 StringRef Name = A->getValue();
260 #include "clang/StaticAnalyzer/Core/Analyses.def" 263 Diags.
Report(diag::err_drv_invalid_value)
264 << A->getAsString(Args) << Name;
271 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
272 StringRef Name = A->getValue();
276 #include "clang/StaticAnalyzer/Core/Analyses.def" 279 Diags.
Report(diag::err_drv_invalid_value)
280 << A->getAsString(Args) << Name;
290 Args.hasArg(OPT_analyzer_checker_help_developer);
294 Args.hasArg(OPT_analyzer_checker_option_help_alpha);
296 Args.hasArg(OPT_analyzer_checker_option_help_developer);
301 !llvm::StringSwitch<bool>(
302 Args.getLastArgValue(OPT_analyzer_config_compatibility_mode))
304 .Case(
"false",
false)
309 Args.hasArg(OPT_analyzer_viz_egraph_graphviz);
313 Opts.
AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers);
316 Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks);
319 Opts.
TrimGraph = Args.hasArg(OPT_trim_egraph);
322 Opts.
PrintStats = Args.hasArg(OPT_analyzer_stats);
329 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
331 bool enable = (A->getOption().getID() == OPT_analyzer_checker);
334 StringRef checkerList = A->getValue();
336 checkerList.split(checkers,
",");
337 for (
auto checker : checkers)
342 for (
const auto *A : Args.filtered(OPT_analyzer_config)) {
346 StringRef configList = A->getValue();
348 configList.split(configVals,
",");
349 for (
const auto &configVal : configVals) {
351 std::tie(key, val) = configVal.split(
"=");
354 diag::err_analyzer_config_no_value) << configVal;
358 if (val.find(
'=') != StringRef::npos) {
360 diag::err_analyzer_config_multiple_values)
370 Diags.
Report(diag::err_analyzer_config_unknown) << key;
385 for (
unsigned i = 0;
i < Args.getNumInputArgStrings(); ++
i) {
388 os << Args.getArgString(
i);
396 StringRef OptionName, StringRef DefaultVal) {
397 return Config.insert({OptionName, DefaultVal}).first->second;
402 StringRef &OptionField, StringRef Name,
403 StringRef DefaultVal) {
412 bool &OptionField, StringRef Name,
bool DefaultVal) {
413 auto PossiblyInvalidVal = llvm::StringSwitch<Optional<bool>>(
416 .Case(
"false",
false)
419 if (!PossiblyInvalidVal) {
421 Diags->
Report(diag::err_analyzer_config_invalid_input)
422 << Name <<
"a boolean";
424 OptionField = DefaultVal;
426 OptionField = PossiblyInvalidVal.getValue();
431 unsigned &OptionField, StringRef Name,
432 unsigned DefaultVal) {
434 OptionField = DefaultVal;
435 bool HasFailed =
getStringOption(Config, Name, std::to_string(DefaultVal))
436 .getAsInteger(0, OptionField);
437 if (Diags && HasFailed)
438 Diags->
Report(diag::err_analyzer_config_invalid_input)
439 << Name <<
"an unsigned";
447 #define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \ 448 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL); 450 #define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \ 451 SHALLOW_VAL, DEEP_VAL) \ 452 switch (AnOpts.getUserMode()) { \ 454 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, SHALLOW_VAL); \ 457 initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEEP_VAL); \ 461 #include "clang/StaticAnalyzer/Core/AnalyzerOptions.def" 462 #undef ANALYZER_OPTION 463 #undef ANALYZER_OPTION_DEPENDS_ON_USER_MODE 470 if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
471 Diags->
Report(diag::err_analyzer_config_invalid_input)
472 <<
"track-conditions-debug" <<
"'track-conditions' to also be enabled";
474 if (!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir))
475 Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"ctu-dir" 478 if (!AnOpts.ModelPath.empty() &&
479 !llvm::sys::fs::is_directory(AnOpts.ModelPath))
480 Diags->
Report(diag::err_analyzer_config_invalid_input) <<
"model-path" 496 if (Arg *A = Args.getLastArg(OPT_mcode_model)) {
497 StringRef
Value = A->getValue();
498 if (Value ==
"small" || Value ==
"kernel" || Value ==
"medium" ||
499 Value ==
"large" || Value ==
"tiny")
501 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Value;
508 if (Arg *A = Args.getLastArg(OPT_mrelocation_model)) {
509 StringRef
Value = A->getValue();
510 auto RM = llvm::StringSwitch<llvm::Optional<llvm::Reloc::Model>>(
Value)
511 .Case(
"static", llvm::Reloc::Static)
512 .Case(
"pic", llvm::Reloc::PIC_)
513 .Case(
"ropi", llvm::Reloc::ROPI)
514 .Case(
"rwpi", llvm::Reloc::RWPI)
515 .Case(
"ropi-rwpi", llvm::Reloc::ROPI_RWPI)
516 .Case(
"dynamic-no-pic", llvm::Reloc::DynamicNoPIC)
520 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Value;
522 return llvm::Reloc::PIC_;
527 static std::shared_ptr<llvm::Regex>
530 StringRef Val = RpassArg->getValue();
531 std::string RegexError;
532 std::shared_ptr<llvm::Regex> Pattern = std::make_shared<llvm::Regex>(Val);
533 if (!Pattern->isValid(RegexError)) {
534 Diags.
Report(diag::err_drv_optimization_remark_pattern)
535 << RegexError << RpassArg->getAsString(Args);
542 const std::vector<std::string> &Levels,
546 for (
const auto &
Level : Levels) {
548 llvm::StringSwitch<DiagnosticLevelMask>(
Level)
557 Diags->
Report(diag::err_drv_invalid_value) << FlagName <<
Level;
565 const std::vector<std::string> &Sanitizers,
567 for (
const auto &Sanitizer : Sanitizers) {
570 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
580 llvm::SplitString(Bundle, BundleParts,
",");
581 for (
const auto B : BundleParts) {
585 D.
Report(diag::err_drv_invalid_value) << FlagName << Bundle;
598 Arg *A = Args.getLastArg(OPT_fprofile_instrument_EQ);
601 StringRef S = A->getValue();
602 unsigned I = llvm::StringSwitch<unsigned>(S)
609 Diags.
Report(diag::err_drv_invalid_pgo_instrumentor) << A->getAsString(Args)
614 Opts.setProfileInstr(Instrumentor);
619 const Twine &ProfileName) {
622 if (
auto E = ReaderOrErr.takeError()) {
623 llvm::consumeError(std::move(E));
627 std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader =
628 std::move(ReaderOrErr.get());
629 if (PGOReader->isIRLevelProfile()) {
630 if (PGOReader->hasCSIRLevelProfile())
643 llvm::Triple Triple = llvm::Triple(TargetOpts.
Triple);
647 unsigned MaxOptLevel = 3;
648 if (OptimizationLevel > MaxOptLevel) {
651 Diags.
Report(diag::warn_drv_optimization_value)
652 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
653 OptimizationLevel = MaxOptLevel;
655 Opts.OptimizationLevel = OptimizationLevel;
659 Opts.setInlining((Opts.OptimizationLevel == 0)
664 if (Arg *InlineArg = Args.getLastArg(
665 options::OPT_finline_functions, options::OPT_finline_hint_functions,
666 options::OPT_fno_inline_functions, options::OPT_fno_inline)) {
667 if (Opts.OptimizationLevel > 0) {
668 const Option &InlineOpt = InlineArg->getOption();
669 if (InlineOpt.matches(options::OPT_finline_functions))
670 Opts.setInlining(CodeGenOptions::NormalInlining);
671 else if (InlineOpt.matches(options::OPT_finline_hint_functions))
678 Opts.ExperimentalNewPassManager = Args.hasFlag(
679 OPT_fexperimental_new_pass_manager, OPT_fno_experimental_new_pass_manager,
680 ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER);
682 Opts.DebugPassManager =
683 Args.hasFlag(OPT_fdebug_pass_manager, OPT_fno_debug_pass_manager,
686 if (Arg *A = Args.getLastArg(OPT_fveclib)) {
687 StringRef Name = A->getValue();
688 if (Name ==
"Accelerate")
690 else if (Name ==
"MASSV")
692 else if (Name ==
"SVML")
694 else if (Name ==
"none")
697 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
700 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
702 llvm::StringSwitch<unsigned>(A->getValue())
709 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
712 Opts.setDebugInfo(static_cast<codegenoptions::DebugInfoKind>(Val));
714 if (Arg *A = Args.getLastArg(OPT_debugger_tuning_EQ)) {
715 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
716 .Case(
"gdb",
unsigned(llvm::DebuggerKind::GDB))
717 .Case(
"lldb",
unsigned(llvm::DebuggerKind::LLDB))
718 .Case(
"sce",
unsigned(llvm::DebuggerKind::SCE))
721 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
724 Opts.setDebuggerTuning(static_cast<llvm::DebuggerKind>(Val));
727 Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);
728 Opts.EmitCodeView = Args.hasArg(OPT_gcodeview);
729 Opts.CodeViewGHash = Args.hasArg(OPT_gcodeview_ghash);
730 Opts.MacroDebugInfo = Args.hasArg(OPT_debug_info_macro);
731 Opts.WholeProgramVTables = Args.hasArg(OPT_fwhole_program_vtables);
732 Opts.LTOVisibilityPublicStd = Args.hasArg(OPT_flto_visibility_public_std);
735 Opts.SplitDwarfInlining = !Args.hasArg(OPT_fno_split_dwarf_inlining);
736 Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs);
737 Opts.DebugExplicitImport = Args.hasArg(OPT_dwarf_explicit_import);
738 Opts.DebugFwdTemplateParams = Args.hasArg(OPT_debug_forward_template_params);
739 Opts.EmbedSource = Args.hasArg(OPT_gembed_source);
741 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ))
745 Args.getLastArg(OPT_emit_llvm_uselists, OPT_no_emit_llvm_uselists))
746 Opts.EmitLLVMUseLists = A->getOption().getID() == OPT_emit_llvm_uselists;
748 Opts.DisableLLVMPasses = Args.hasArg(OPT_disable_llvm_passes);
749 Opts.DisableLifetimeMarkers = Args.hasArg(OPT_disable_lifetimemarkers);
751 llvm::Triple T(TargetOpts.
Triple);
752 llvm::Triple::ArchType Arch = T.getArch();
753 if (Opts.OptimizationLevel > 0 &&
754 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64))
755 Opts.EnableDebugEntryValues = Args.hasArg(OPT_femit_debug_entry_values);
757 Opts.DisableO0ImplyOptNone = Args.hasArg(OPT_disable_O0_optnone);
758 Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
759 Opts.IndirectTlsSegRefs = Args.hasArg(OPT_mno_tls_direct_seg_refs);
760 Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
761 Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
762 OPT_fuse_register_sized_bitfield_access);
763 Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
764 Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa);
765 Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
766 Args.hasArg(OPT_new_struct_path_tbaa);
767 Opts.FineGrainedBitfieldAccesses =
768 Args.hasFlag(OPT_ffine_grained_bitfield_accesses,
769 OPT_fno_fine_grained_bitfield_accesses,
false);
772 Opts.MergeAllConstants = Args.hasArg(OPT_fmerge_all_constants);
773 Opts.NoCommon = Args.hasArg(OPT_fno_common);
774 Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
776 Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||
777 Args.hasArg(OPT_ffreestanding));
778 if (Opts.SimplifyLibCalls)
781 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
782 (Opts.OptimizationLevel > 1));
783 Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);
785 Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);
786 Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
788 Opts.DebugInfoForProfiling = Args.hasFlag(
789 OPT_fdebug_info_for_profiling, OPT_fno_debug_info_for_profiling,
false);
790 Opts.DebugNameTable =
static_cast<unsigned>(
791 Args.hasArg(OPT_ggnu_pubnames)
792 ? llvm::DICompileUnit::DebugNameTableKind::GNU
793 : Args.hasArg(OPT_gpubnames)
794 ? llvm::DICompileUnit::DebugNameTableKind::Default
796 Opts.DebugRangesBaseAddress = Args.hasArg(OPT_fdebug_ranges_base_address);
800 Args.getLastArgValue(OPT_fprofile_instrument_path_EQ);
802 Args.getLastArgValue(OPT_fprofile_instrument_use_path_EQ);
806 Args.getLastArgValue(OPT_fprofile_remapping_file_EQ);
808 Diags.
Report(diag::err_drv_argument_only_allowed_with)
809 << Args.getLastArg(OPT_fprofile_remapping_file_EQ)->getAsString(Args)
810 <<
"-fexperimental-new-pass-manager";
813 Opts.CoverageMapping =
814 Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping,
false);
815 Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);
816 Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);
817 Opts.PreserveAsmComments = !Args.hasArg(OPT_fno_preserve_as_comments);
818 Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
819 Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
820 Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
821 Opts.RegisterGlobalDtorsWithAtExit =
822 Args.hasArg(OPT_fregister_global_dtors_with_atexit);
823 Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
825 Opts.
DebugPass = Args.getLastArgValue(OPT_mdebug_pass);
827 (Args.hasArg(OPT_mdisable_fp_elim) || Args.hasArg(OPT_pg));
828 Opts.DisableFree = Args.hasArg(OPT_disable_free);
829 Opts.DiscardValueNames = Args.hasArg(OPT_discard_value_names);
830 Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
831 Opts.NoEscapingBlockTailCalls =
832 Args.hasArg(OPT_fno_escaping_block_tail_calls);
833 Opts.
FloatABI = Args.getLastArgValue(OPT_mfloat_abi);
834 Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable) ||
835 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
836 Args.hasArg(OPT_cl_fast_relaxed_math);
838 Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
839 Args.hasArg(OPT_cl_finite_math_only) ||
840 Args.hasArg(OPT_cl_fast_relaxed_math));
841 Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
842 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
843 Args.hasArg(OPT_cl_finite_math_only) ||
844 Args.hasArg(OPT_cl_fast_relaxed_math));
845 Opts.NoSignedZeros = (Args.hasArg(OPT_fno_signed_zeros) ||
846 Args.hasArg(OPT_cl_no_signed_zeros) ||
847 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
848 Args.hasArg(OPT_cl_fast_relaxed_math));
849 Opts.Reassociate = Args.hasArg(OPT_mreassociate);
850 Opts.FlushDenorm = Args.hasArg(OPT_cl_denorms_are_zero) ||
851 (Args.hasArg(OPT_fcuda_is_device) &&
852 Args.hasArg(OPT_fcuda_flush_denormals_to_zero));
853 Opts.CorrectlyRoundedDivSqrt =
854 Args.hasArg(OPT_cl_fp32_correctly_rounded_divide_sqrt);
856 Args.hasArg(OPT_cl_uniform_work_group_size);
857 Opts.
Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ);
858 Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math);
859 Opts.NoTrappingMath = Args.hasArg(OPT_fno_trapping_math);
860 Opts.StrictFloatCastOverflow =
861 !Args.hasArg(OPT_fno_strict_float_cast_overflow);
863 Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
865 Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
866 Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
867 Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);
868 Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
869 Opts.IncrementalLinkerCompatible =
870 Args.hasArg(OPT_mincremental_linker_compatible);
871 Opts.PIECopyRelocations =
872 Args.hasArg(OPT_mpie_copy_relocations);
873 Opts.NoPLT = Args.hasArg(OPT_fno_plt);
874 Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
875 Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
876 Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm);
877 Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
878 Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums);
879 Opts.StrictReturn = !Args.hasArg(OPT_fno_strict_return);
880 Opts.StrictVTablePointers = Args.hasArg(OPT_fstrict_vtable_pointers);
881 Opts.ForceEmitVTables = Args.hasArg(OPT_fforce_emit_vtables);
882 Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
883 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
884 Args.hasArg(OPT_cl_fast_relaxed_math);
885 Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
887 Opts.
ThreadModel = Args.getLastArgValue(OPT_mthread_model,
"posix");
889 Diags.
Report(diag::err_drv_invalid_value)
890 << Args.getLastArg(OPT_mthread_model)->getAsString(Args)
892 Opts.
TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
893 Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array);
895 Opts.FunctionSections = Args.hasFlag(OPT_ffunction_sections,
896 OPT_fno_function_sections,
false);
897 Opts.DataSections = Args.hasFlag(OPT_fdata_sections,
898 OPT_fno_data_sections,
false);
899 Opts.StackSizeSection =
900 Args.hasFlag(OPT_fstack_size_section, OPT_fno_stack_size_section,
false);
901 Opts.UniqueSectionNames = Args.hasFlag(OPT_funique_section_names,
902 OPT_fno_unique_section_names,
true);
904 Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);
906 Opts.NoUseJumpTables = Args.hasArg(OPT_fno_jump_tables);
908 Opts.NullPointerIsValid = Args.hasArg(OPT_fno_delete_null_pointer_checks);
910 Opts.ProfileSampleAccurate = Args.hasArg(OPT_fprofile_sample_accurate);
912 Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ);
913 Opts.PrepareForThinLTO =
false;
914 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
915 StringRef S = A->getValue();
917 Opts.PrepareForThinLTO =
true;
918 else if (S !=
"full")
919 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
921 Opts.LTOUnit = Args.hasFlag(OPT_flto_unit, OPT_fno_lto_unit,
false);
922 Opts.EnableSplitLTOUnit = Args.hasArg(OPT_fsplit_lto_unit);
923 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
925 Diags.
Report(diag::err_drv_argument_only_allowed_with)
926 << A->getAsString(Args) <<
"-x ir";
929 if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
931 llvm::StringSwitch<std::string>(A->getValue())
933 .Default(llvm::sys::path::filename(FrontendOpts.
OutputFile).str());
937 Opts.MSVolatile = Args.hasArg(OPT_fms_volatile);
939 Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops);
940 Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp);
944 Opts.
MainFileName = Args.getLastArgValue(OPT_main_file_name);
945 Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);
947 Opts.ControlFlowGuard = Args.hasArg(OPT_cfguard);
949 Opts.DisableGCov = Args.hasArg(OPT_test_coverage);
950 Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data);
951 Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes);
952 if (Opts.EmitGcovArcs || Opts.EmitGcovNotes) {
955 Opts.CoverageExtraChecksum = Args.hasArg(OPT_coverage_cfg_checksum);
956 Opts.CoverageNoFunctionNamesInData =
957 Args.hasArg(OPT_coverage_no_function_names_in_data);
959 Args.getLastArgValue(OPT_fprofile_filter_files_EQ);
961 Args.getLastArgValue(OPT_fprofile_exclude_files_EQ);
962 Opts.CoverageExitBlockBeforeBody =
963 Args.hasArg(OPT_coverage_exit_block_before_body);
964 if (Args.hasArg(OPT_coverage_version_EQ)) {
965 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
966 if (CoverageVersion.size() != 4) {
967 Diags.
Report(diag::err_drv_invalid_value)
968 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
976 if (Arg *A = Args.getLastArg(OPT_fembed_bitcode_EQ)) {
977 StringRef Name = A->getValue();
978 unsigned Model = llvm::StringSwitch<unsigned>(Name)
985 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
988 Opts.setEmbedBitcode(
989 static_cast<CodeGenOptions::EmbedBitcodeKind>(Model));
995 for (
const auto &A : Args) {
997 if (A->getOption().getID() == options::OPT_o ||
998 A->getOption().getID() == options::OPT_INPUT ||
999 A->getOption().getID() == options::OPT_x ||
1000 A->getOption().getID() == options::OPT_fembed_bitcode ||
1001 (A->getOption().getGroup().isValid() &&
1002 A->getOption().getGroup().getID() == options::OPT_W_Group))
1005 A->render(Args, ASL);
1006 for (
const auto &arg : ASL) {
1007 StringRef ArgStr(arg);
1008 Opts.
CmdArgs.insert(Opts.
CmdArgs.end(), ArgStr.begin(), ArgStr.end());
1015 Opts.PreserveVec3Type = Args.hasArg(OPT_fpreserve_vec3_type);
1016 Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
1017 Opts.InstrumentFunctionsAfterInlining =
1018 Args.hasArg(OPT_finstrument_functions_after_inlining);
1019 Opts.InstrumentFunctionEntryBare =
1020 Args.hasArg(OPT_finstrument_function_entry_bare);
1022 Opts.XRayInstrumentFunctions =
1023 Args.hasArg(OPT_fxray_instrument);
1024 Opts.XRayAlwaysEmitCustomEvents =
1025 Args.hasArg(OPT_fxray_always_emit_customevents);
1026 Opts.XRayAlwaysEmitTypedEvents =
1027 Args.hasArg(OPT_fxray_always_emit_typedevents);
1028 Opts.XRayInstructionThreshold =
1031 auto XRayInstrBundles =
1032 Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
1033 if (XRayInstrBundles.empty())
1036 for (
const auto &A : XRayInstrBundles)
1040 Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
1041 Opts.CallFEntry = Args.hasArg(OPT_mfentry);
1042 Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info);
1044 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
1045 StringRef Name = A->getValue();
1046 if (Name ==
"full") {
1047 Opts.CFProtectionReturn = 1;
1048 Opts.CFProtectionBranch = 1;
1049 }
else if (Name ==
"return")
1050 Opts.CFProtectionReturn = 1;
1051 else if (Name ==
"branch")
1052 Opts.CFProtectionBranch = 1;
1053 else if (Name !=
"none") {
1054 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1059 if (
const Arg *A = Args.getLastArg(OPT_compress_debug_sections,
1060 OPT_compress_debug_sections_EQ)) {
1061 if (A->getOption().getID() == OPT_compress_debug_sections) {
1063 Opts.setCompressDebugSections(llvm::DebugCompressionType::GNU);
1065 auto DCT = llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())
1067 .Case(
"zlib", llvm::DebugCompressionType::Z)
1068 .Case(
"zlib-gnu", llvm::DebugCompressionType::GNU)
1070 Opts.setCompressDebugSections(DCT);
1074 Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
1077 Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
1080 if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
1081 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
1089 Opts.SanitizeCoverageType =
1091 Opts.SanitizeCoverageIndirectCalls =
1092 Args.hasArg(OPT_fsanitize_coverage_indirect_calls);
1093 Opts.SanitizeCoverageTraceBB = Args.hasArg(OPT_fsanitize_coverage_trace_bb);
1094 Opts.SanitizeCoverageTraceCmp = Args.hasArg(OPT_fsanitize_coverage_trace_cmp);
1095 Opts.SanitizeCoverageTraceDiv = Args.hasArg(OPT_fsanitize_coverage_trace_div);
1096 Opts.SanitizeCoverageTraceGep = Args.hasArg(OPT_fsanitize_coverage_trace_gep);
1097 Opts.SanitizeCoverage8bitCounters =
1098 Args.hasArg(OPT_fsanitize_coverage_8bit_counters);
1099 Opts.SanitizeCoverageTracePC = Args.hasArg(OPT_fsanitize_coverage_trace_pc);
1100 Opts.SanitizeCoverageTracePCGuard =
1101 Args.hasArg(OPT_fsanitize_coverage_trace_pc_guard);
1102 Opts.SanitizeCoverageNoPrune = Args.hasArg(OPT_fsanitize_coverage_no_prune);
1103 Opts.SanitizeCoverageInline8bitCounters =
1104 Args.hasArg(OPT_fsanitize_coverage_inline_8bit_counters);
1105 Opts.SanitizeCoveragePCTable = Args.hasArg(OPT_fsanitize_coverage_pc_table);
1106 Opts.SanitizeCoverageStackDepth =
1107 Args.hasArg(OPT_fsanitize_coverage_stack_depth);
1108 Opts.SanitizeMemoryTrackOrigins =
1110 Opts.SanitizeMemoryUseAfterDtor =
1111 Args.hasFlag(OPT_fsanitize_memory_use_after_dtor,
1112 OPT_fno_sanitize_memory_use_after_dtor,
1114 Opts.SanitizeMinimalRuntime = Args.hasArg(OPT_fsanitize_minimal_runtime);
1115 Opts.SanitizeCfiCrossDso = Args.hasArg(OPT_fsanitize_cfi_cross_dso);
1116 Opts.SanitizeCfiICallGeneralizePointers =
1117 Args.hasArg(OPT_fsanitize_cfi_icall_generalize_pointers);
1118 Opts.SanitizeStats = Args.hasArg(OPT_fsanitize_stats);
1119 if (Arg *A = Args.getLastArg(
1120 OPT_fsanitize_address_poison_custom_array_cookie,
1121 OPT_fno_sanitize_address_poison_custom_array_cookie)) {
1122 Opts.SanitizeAddressPoisonCustomArrayCookie =
1123 A->getOption().getID() ==
1124 OPT_fsanitize_address_poison_custom_array_cookie;
1126 if (Arg *A = Args.getLastArg(OPT_fsanitize_address_use_after_scope,
1127 OPT_fno_sanitize_address_use_after_scope)) {
1128 Opts.SanitizeAddressUseAfterScope =
1129 A->getOption().getID() == OPT_fsanitize_address_use_after_scope;
1131 Opts.SanitizeAddressGlobalsDeadStripping =
1132 Args.hasArg(OPT_fsanitize_address_globals_dead_stripping);
1133 if (Arg *A = Args.getLastArg(OPT_fsanitize_address_use_odr_indicator,
1134 OPT_fno_sanitize_address_use_odr_indicator)) {
1135 Opts.SanitizeAddressUseOdrIndicator =
1136 A->getOption().getID() == OPT_fsanitize_address_use_odr_indicator;
1138 Opts.SSPBufferSize =
1140 Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
1141 if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
1142 StringRef Val = A->getValue();
1143 unsigned StackAlignment = Opts.StackAlignment;
1144 Val.getAsInteger(10, StackAlignment);
1145 Opts.StackAlignment = StackAlignment;
1148 if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) {
1149 StringRef Val = A->getValue();
1150 unsigned StackProbeSize = Opts.StackProbeSize;
1151 Val.getAsInteger(0, StackProbeSize);
1152 Opts.StackProbeSize = StackProbeSize;
1155 Opts.NoStackArgProbe = Args.hasArg(OPT_mno_stack_arg_probe);
1157 if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
1158 StringRef Name = A->getValue();
1159 unsigned Method = llvm::StringSwitch<unsigned>(Name)
1164 if (Method == ~0U) {
1165 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1168 Opts.setObjCDispatchMethod(
1169 static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method));
1174 if (Args.hasArg(OPT_fno_objc_convert_messages_to_runtime_calls))
1175 Opts.ObjCConvertMessagesToRuntimeCalls = 0;
1177 if (Args.getLastArg(OPT_femulated_tls) ||
1178 Args.getLastArg(OPT_fno_emulated_tls)) {
1179 Opts.ExplicitEmulatedTLS =
true;
1181 Args.hasFlag(OPT_femulated_tls, OPT_fno_emulated_tls,
false);
1184 if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) {
1185 StringRef Name = A->getValue();
1186 unsigned Model = llvm::StringSwitch<unsigned>(Name)
1193 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1196 Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model));
1200 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
1201 StringRef Val = A->getValue();
1204 else if (Val ==
"preserve-sign")
1206 else if (Val ==
"positive-zero")
1209 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
1212 if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) {
1213 if (A->getOption().matches(OPT_fpcc_struct_return)) {
1216 assert(A->getOption().matches(OPT_freg_struct_return));
1222 Opts.
LinkerOptions = Args.getAllArgValues(OPT_linker_option);
1223 bool NeedLocTracking =
false;
1225 Opts.
OptRecordFile = Args.getLastArgValue(OPT_opt_record_file);
1227 NeedLocTracking =
true;
1229 if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
1231 NeedLocTracking =
true;
1234 if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
1236 NeedLocTracking =
true;
1239 if (Arg *A = Args.getLastArg(OPT_Rpass_EQ)) {
1242 NeedLocTracking =
true;
1245 if (Arg *A = Args.getLastArg(OPT_Rpass_missed_EQ)) {
1248 NeedLocTracking =
true;
1251 if (Arg *A = Args.getLastArg(OPT_Rpass_analysis_EQ)) {
1254 NeedLocTracking =
true;
1257 Opts.DiagnosticsWithHotness =
1258 Args.hasArg(options::OPT_fdiagnostics_show_hotness);
1260 bool UsingProfile = UsingSampleProfile ||
1263 if (Opts.DiagnosticsWithHotness && !UsingProfile &&
1266 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
1267 <<
"-fdiagnostics-show-hotness";
1270 Args, options::OPT_fdiagnostics_hotness_threshold_EQ, 0);
1271 if (Opts.DiagnosticsHotnessThreshold > 0 && !UsingProfile)
1272 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
1273 <<
"-fdiagnostics-hotness-threshold=";
1278 if (UsingSampleProfile)
1279 NeedLocTracking =
true;
1291 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
1294 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
1298 Args.getLastArgValue(OPT_fcuda_include_gpubinary);
1300 Opts.Backchain = Args.hasArg(OPT_mbackchain);
1303 Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags);
1305 Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn,
true);
1307 Opts.Addrsig = Args.hasArg(OPT_faddrsig);
1309 if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
1310 StringRef SignScope = A->getValue();
1312 if (SignScope.equals_lower(
"none"))
1314 else if (SignScope.equals_lower(
"all"))
1316 else if (SignScope.equals_lower(
"non-leaf"))
1317 Opts.setSignReturnAddress(
1318 CodeGenOptions::SignReturnAddressScope::NonLeaf);
1320 Diags.
Report(diag::err_drv_invalid_value)
1321 << A->getAsString(Args) << SignScope;
1323 if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
1324 StringRef SignKey = A->getValue();
1325 if (!SignScope.empty() && !SignKey.empty()) {
1326 if (SignKey.equals_lower(
"a_key"))
1327 Opts.setSignReturnAddressKey(
1328 CodeGenOptions::SignReturnAddressKeyValue::AKey);
1329 else if (SignKey.equals_lower(
"b_key"))
1330 Opts.setSignReturnAddressKey(
1331 CodeGenOptions::SignReturnAddressKeyValue::BKey);
1333 Diags.
Report(diag::err_drv_invalid_value)
1334 << A->getAsString(Args) << SignKey;
1339 Opts.BranchTargetEnforcement = Args.hasArg(OPT_mbranch_target_enforce);
1341 Opts.KeepStaticConsts = Args.hasArg(OPT_fkeep_static_consts);
1343 Opts.SpeculativeLoadHardening = Args.hasArg(OPT_mspeculative_load_hardening);
1347 Opts.
PassPlugins = Args.getAllArgValues(OPT_fpass_plugin_EQ);
1349 Opts.
SymbolPartition = Args.getLastArgValue(OPT_fsymbol_partition_EQ);
1356 Opts.
OutputFile = Args.getLastArgValue(OPT_dependency_file);
1357 Opts.
Targets = Args.getAllArgValues(OPT_MT);
1364 if (Args.hasArg(OPT_show_includes)) {
1368 if (Args.hasArg(options::OPT_E) || Args.hasArg(options::OPT_P))
1375 Opts.
DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
1377 Args.getLastArgValue(OPT_module_dependency_dir);
1378 if (Args.hasArg(OPT_MV))
1383 Opts.
ExtraDeps = Args.getAllArgValues(OPT_fdepfile_entry);
1385 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
1386 StringRef Val = A->getValue();
1387 if (Val.find(
'=') == StringRef::npos)
1401 } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
1402 for (
auto *A : Args) {
1403 const Option &O = A->getOption();
1404 if (O.matches(options::OPT_fcolor_diagnostics) ||
1405 O.matches(options::OPT_fdiagnostics_color)) {
1406 ShowColors = Colors_On;
1407 }
else if (O.matches(options::OPT_fno_color_diagnostics) ||
1408 O.matches(options::OPT_fno_diagnostics_color)) {
1409 ShowColors = Colors_Off;
1410 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
1411 StringRef
Value(A->getValue());
1412 if (
Value ==
"always")
1413 ShowColors = Colors_On;
1414 else if (
Value ==
"never")
1415 ShowColors = Colors_Off;
1416 else if (
Value ==
"auto")
1417 ShowColors = Colors_Auto;
1420 return ShowColors == Colors_On ||
1421 (ShowColors == Colors_Auto &&
1422 llvm::sys::Process::StandardErrHasColors());
1427 bool Success =
true;
1428 for (
const auto &Prefix : VerifyPrefixes) {
1431 auto BadChar = llvm::find_if(Prefix, [](
char C) {
1434 if (BadChar != Prefix.end() || !
isLetter(Prefix[0])) {
1437 Diags->
Report(diag::err_drv_invalid_value) <<
"-verify=" << Prefix;
1438 Diags->
Report(diag::note_drv_verify_prefix_spelling);
1447 bool DefaultDiagColor,
bool DefaultShowOpt) {
1448 bool Success =
true;
1452 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
1454 Opts.IgnoreWarnings = Args.hasArg(OPT_w);
1455 Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
1456 Opts.Pedantic = Args.hasArg(OPT_pedantic);
1457 Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
1458 Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
1460 Opts.ShowColumn = Args.hasFlag(OPT_fshow_column,
1461 OPT_fno_show_column,
1463 Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info);
1464 Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);
1465 Opts.AbsolutePath = Args.hasArg(OPT_fdiagnostics_absolute_paths);
1466 Opts.ShowOptionNames =
1467 Args.hasFlag(OPT_fdiagnostics_show_option,
1468 OPT_fno_diagnostics_show_option, DefaultShowOpt);
1470 llvm::sys::Process::UseANSIEscapeCodes(Args.hasArg(OPT_fansi_escape_codes));
1473 Opts.ShowNoteIncludeStack =
false;
1474 if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack,
1475 OPT_fno_diagnostics_show_note_include_stack))
1476 if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))
1477 Opts.ShowNoteIncludeStack =
true;
1479 StringRef ShowOverloads =
1480 Args.getLastArgValue(OPT_fshow_overloads_EQ,
"all");
1481 if (ShowOverloads ==
"best")
1483 else if (ShowOverloads ==
"all")
1484 Opts.setShowOverloads(
Ovl_All);
1488 Diags->
Report(diag::err_drv_invalid_value)
1489 << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)
1493 StringRef ShowCategory =
1494 Args.getLastArgValue(OPT_fdiagnostics_show_category,
"none");
1495 if (ShowCategory ==
"none")
1496 Opts.ShowCategories = 0;
1497 else if (ShowCategory ==
"id")
1498 Opts.ShowCategories = 1;
1499 else if (ShowCategory ==
"name")
1500 Opts.ShowCategories = 2;
1504 Diags->
Report(diag::err_drv_invalid_value)
1505 << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)
1510 Args.getLastArgValue(OPT_fdiagnostics_format,
"clang");
1511 if (Format ==
"clang")
1513 else if (Format ==
"msvc")
1515 else if (Format ==
"msvc-fallback") {
1517 Opts.CLFallbackMode =
true;
1518 }
else if (Format ==
"vi")
1523 Diags->
Report(diag::err_drv_invalid_value)
1524 << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)
1528 Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
1529 Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
1530 Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);
1531 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
1533 if (Args.hasArg(OPT_verify))
1538 Opts.VerifyDiagnostics =
false;
1545 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ),
1547 if (Args.hasArg(OPT_verify_ignore_unexpected))
1549 Opts.setVerifyIgnoreUnexpected(DiagMask);
1550 Opts.ElideType = !Args.hasArg(OPT_fno_elide_type);
1551 Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);
1553 Opts.MacroBacktraceLimit =
1557 Args, OPT_ftemplate_backtrace_limit,
1560 Args, OPT_fconstexpr_backtrace_limit,
1563 Args, OPT_fspell_checking_limit,
1566 Args, OPT_fcaret_diagnostics_max_lines,
1573 Diags->
Report(diag::warn_ignoring_ftabstop_value)
1584 Opts.
WorkingDir = Args.getLastArgValue(OPT_working_directory);
1592 std::string &BlockName,
1593 unsigned &MajorVersion,
1594 unsigned &MinorVersion,
1596 std::string &UserInfo) {
1598 Arg.split(Args,
':', 5);
1599 if (Args.size() < 5)
1602 BlockName = Args[0];
1603 if (Args[1].getAsInteger(10, MajorVersion))
return true;
1604 if (Args[2].getAsInteger(10, MinorVersion))
return true;
1605 if (Args[3].getAsInteger(2, Hashed))
return true;
1606 if (Args.size() > 4)
1615 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
1616 switch (A->getOption().getID()) {
1618 llvm_unreachable(
"Invalid option in group!");
1621 case OPT_ast_dump_all_EQ:
1622 case OPT_ast_dump_EQ: {
1623 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
1631 Diags.
Report(diag::err_drv_invalid_value)
1632 << A->getAsString(Args) << A->getValue();
1638 case OPT_ast_dump_all:
1639 case OPT_ast_dump_lookups:
1645 case OPT_compiler_options_dump:
1647 case OPT_dump_raw_tokens:
1649 case OPT_dump_tokens:
1653 case OPT_emit_llvm_bc:
1659 case OPT_emit_llvm_only:
1661 case OPT_emit_codegen_only:
1670 case OPT_emit_module:
1672 case OPT_emit_module_interface:
1674 case OPT_emit_header_module:
1678 case OPT_emit_iterface_stubs: {
1680 llvm::StringSwitch<llvm::Optional<frontend::ActionKind>>(
1681 Args.hasArg(OPT_iterface_stub_version_EQ)
1682 ? Args.getLastArgValue(OPT_iterface_stub_version_EQ)
1684 .Case(
"experimental-yaml-elf-v1",
1686 .Case(
"experimental-tapi-elf-v1",
1690 Diags.
Report(diag::err_drv_invalid_value)
1691 <<
"Must specify a valid interface stub format type using " 1692 <<
"-interface-stub-version=<experimental-tapi-elf-v1 | " 1693 "experimental-yaml-elf-v1>";
1699 case OPT_fsyntax_only:
1701 case OPT_module_file_info:
1703 case OPT_verify_pch:
1705 case OPT_print_preamble:
1709 case OPT_templight_dump:
1711 case OPT_rewrite_macros:
1713 case OPT_rewrite_objc:
1715 case OPT_rewrite_test:
1723 case OPT_print_dependency_directives_minimized_source:
1730 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
1731 Opts.
Plugins.emplace_back(A->getValue(0));
1736 for (
const auto *AA : Args.filtered(OPT_plugin_arg))
1737 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
1739 for (
const std::string &Arg :
1740 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
1741 std::string BlockName;
1742 unsigned MajorVersion;
1743 unsigned MinorVersion;
1745 std::string UserInfo;
1747 MinorVersion, Hashed, UserInfo)) {
1748 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
1755 std::make_shared<TestModuleFileExtension>(
1756 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
1759 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
1763 Diags.
Report(diag::err_drv_invalid_value)
1764 << A->getAsString(Args) << A->getValue();
1768 Opts.
OutputFile = Args.getLastArgValue(OPT_o);
1769 Opts.
Plugins = Args.getAllArgValues(OPT_load);
1771 Opts.
ShowHelp = Args.hasArg(OPT_help);
1772 Opts.
ShowStats = Args.hasArg(OPT_print_stats);
1773 Opts.
ShowTimers = Args.hasArg(OPT_ftime_report);
1775 Opts.
TimeTrace = Args.hasArg(OPT_ftime_trace);
1778 Opts.
LLVMArgs = Args.getAllArgValues(OPT_mllvm);
1783 Opts.
ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
1784 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
1785 Opts.
ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter);
1789 Opts.
ModuleMapFiles = Args.getAllArgValues(OPT_fmodule_map_file);
1791 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
1792 StringRef Val = A->getValue();
1793 if (Val.find(
'=') == StringRef::npos)
1801 = Args.hasArg(OPT_code_completion_macros);
1803 = Args.hasArg(OPT_code_completion_patterns);
1805 = !Args.hasArg(OPT_no_code_completion_globals);
1807 = !Args.hasArg(OPT_no_code_completion_ns_level_decls);
1809 = Args.hasArg(OPT_code_completion_brief_comments);
1811 = Args.hasArg(OPT_code_completion_with_fixits);
1814 = Args.getLastArgValue(OPT_foverride_record_layout_EQ);
1815 Opts.
AuxTriple = Args.getLastArgValue(OPT_aux_triple);
1816 Opts.
StatsFile = Args.getLastArgValue(OPT_stats_file);
1818 if (
const Arg *A = Args.getLastArg(OPT_arcmt_check,
1820 OPT_arcmt_migrate)) {
1821 switch (A->getOption().getID()) {
1823 llvm_unreachable(
"missed a case");
1824 case OPT_arcmt_check:
1827 case OPT_arcmt_modify:
1830 case OPT_arcmt_migrate:
1835 Opts.
MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory);
1837 = Args.getLastArgValue(OPT_arcmt_migrate_report_output);
1839 = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
1841 if (Args.hasArg(OPT_objcmt_migrate_literals))
1843 if (Args.hasArg(OPT_objcmt_migrate_subscripting))
1845 if (Args.hasArg(OPT_objcmt_migrate_property_dot_syntax))
1847 if (Args.hasArg(OPT_objcmt_migrate_property))
1849 if (Args.hasArg(OPT_objcmt_migrate_readonly_property))
1851 if (Args.hasArg(OPT_objcmt_migrate_readwrite_property))
1853 if (Args.hasArg(OPT_objcmt_migrate_annotation))
1855 if (Args.hasArg(OPT_objcmt_returns_innerpointer_property))
1857 if (Args.hasArg(OPT_objcmt_migrate_instancetype))
1859 if (Args.hasArg(OPT_objcmt_migrate_nsmacros))
1861 if (Args.hasArg(OPT_objcmt_migrate_protocol_conformance))
1863 if (Args.hasArg(OPT_objcmt_atomic_property))
1865 if (Args.hasArg(OPT_objcmt_ns_nonatomic_iosonly))
1867 if (Args.hasArg(OPT_objcmt_migrate_designated_init))
1869 if (Args.hasArg(OPT_objcmt_migrate_all))
1876 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1877 <<
"ARC migration" <<
"ObjC migration";
1881 if (
const Arg *A = Args.getLastArg(OPT_x)) {
1882 StringRef XValue = A->getValue();
1886 bool Preprocessed = XValue.consume_back(
"-cpp-output");
1887 bool ModuleMap = XValue.consume_back(
"-module-map");
1889 !Preprocessed && !ModuleMap && XValue.consume_back(
"-header");
1892 DashX = llvm::StringSwitch<InputKind>(XValue)
1905 if (DashX.
isUnknown() && Preprocessed && !IsHeaderFile && !ModuleMap)
1906 DashX = llvm::StringSwitch<InputKind>(XValue)
1913 DashX = llvm::StringSwitch<InputKind>(XValue)
1916 .Cases(
"ast",
"pcm",
1922 Diags.
Report(diag::err_drv_invalid_value)
1923 << A->getAsString(Args) << A->getValue();
1932 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
1935 Inputs.push_back(
"-");
1936 for (
unsigned i = 0, e = Inputs.size();
i != e; ++
i) {
1940 StringRef(Inputs[
i]).rsplit(
'.').second);
1954 Opts.
Inputs.emplace_back(std::move(Inputs[
i]), IK);
1962 std::string ClangExecutable =
1963 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
1964 return Driver::GetResourcesPath(ClangExecutable, CLANG_RESOURCE_DIR);
1968 const std::string &WorkingDir) {
1969 Opts.
Sysroot = Args.getLastArgValue(OPT_isysroot,
"/");
1970 Opts.
Verbose = Args.hasArg(OPT_v);
1974 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
1975 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
1976 Opts.
ResourceDir = Args.getLastArgValue(OPT_resource_dir);
1980 if (!(
P.empty() || llvm::sys::path::is_absolute(
P))) {
1981 if (WorkingDir.empty())
1982 llvm::sys::fs::make_absolute(
P);
1984 llvm::sys::fs::make_absolute(WorkingDir,
P);
1986 llvm::sys::path::remove_dots(
P);
1991 for (
const auto *A : Args.filtered(OPT_fmodule_file)) {
1992 StringRef Val = A->getValue();
1993 if (Val.find(
'=') != StringRef::npos)
1996 for (
const auto *A : Args.filtered(OPT_fprebuilt_module_path))
2001 !Args.hasArg(OPT_fmodules_disable_diagnostic_validation);
2009 Args.hasArg(OPT_fmodules_validate_once_per_build_session);
2013 Args.hasArg(OPT_fmodules_validate_system_headers);
2014 if (
const Arg *A = Args.getLastArg(OPT_fmodule_format_EQ))
2017 for (
const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
2018 StringRef MacroDef = A->getValue();
2020 llvm::CachedHashString(MacroDef.split(
'=').first));
2024 bool IsIndexHeaderMap =
false;
2025 bool IsSysrootSpecified =
2026 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
2027 for (
const auto *A : Args.filtered(OPT_I, OPT_F, OPT_index_header_map)) {
2028 if (A->getOption().matches(OPT_index_header_map)) {
2030 IsIndexHeaderMap =
true;
2037 bool IsFramework = A->getOption().matches(OPT_F);
2038 std::string Path = A->getValue();
2040 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
2042 llvm::sys::path::append(Buffer, Opts.
Sysroot,
2043 llvm::StringRef(A->getValue()).substr(1));
2044 Path = Buffer.str();
2047 Opts.
AddPath(Path, Group, IsFramework,
2049 IsIndexHeaderMap =
false;
2053 StringRef Prefix =
"";
2054 for (
const auto *A :
2055 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
2056 if (A->getOption().matches(OPT_iprefix))
2057 Prefix = A->getValue();
2058 else if (A->getOption().matches(OPT_iwithprefix))
2064 for (
const auto *A : Args.filtered(OPT_idirafter))
2066 for (
const auto *A : Args.filtered(OPT_iquote))
2068 for (
const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot))
2070 !A->getOption().matches(OPT_iwithsysroot));
2071 for (
const auto *A : Args.filtered(OPT_iframework))
2073 for (
const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
2078 for (
const auto *A : Args.filtered(OPT_c_isystem))
2080 for (
const auto *A : Args.filtered(OPT_cxx_isystem))
2082 for (
const auto *A : Args.filtered(OPT_objc_isystem))
2084 for (
const auto *A : Args.filtered(OPT_objcxx_isystem))
2088 for (
const auto *A :
2089 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
2091 if (A->getOption().matches(OPT_internal_externc_isystem))
2093 Opts.
AddPath(A->getValue(), Group,
false,
true);
2097 for (
const auto *A :
2098 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
2100 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
2102 for (
const auto *A : Args.filtered(OPT_ivfsoverlay))
2107 const llvm::Triple &T,
2118 Opts.AsmPreprocessor = 1;
2128 llvm_unreachable(
"Invalid input kind!");
2130 LangStd = LangStandard::lang_opencl10;
2133 LangStd = LangStandard::lang_cuda;
2137 #if defined(CLANG_DEFAULT_STD_C) 2138 LangStd = CLANG_DEFAULT_STD_C;
2142 LangStd = LangStandard::lang_gnu99;
2144 LangStd = LangStandard::lang_gnu11;
2148 #if defined(CLANG_DEFAULT_STD_C) 2149 LangStd = CLANG_DEFAULT_STD_C;
2151 LangStd = LangStandard::lang_gnu11;
2156 #if defined(CLANG_DEFAULT_STD_CXX) 2157 LangStd = CLANG_DEFAULT_STD_CXX;
2159 LangStd = LangStandard::lang_gnucxx14;
2163 LangStd = LangStandard::lang_c99;
2166 LangStd = LangStandard::lang_hip;
2173 Opts.C99 = Std.
isC99();
2174 Opts.C11 = Std.
isC11();
2175 Opts.C17 = Std.
isC17();
2176 Opts.C2x = Std.
isC2x();
2184 Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus;
2190 if (LangStd == LangStandard::lang_opencl10)
2191 Opts.OpenCLVersion = 100;
2192 else if (LangStd == LangStandard::lang_opencl11)
2193 Opts.OpenCLVersion = 110;
2194 else if (LangStd == LangStandard::lang_opencl12)
2195 Opts.OpenCLVersion = 120;
2196 else if (LangStd == LangStandard::lang_opencl20)
2197 Opts.OpenCLVersion = 200;
2198 else if (LangStd == LangStandard::lang_openclcpp)
2199 Opts.OpenCLCPlusPlusVersion = 100;
2205 Opts.LaxVectorConversions = 0;
2207 Opts.NativeHalfType = 1;
2208 Opts.NativeHalfArgsAndReturns = 1;
2209 Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
2212 if (Opts.IncludeDefaultHeader) {
2213 if (Opts.DeclareOpenCLBuiltins) {
2215 PPOpts.
Includes.push_back(
"opencl-c-base.h");
2217 PPOpts.
Includes.push_back(
"opencl-c.h");
2229 if (Opts.RenderScript) {
2230 Opts.NativeHalfType = 1;
2231 Opts.NativeHalfArgsAndReturns = 1;
2235 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
2238 Opts.Half = Opts.OpenCL;
2241 Opts.WChar = Opts.CPlusPlus;
2243 Opts.GNUKeywords = Opts.GNUMode;
2244 Opts.CXXOperatorNames = Opts.CPlusPlus;
2246 Opts.AlignedAllocation = Opts.CPlusPlus17;
2248 Opts.DollarIdents = !Opts.AsmPreprocessor;
2251 Opts.DoubleSquareBracketAttributes = Opts.CPlusPlus11 || Opts.C2x;
2257 StringRef value = arg->getValue();
2258 if (value ==
"default") {
2260 }
else if (value ==
"hidden" || value ==
"internal") {
2262 }
else if (value ==
"protected") {
2267 diags.
Report(diag::err_drv_invalid_value)
2268 << arg->getAsString(args) << value;
2278 llvm_unreachable(
"should not parse language flags for this input");
2308 llvm_unreachable(
"unexpected input language");
2317 return "Objective-C";
2321 return "Objective-C++";
2327 return "RenderScript";
2339 llvm_unreachable(
"unknown input language");
2348 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
2349 LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
2351 .Case(
name, LangStandard::lang_##
id)
2352 #define LANGSTANDARD_ALIAS(id, alias) \ 2353 .Case(alias, LangStandard::lang_##id) 2354 #include "clang/Frontend/LangStandards.def" 2357 Diags.
Report(diag::err_drv_invalid_value)
2358 << A->getAsString(Args) << A->getValue();
2360 for (
unsigned KindValue = 0;
2364 static_cast<LangStandard::Kind>(KindValue));
2366 auto Diag = Diags.
Report(diag::note_drv_use_standard);
2368 unsigned NumAliases = 0;
2369 #define LANGSTANDARD(id, name, lang, desc, features) 2370 #define LANGSTANDARD_ALIAS(id, alias) \ 2371 if (KindValue == LangStandard::lang_##id) ++NumAliases; 2372 #define LANGSTANDARD_ALIAS_DEPR(id, alias) 2373 #include "clang/Frontend/LangStandards.def" 2375 #define LANGSTANDARD(id, name, lang, desc, features) 2376 #define LANGSTANDARD_ALIAS(id, alias) \ 2377 if (KindValue == LangStandard::lang_##id) Diag << alias; 2378 #define LANGSTANDARD_ALIAS_DEPR(id, alias) 2379 #include "clang/Frontend/LangStandards.def" 2387 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2393 if (Args.hasArg(OPT_fno_dllexport_inlines))
2394 Opts.DllExportInlines =
false;
2396 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2397 StringRef Name = A->getValue();
2398 if (Name ==
"full" || Name ==
"branch") {
2399 Opts.CFProtectionBranch = 1;
2404 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
2406 = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
2407 .Cases(
"cl",
"CL", LangStandard::lang_opencl10)
2408 .Cases(
"cl1.1",
"CL1.1", LangStandard::lang_opencl11)
2409 .Cases(
"cl1.2",
"CL1.2", LangStandard::lang_opencl12)
2410 .Cases(
"cl2.0",
"CL2.0", LangStandard::lang_opencl20)
2411 .Cases(
"clc++",
"CLC++", LangStandard::lang_openclcpp)
2415 Diags.
Report(diag::err_drv_invalid_value)
2416 << A->getAsString(Args) << A->getValue();
2419 LangStd = OpenCLLangStd;
2422 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
2423 Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
2425 llvm::Triple T(TargetOpts.
Triple);
2431 if (Args.getLastArg(OPT_cl_strict_aliasing)
2432 && Opts.OpenCLVersion > 100) {
2433 Diags.
Report(diag::warn_option_invalid_ocl_version)
2435 << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
2443 Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
2446 Opts.Digraphs = Args.hasFlag(OPT_fdigraphs, OPT_fno_digraphs, Opts.Digraphs);
2448 if (Args.hasArg(OPT_fno_operator_names))
2449 Opts.CXXOperatorNames = 0;
2451 if (Args.hasArg(OPT_fcuda_is_device))
2452 Opts.CUDAIsDevice = 1;
2454 if (Args.hasArg(OPT_fcuda_allow_variadic_functions))
2455 Opts.CUDAAllowVariadicFunctions = 1;
2457 if (Args.hasArg(OPT_fno_cuda_host_device_constexpr))
2458 Opts.CUDAHostDeviceConstexpr = 0;
2460 if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_approx_transcendentals))
2461 Opts.CUDADeviceApproxTranscendentals = 1;
2463 Opts.GPURelocatableDeviceCode = Args.hasArg(OPT_fgpu_rdc);
2466 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
2467 StringRef value = arg->getValue();
2469 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
2472 if (Args.hasArg(OPT_fobjc_gc_only))
2474 else if (Args.hasArg(OPT_fobjc_gc))
2476 else if (Args.hasArg(OPT_fobjc_arc)) {
2477 Opts.ObjCAutoRefCount = 1;
2479 Diags.
Report(diag::err_arc_unsupported_on_runtime);
2486 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
2487 Opts.ObjCWeakRuntime = 1;
2493 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
2494 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
2495 assert(!Opts.ObjCWeak);
2497 Diags.
Report(diag::err_objc_weak_with_gc);
2498 }
else if (!Opts.ObjCWeakRuntime) {
2499 Diags.
Report(diag::err_objc_weak_unsupported);
2503 }
else if (Opts.ObjCAutoRefCount) {
2504 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
2507 if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
2508 Opts.ObjCInferRelatedResultType = 0;
2510 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
2511 Opts.ObjCSubscriptingLegacyRuntime =
2515 if (Args.hasArg(OPT_fgnu89_inline)) {
2517 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2523 if (Args.hasArg(OPT_fapple_kext)) {
2524 if (!Opts.CPlusPlus)
2525 Diags.
Report(diag::warn_c_kext);
2530 if (Args.hasArg(OPT_print_ivar_layout))
2531 Opts.ObjCGCBitmapPrint = 1;
2533 if (Args.hasArg(OPT_fno_constant_cfstrings))
2534 Opts.NoConstantCFStrings = 1;
2535 if (
const auto *A = Args.getLastArg(OPT_fcf_runtime_abi_EQ))
2537 llvm::StringSwitch<LangOptions::CoreFoundationABI>(A->getValue())
2538 .Cases(
"unspecified",
"standalone",
"objc",
2540 .Cases(
"swift",
"swift-5.0",
2546 if (Args.hasArg(OPT_fzvector))
2549 if (Args.hasArg(OPT_pthread))
2550 Opts.POSIXThreads = 1;
2553 if (Arg *visOpt = Args.getLastArg(OPT_fvisibility)) {
2560 if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) {
2563 Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode());
2566 if (Args.hasArg(OPT_fvisibility_inlines_hidden))
2567 Opts.InlineVisibilityHidden = 1;
2569 if (Args.hasArg(OPT_fvisibility_global_new_delete_hidden))
2570 Opts.GlobalAllocationFunctionVisibilityHidden = 1;
2572 if (Args.hasArg(OPT_fapply_global_visibility_to_externs))
2573 Opts.SetVisibilityForExternDecls = 1;
2575 if (Args.hasArg(OPT_ftrapv)) {
2579 Args.getLastArgValue(OPT_ftrapv_handler);
2581 else if (Args.hasArg(OPT_fwrapv))
2584 Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility);
2585 Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions);
2586 Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt;
2587 Opts.MSCompatibilityVersion = 0;
2588 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
2590 if (VT.tryParse(A->getValue()))
2591 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
2593 Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
2594 VT.getMinor().getValueOr(0) * 100000 +
2595 VT.getSubminor().getValueOr(0);
2601 Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17;
2603 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
2605 Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
2606 OPT_fno_dollars_in_identifiers,
2608 Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
2610 Opts.Borland = Args.hasArg(OPT_fborland_extensions);
2611 Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
2612 Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
2614 if (Args.hasArg(OPT_fno_lax_vector_conversions))
2615 Opts.LaxVectorConversions = 0;
2616 if (Args.hasArg(OPT_fno_threadsafe_statics))
2617 Opts.ThreadsafeStatics = 0;
2618 Opts.Exceptions = Args.hasArg(OPT_fexceptions);
2619 Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
2620 Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
2624 Args.hasFlag(OPT_ffixed_point, OPT_fno_fixed_point,
false) &&
2626 Opts.PaddingOnUnsignedFixedPoint =
2627 Args.hasFlag(OPT_fpadding_on_unsigned_fixed_point,
2628 OPT_fno_padding_on_unsigned_fixed_point,
2633 Arg *A = Args.getLastArg(options::OPT_fsjlj_exceptions,
2634 options::OPT_fseh_exceptions,
2635 options::OPT_fdwarf_exceptions);
2637 const Option &Opt = A->getOption();
2638 llvm::Triple T(TargetOpts.
Triple);
2639 if (T.isWindowsMSVCEnvironment())
2640 Diags.
Report(diag::err_fe_invalid_exception_model)
2641 << Opt.getName() << T.str();
2643 Opts.SjLjExceptions = Opt.matches(options::OPT_fsjlj_exceptions);
2644 Opts.SEHExceptions = Opt.matches(options::OPT_fseh_exceptions);
2645 Opts.DWARFExceptions = Opt.matches(options::OPT_fdwarf_exceptions);
2648 Opts.ExternCNoUnwind = Args.hasArg(OPT_fexternc_nounwind);
2649 Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
2651 Opts.RTTI = Opts.CPlusPlus && !Args.hasArg(OPT_fno_rtti);
2652 Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data);
2653 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
2654 && Opts.OpenCLVersion == 200);
2655 Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
2656 Opts.Coroutines = Opts.CPlusPlus2a || Args.hasArg(OPT_fcoroutines_ts);
2658 Opts.DoubleSquareBracketAttributes =
2659 Args.hasFlag(OPT_fdouble_square_bracket_attributes,
2660 OPT_fno_double_square_bracket_attributes,
2661 Opts.DoubleSquareBracketAttributes);
2663 Opts.CPlusPlusModules = Opts.CPlusPlus2a;
2664 Opts.ModulesTS = Args.hasArg(OPT_fmodules_ts);
2666 Args.hasArg(OPT_fmodules) || Opts.ModulesTS || Opts.CPlusPlusModules;
2667 Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse);
2668 Opts.ModulesDeclUse =
2669 Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse;
2672 Opts.ModulesLocalVisibility =
2673 Args.hasArg(OPT_fmodules_local_submodule_visibility) || Opts.ModulesTS ||
2674 Opts.CPlusPlusModules;
2675 Opts.ModulesCodegen = Args.hasArg(OPT_fmodules_codegen);
2676 Opts.ModulesDebugInfo = Args.hasArg(OPT_fmodules_debuginfo);
2677 Opts.ModulesSearchAll = Opts.Modules &&
2678 !Args.hasArg(OPT_fno_modules_search_all) &&
2679 Args.hasArg(OPT_fmodules_search_all);
2680 Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery);
2681 Opts.ImplicitModules = !Args.hasArg(OPT_fno_implicit_modules);
2682 Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);
2683 Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);
2684 Opts.Char8 = Args.hasFlag(OPT_fchar8__t, OPT_fno_char8__t, Opts.CPlusPlus2a);
2685 if (
const Arg *A = Args.getLastArg(OPT_fwchar_type_EQ)) {
2686 Opts.WCharSize = llvm::StringSwitch<unsigned>(A->getValue())
2691 if (Opts.WCharSize == 0)
2692 Diags.
Report(diag::err_fe_invalid_wchar_type) << A->getValue();
2694 Opts.WCharIsSigned = Args.hasFlag(OPT_fsigned_wchar, OPT_fno_signed_wchar,
true);
2695 Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
2696 Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
2697 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
2698 if (!Opts.NoBuiltin)
2700 Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);
2701 Opts.RelaxedTemplateTemplateArgs =
2702 Args.hasArg(OPT_frelaxed_template_template_args);
2703 Opts.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation);
2704 Opts.AlignedAllocation =
2705 Args.hasFlag(OPT_faligned_allocation, OPT_fno_aligned_allocation,
2706 Opts.AlignedAllocation);
2707 Opts.AlignedAllocationUnavailable =
2708 Opts.AlignedAllocation && Args.hasArg(OPT_aligned_alloc_unavailable);
2709 Opts.NewAlignOverride =
2711 if (Opts.NewAlignOverride && !llvm::isPowerOf2_32(Opts.NewAlignOverride)) {
2712 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
2713 Diags.
Report(diag::err_fe_invalid_alignment) << A->getAsString(Args)
2715 Opts.NewAlignOverride = 0;
2717 Opts.ConceptsTS = Args.hasArg(OPT_fconcepts_ts);
2718 Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
2719 Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
2720 Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
2721 Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno);
2722 Opts.InstantiationDepth =
2726 Opts.ConstexprCallDepth =
2728 Opts.ConstexprStepLimit =
2731 Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing);
2732 Opts.NumLargeByValueCopy =
2734 Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
2736 Args.getLastArgValue(OPT_fconstant_string_class);
2737 Opts.ObjCDefaultSynthProperties =
2738 !Args.hasArg(OPT_disable_objc_default_synthesize_properties);
2739 Opts.EncodeExtendedBlockSig =
2740 Args.hasArg(OPT_fencode_extended_block_signature);
2741 Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
2744 Opts.AlignDouble = Args.hasArg(OPT_malign_double);
2745 Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128)
2747 : Args.hasArg(OPT_mlong_double_64) ? 64 : 0;
2748 Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble);
2750 Opts.ROPI = Args.hasArg(OPT_fropi);
2751 Opts.RWPI = Args.hasArg(OPT_frwpi);
2752 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
2753 Opts.Static = Args.hasArg(OPT_static_define);
2754 Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
2755 Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple
2756 || Args.hasArg(OPT_fdump_record_layouts);
2757 Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
2758 Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
2759 Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
2760 Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant);
2761 Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math);
2762 Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat);
2763 Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
2764 Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
2765 Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
2766 Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
2767 Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
2768 Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
2769 Opts.
ModuleName = Args.getLastArgValue(OPT_fmodule_name_EQ);
2771 Opts.AppExt = Args.hasArg(OPT_fapplication_extension);
2774 Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
2775 Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
2778 Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
2779 | Opts.NativeHalfArgsAndReturns;
2780 Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
2781 Opts.Cmse = Args.hasArg(OPT_mcmse);
2791 Opts.DeclSpecKeyword =
2792 Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec,
2793 (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA));
2795 if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) {
2796 switch (llvm::StringSwitch<unsigned>(A->getValue())
2802 Diags.
Report(diag::err_drv_invalid_value)
2803 <<
"-faddress-space-map-mangling=" << A->getValue();
2817 if (Arg *A = Args.getLastArg(OPT_fms_memptr_rep_EQ)) {
2819 llvm::StringSwitch<LangOptions::PragmaMSPointersToMembersKind>(
2829 Diags.
Report(diag::err_drv_invalid_value)
2830 <<
"-fms-memptr-rep=" << A->getValue();
2832 Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel);
2836 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
2838 llvm::StringSwitch<LangOptions::DefaultCallingConvention>(A->getValue())
2846 Diags.
Report(diag::err_drv_invalid_value)
2847 <<
"-fdefault-calling-conv=" << A->getValue();
2849 llvm::Triple T(TargetOpts.
Triple);
2850 llvm::Triple::ArchType Arch = T.getArch();
2853 Arch != llvm::Triple::x86;
2856 !(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64);
2858 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2859 << A->getSpelling() << T.getTriple();
2861 Opts.setDefaultCallingConv(DefaultCC);
2865 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
2867 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2868 << A->getSpelling() <<
"-fdefault-calling-conv";
2870 llvm::Triple T(TargetOpts.
Triple);
2871 if (T.getArch() != llvm::Triple::x86)
2872 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2873 << A->getSpelling() << T.getTriple();
2880 Opts.OpenMP = Args.hasArg(options::OPT_fopenmp) ? 1 : 0;
2882 bool IsSimdSpecified =
2883 Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
2885 Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
2887 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
2888 Opts.OpenMPIsDevice =
2889 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_device);
2890 bool IsTargetSpecified =
2891 Opts.OpenMPIsDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ);
2893 if (Opts.OpenMP || Opts.OpenMPSimd) {
2895 Args, OPT_fopenmp_version_EQ,
2896 (IsSimdSpecified || IsTargetSpecified) ? 45 : Opts.OpenMP, Diags))
2897 Opts.OpenMP = Version;
2898 else if (IsSimdSpecified || IsTargetSpecified)
2902 if (!Opts.OpenMPIsDevice) {
2903 switch (T.getArch()) {
2907 case llvm::Triple::nvptx:
2908 case llvm::Triple::nvptx64:
2909 Diags.
Report(diag::err_drv_omp_host_target_not_supported)
2918 if ((Opts.OpenMPIsDevice && T.isNVPTX()) || Opts.OpenCLCPlusPlus) {
2919 Opts.Exceptions = 0;
2920 Opts.CXXExceptions = 0;
2922 if (Opts.OpenMPIsDevice && T.isNVPTX()) {
2923 Opts.OpenMPCUDANumSMs =
2925 Opts.OpenMPCUDANumSMs, Diags);
2926 Opts.OpenMPCUDABlocksPerSM =
2928 Opts.OpenMPCUDABlocksPerSM, Diags);
2930 Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
2931 Opts.OpenMPCUDAReductionBufNum, Diags);
2936 Opts.OpenMPOptimisticCollapse =
2937 Args.hasArg(options::OPT_fopenmp_optimistic_collapse) ? 1 : 0;
2940 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
2942 for (
unsigned i = 0;
i < A->getNumValues(); ++
i) {
2943 llvm::Triple TT(A->getValue(
i));
2945 if (TT.getArch() == llvm::Triple::UnknownArch ||
2946 !(TT.getArch() == llvm::Triple::ppc ||
2947 TT.getArch() == llvm::Triple::ppc64 ||
2948 TT.getArch() == llvm::Triple::ppc64le ||
2949 TT.getArch() == llvm::Triple::nvptx ||
2950 TT.getArch() == llvm::Triple::nvptx64 ||
2951 TT.getArch() == llvm::Triple::x86 ||
2952 TT.getArch() == llvm::Triple::x86_64))
2953 Diags.
Report(diag::err_drv_invalid_omp_target) << A->getValue(
i);
2961 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) {
2964 Diags.
Report(diag::err_drv_omp_host_ir_file_not_found)
2968 Opts.SYCLIsDevice = Args.hasArg(options::OPT_fsycl_is_device);
2971 Opts.OpenMPCUDAMode = Opts.OpenMPIsDevice && T.isNVPTX() &&
2972 Args.hasArg(options::OPT_fopenmp_cuda_mode);
2975 Opts.OpenMPCUDAForceFullRuntime =
2976 Opts.OpenMPIsDevice && T.isNVPTX() &&
2977 Args.hasArg(options::OPT_fopenmp_cuda_force_full_runtime);
2980 Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
2981 OPT_fno_deprecated_macro,
2987 Opts.Optimize = Opt != 0;
2988 Opts.OptimizeSize = OptSize != 0;
2993 Opts.NoInlineDefine = !Opts.Optimize;
2994 if (Arg *InlineArg = Args.getLastArg(
2995 options::OPT_finline_functions, options::OPT_finline_hint_functions,
2996 options::OPT_fno_inline_functions, options::OPT_fno_inline))
2997 if (InlineArg->getOption().matches(options::OPT_fno_inline))
2998 Opts.NoInlineDefine =
true;
3000 Opts.FastMath = Args.hasArg(OPT_ffast_math) ||
3001 Args.hasArg(OPT_cl_fast_relaxed_math);
3002 Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) ||
3003 Args.hasArg(OPT_cl_finite_math_only) ||
3004 Args.hasArg(OPT_cl_fast_relaxed_math);
3005 Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
3006 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
3007 Args.hasArg(OPT_cl_fast_relaxed_math);
3009 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
3010 StringRef Val = A->getValue();
3013 else if (Val ==
"on")
3015 else if (Val ==
"off")
3018 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
3021 Opts.RetainCommentsFromSystemHeaders =
3022 Args.hasArg(OPT_fretain_comments_from_system_headers);
3027 Diags.
Report(diag::err_drv_invalid_value)
3028 << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
3036 if (Arg *A = Args.getLastArg(OPT_ftrivial_auto_var_init)) {
3037 StringRef Val = A->getValue();
3038 if (Val ==
"uninitialized")
3039 Opts.setTrivialAutoVarInit(
3041 else if (Val ==
"zero")
3043 else if (Val ==
"pattern")
3046 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
3053 Opts.SanitizeAddressFieldPadding =
3058 Opts.XRayInstrument =
3059 Args.hasFlag(OPT_fxray_instrument, OPT_fnoxray_instrument,
false);
3062 Opts.XRayAlwaysEmitCustomEvents =
3063 Args.hasFlag(OPT_fxray_always_emit_customevents,
3064 OPT_fnoxray_always_emit_customevents,
false);
3067 Opts.XRayAlwaysEmitTypedEvents =
3068 Args.hasFlag(OPT_fxray_always_emit_typedevents,
3069 OPT_fnoxray_always_emit_customevents,
false);
3073 Args.getAllArgValues(OPT_fxray_always_instrument);
3075 Args.getAllArgValues(OPT_fxray_never_instrument);
3079 Opts.ForceEmitVTables = Args.hasArg(OPT_fforce_emit_vtables);
3082 Opts.AllowEditorPlaceholders = Args.hasArg(OPT_fallow_editor_placeholders);
3084 Opts.RegisterStaticDestructors = !Args.hasArg(OPT_fno_cxx_static_destructors);
3086 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
3089 StringRef Ver = A->getValue();
3090 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
3091 unsigned Major, Minor = 0;
3095 if (!VerParts.first.startswith(
"0") &&
3096 !VerParts.first.getAsInteger(10, Major) &&
3097 3 <= Major && Major <= CLANG_VERSION_MAJOR &&
3098 (Major == 3 ? VerParts.second.size() == 1 &&
3099 !VerParts.second.getAsInteger(10, Minor)
3100 : VerParts.first.size() == Ver.size() ||
3101 VerParts.second ==
"0")) {
3103 if (Major == 3 && Minor <= 8)
3105 else if (Major <= 4)
3107 else if (Major <= 6)
3109 else if (Major <= 7)
3111 }
else if (Ver !=
"latest") {
3112 Diags.
Report(diag::err_drv_invalid_value)
3113 << A->getAsString(Args) << A->getValue();
3117 Opts.CompleteMemberPointers = Args.hasArg(OPT_fcomplete_member_pointers);
3118 Opts.BuildingPCHWithObjectFile = Args.hasArg(OPT_building_pch_with_obj);
3163 llvm_unreachable(
"invalid frontend action");
3170 Opts.
PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
3171 Args.hasArg(OPT_pch_through_hdrstop_use);
3175 Opts.
DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record);
3180 for (
const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
3183 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
3184 StringRef
Value(A->getValue());
3187 unsigned EndOfLine = 0;
3189 if (Comma == StringRef::npos ||
3190 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
3191 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
3192 Diags.
Report(diag::err_drv_preamble_format);
3200 if (
const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
3201 StringRef Name = A->getValue();
3202 if (Name ==
"branch")
3204 else if (Name ==
"return")
3206 else if (Name ==
"full")
3211 for (
const auto *A : Args.filtered(OPT_D, OPT_U)) {
3212 if (A->getOption().matches(OPT_D))
3221 for (
const auto *A : Args.filtered(OPT_include))
3222 Opts.
Includes.emplace_back(A->getValue());
3224 for (
const auto *A : Args.filtered(OPT_chain_include))
3227 for (
const auto *A : Args.filtered(OPT_remap_file)) {
3228 std::pair<StringRef, StringRef>
Split = StringRef(A->getValue()).split(
';');
3230 if (Split.second.empty()) {
3231 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
3238 if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
3239 StringRef Name = A->getValue();
3240 unsigned Library = llvm::StringSwitch<unsigned>(Name)
3246 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
3262 Opts.
ShowCPP = !Args.hasArg(OPT_dM);
3269 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
3279 Opts.
ABI = Args.getLastArgValue(OPT_target_abi);
3280 if (Arg *A = Args.getLastArg(OPT_meabi)) {
3281 StringRef
Value = A->getValue();
3282 llvm::EABI EABIVersion = llvm::StringSwitch<llvm::EABI>(
Value)
3283 .Case(
"default", llvm::EABI::Default)
3284 .Case(
"4", llvm::EABI::EABI4)
3285 .Case(
"5", llvm::EABI::EABI5)
3286 .Case(
"gnu", llvm::EABI::GNU)
3289 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
3294 Opts.
CPU = Args.getLastArgValue(OPT_target_cpu);
3295 Opts.
FPMath = Args.getLastArgValue(OPT_mfpmath);
3297 Opts.
LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);
3298 Opts.
Triple = Args.getLastArgValue(OPT_triple);
3301 Opts.
Triple = llvm::sys::getDefaultTargetTriple();
3306 options::OPT_fcuda_short_ptr, options::OPT_fno_cuda_short_ptr,
false);
3307 if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
3308 llvm::VersionTuple Version;
3309 if (Version.tryParse(A->getValue()))
3310 Diags.
Report(diag::err_drv_invalid_value)
3311 << A->getAsString(Args) << A->getValue();
3318 const char *
const *ArgBegin,
3319 const char *
const *ArgEnd,
3321 bool Success =
true;
3326 unsigned MissingArgIndex, MissingArgCount;
3328 Opts->ParseArgs(llvm::makeArrayRef(ArgBegin, ArgEnd), MissingArgIndex,
3329 MissingArgCount, IncludedFlagsBitmask);
3333 if (MissingArgCount) {
3334 Diags.
Report(diag::err_drv_missing_argument)
3335 << Args.getArgString(MissingArgIndex) << MissingArgCount;
3340 for (
const auto *A : Args.filtered(OPT_UNKNOWN)) {
3341 auto ArgString = A->getAsString(Args);
3342 std::string Nearest;
3343 if (Opts->findNearest(ArgString, Nearest, IncludedFlagsBitmask) > 1)
3344 Diags.
Report(diag::err_drv_unknown_argument) << ArgString;
3346 Diags.
Report(diag::err_drv_unknown_argument_with_suggestion)
3347 << ArgString << Nearest;
3373 if (Args.hasArg(OPT_fobjc_arc))
3374 LangOpts.ObjCAutoRefCount = 1;
3378 LangOpts.PIE = Args.hasArg(OPT_pic_is_pie);
3387 LangOpts.ObjCExceptions = 1;
3388 if (T.isOSDarwin() && DashX.isPreprocessed()) {
3396 LangOpts.FunctionAlignment =
3399 if (LangOpts.CUDA) {
3402 if (LangOpts.CUDAIsDevice)
3407 if (LangOpts.OpenMPIsDevice)
3415 !LangOpts.
Sanitize.
has(SanitizerKind::KernelAddress) &&
3417 !LangOpts.
Sanitize.
has(SanitizerKind::KernelMemory);
3432 Diags.Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
3440 using llvm::hash_code;
3450 #define LANGOPT(Name, Bits, Default, Description) \ 3451 code = hash_combine(code, LangOpts->Name); 3452 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 3453 code = hash_combine(code, static_cast<unsigned>(LangOpts->get##Name())); 3454 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 3455 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 3456 #include "clang/Basic/LangOptions.def" 3458 for (StringRef Feature :
LangOpts->ModuleFeatures)
3464 for (
const auto &FeatureAsWritten :
TargetOpts->FeaturesAsWritten)
3477 StringRef MacroDef = I.first;
3479 llvm::CachedHashString(MacroDef.split(
'=').first)))
3503 code = ext->hashExtension(code);
3508 if (getCodeGenOpts().DebugTypeExtRefs)
3509 for (
const auto &KeyValue : getCodeGenOpts().DebugPrefixMap)
3510 code =
hash_combine(code, KeyValue.first, KeyValue.second);
3516 if (!SanHash.
empty())
3519 return llvm::APInt(64, code).toString(36,
false);
3522 template<
typename IntTy>
3527 if (Arg *A = Args.getLastArg(Id)) {
3528 if (StringRef(A->getValue()).getAsInteger(10, Res)) {
3530 Diags->
Report(diag::err_drv_invalid_int_value) << A->getAsString(Args)
3542 return getLastArgIntValueImpl<int>(Args,
Id,
Default, Diags);
3548 return getLastArgIntValueImpl<uint64_t>(Args,
Id,
Default, Diags);
3555 llvm::vfs::getRealFileSystem());
3567 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
3568 Result->getBufferForFile(File);
3570 Diags.
Report(diag::err_missing_vfs_overlay_file) << File;
3575 std::move(Buffer.get()),
nullptr, File,
3578 Diags.
Report(diag::err_invalid_vfs_overlay) << File;
HeaderSearchOptions & getHeaderSearchOpts()
static Visibility parseVisibility(Arg *arg, ArgList &args, DiagnosticsEngine &diags)
Attempt to parse a visibility value out of the given argument.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
Expand macros but not #includes.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string OutputFile
The output file, if any.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr, bool DefaultDiagColor=true, bool DefaultShowOpt=true)
Fill out Opts based on the options given in Args.
static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args)
unsigned NoFinalizeRemoval
Enable migration to modern ObjC readwrite property.
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.
static void ParseCommentArgs(CommentOptions &Opts, ArgList &Args)
Conform to the underlying platform's C and C++ ABIs as closely as we can.
unsigned InlineMaxStackDepth
The inlining stack depth limit.
Paths for '#include <>' added by '-I'.
std::string ModuleDependencyOutputDir
The directory to copy module dependencies to when collecting them.
std::string ObjCMTWhiteListPath
std::string DwarfDebugFlags
The string to embed in the debug information for the compile unit, if non-empty.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T -> getSizeExpr()))
std::string DOTOutputFile
The file to write GraphViz-formatted header dependencies to.
void addMacroUndef(StringRef Name)
static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, bool &IsHeaderFile)
Generate pre-compiled module from a module map.
Attempt to be ABI-compatible with code generated by Clang 6.0.x (SVN r321711).
unsigned IncludeBriefComments
Show brief documentation comments in code completion results.
static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, const TargetOptions &TargetOpts, PreprocessorOptions &PPOpts, DiagnosticsEngine &Diags)
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
TargetOptions & getTargetOpts()
Enable inferring NS_DESIGNATED_INITIALIZER for ObjC methods.
Print the output of the dependency directives source minimizer.
Parse and perform semantic analysis.
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
static StringRef getCodeModel(ArgList &Args, DiagnosticsEngine &Diags)
unsigned ShowCheckerHelpDeveloper
unsigned IncludeGlobals
Show top-level decls in code completion results.
SanitizerSet Sanitize
Set of enabled sanitizers.
Like System, but headers are implicitly wrapped in extern "C".
DependencyOutputOptions & getDependencyOutputOpts()
std::shared_ptr< HeaderSearchOptions > HeaderSearchOpts
Options controlling the #include directive.
std::shared_ptr< llvm::Regex > OptimizationRemarkMissedPattern
Regular expression to select optimizations for which we should enable missed optimization remarks...
static unsigned getOptimizationLevel(ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config, StringRef OptionName, StringRef DefaultVal)
LangStandard - Information about the properties of a particular language standard.
static bool isBuiltinFunc(const char *Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
CoreFoundationABI CFRuntime
unsigned IncludeModuleFiles
Include module file dependencies.
void set(XRayInstrMask K, bool Value)
Parse ASTs and print them.
bool hasDigraphs() const
hasDigraphs - Language supports digraphs.
Enable migration to NS_ENUM/NS_OPTIONS macros.
Like System, but only used for C++.
std::string HeaderIncludeOutputFile
The file to write header include output to.
std::vector< std::string > Includes
static bool parseDiagnosticLevelMask(StringRef FlagName, const std::vector< std::string > &Levels, DiagnosticsEngine *Diags, DiagnosticLevelMask &M)
std::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::string FPDenormalMode
The floating-point denormal mode to use.
Defines types useful for describing an Objective-C runtime.
unsigned visualizeExplodedGraphWithGraphViz
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
Like System, but only used for ObjC++.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
static bool CreateFromArgs(CompilerInvocation &Res, const char *const *ArgBegin, const char *const *ArgEnd, DiagnosticsEngine &Diags)
Create a compiler invocation from a list of input options.
#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN)
std::shared_ptr< LangOptions > LangOpts
Options controlling the language variant.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > Reciprocals
std::vector< std::string > RewriteMapFiles
Set of files defining the rules for the symbol rewriting.
static const LangStandard & getLangStandardForKind(Kind K)
InputKind::Language getLanguage() const
Get the language that this standard describes.
std::string ASTDumpFilter
If given, filter dumped AST Decl nodes by this substring.
Objects with "hidden" visibility are not seen by the dynamic linker.
static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, const std::string &WorkingDir)
for(auto typeArg :T->getTypeArgsAsWritten())
Options for controlling the target.
bool PropagateAttrs
If true, we set attributes functions in the bitcode library according to our CodeGenOptions, much as we set attrs on functions that we generate ourselves.
void addRemappedFile(StringRef From, StringRef To)
static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts, DiagnosticsEngine *Diags)
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
std::string HostTriple
When compiling for the device side, contains the triple used to compile for the host.
std::string SplitDwarfFile
The name for the split debug info file used for the DW_AT_[GNU_]dwo_name attribute in the skeleton CU...
Like System, but searched after the system directories.
std::string DebugPass
Enable additional debugging information.
Enable migration to modern ObjC readonly property.
float __ovld __cnfn normalize(float p)
Returns a vector in the same direction as p but with a length of 1.
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
Parse and apply any fixits to the source.
Enable migration to modern ObjC subscripting.
Defines the clang::SanitizerKind enum.
unsigned TimeTrace
Output time trace profile.
static void setPGOInstrumentor(CodeGenOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
std::map< std::string, std::string > DebugPrefixMap
std::vector< std::string > XRayAlwaysInstrumentFiles
Paths to the XRay "always instrument" files specifying which objects (files, functions, variables) should be imbued with the XRay "always instrument" attribute.
bool isCPlusPlus14() const
isCPlusPlus14 - Language is a C++14 variant (or later).
std::string FPMath
If given, the unit to use for floating point math.
static std::shared_ptr< llvm::Regex > GenerateOptimizationRemarkRegex(DiagnosticsEngine &Diags, ArgList &Args, Arg *RpassArg)
Create a new Regex instance out of the string value in RpassArg.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
unsigned IncludeSystemHeaders
Include system header dependencies.
ShowIncludesDestination ShowIncludesDest
Destination of cl.exe style /showIncludes info.
Translate input source into HTML.
static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, DiagnosticsEngine &Diags, const TargetOptions &TargetOpts, const FrontendOptions &FrontendOpts)
std::string SplitDwarfOutput
Output filename for the split debug info, not used in the skeleton CU.
Interoperability with the Swift 4.1 runtime.
SanitizerMask Mask
Bitmask of enabled sanitizers.
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
std::string DumpExplodedGraphTo
File path to which the exploded graph should be dumped.
__DEVICE__ int max(int __a, int __b)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::vector< std::string > ASTMergeFiles
The list of AST files to merge.
std::string CodeModel
The code model to use (-mcmodel).
std::vector< std::string > ModulesEmbedFiles
The list of files to embed into the compiled module file.
unsigned RelocatablePCH
When generating PCH files, instruct the AST writer to create relocatable PCH files.
Objects with "default" visibility are seen by the dynamic linker and act like normal objects...
std::shared_ptr< PreprocessorOptions > PreprocessorOpts
Options controlling the preprocessor (aside from #include handling).
unsigned IncludeCodePatterns
Show code patterns in code completion results.
unsigned ShowCheckerHelpAlpha
Action - Represent an abstract compilation step to perform.
Generate LLVM IR, but do not emit anything.
static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
std::vector< std::string > XRayAttrListFiles
Paths to the XRay attribute list files, specifying which objects (files, functions, variables) should be imbued with the appropriate XRay attribute(s).
CodeGenOptions & getCodeGenOpts()
bool hasLineComments() const
Language supports '//' comments.
unsigned ShowStats
Show frontend performance metrics and statistics.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args)
Emit location information but do not generate debug info in the output.
static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
std::vector< std::string > PassPlugins
List of dynamic shared object files to be loaded as pass plugins.
Visibility
Describes the different kinds of visibility that a declaration may have.
Enable annotation of ObjCMethods of all kinds.
bool isOpenCL() const
isOpenCL - Language is a OpenCL variant.
bool isCPlusPlus2a() const
isCPlusPlus2a - Language is a post-C++17 variant (or later).
Concrete class used by the front-end to report problems and issues.
Enable migration of ObjC methods to 'instancetype'.
unsigned FixWhatYouCan
Apply fixes even if there are unfixable errors.
Defines the Diagnostic-related interfaces.
std::unique_ptr< llvm::opt::OptTable > createDriverOptTable()
unsigned ShowCheckerOptionList
std::string FullCompilerInvocation
Store full compiler invocation for reproducible instructions in the generated report.
std::vector< std::string > Warnings
The list of -W...
std::vector< std::pair< std::string, bool > > CheckersControlList
Pair of checker name and enable/disable.
AnalysisStores
AnalysisStores - Set of available analysis store models.
constexpr XRayInstrMask All
bool isCPlusPlus() const
isCPlusPlus - Language is a C++ variant.
bool DisablePCHValidation
When true, disables most of the normal validation performed on precompiled headers.
Interoperability with the Swift 5.0 runtime.
VersionTuple getOpenCLVersionTuple() const
Return the OpenCL C or C++ version as a VersionTuple.
static void setPGOUseInstrumentor(CodeGenOptions &Opts, const Twine &ProfileName)
unsigned FixAndRecompile
Apply fixes and recompile.
Defines the clang::Visibility enumeration and various utility functions.
std::string FloatABI
The ABI to use for passing floating point arguments.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
PreprocessorOutputOptions & getPreprocessorOutputOpts()
std::string ThreadModel
The thread model to use.
FrontendOptions & getFrontendOpts()
std::vector< std::string > DependentLibraries
A list of dependent libraries.
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
Dump the compiler configuration.
MigratorOptions & getMigratorOpts()
Dump template instantiations.
std::string ProfileFilterFiles
Regexes separated by a semi-colon to filter the files to instrument.
std::string ProfileRemappingFile
Name of the profile remapping file to apply to the profile data supplied by -fprofile-sample-use or -...
char CoverageVersion[4]
The version string to put into coverage files.
Dump out preprocessed tokens.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
const char * getName() const
getName - Get the name of this standard.
AnalysisDiagClients AnalysisDiagOpt
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
Interoperability with the ObjectiveC runtime.
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g., -E).
static bool IsHeaderFile(const std::string &Filename)
std::string LimitFloatPrecision
The float precision limit to use, if non-empty.
unsigned ASTDumpAll
Whether we deserialize all decls when forming AST dumps.
Generate pre-compiled module from a C++ module interface file.
prefer 'atomic' property over 'nonatomic'.
uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, uint64_t Default, DiagnosticsEngine *Diags=nullptr)
#define LANGSTANDARD(id, name, lang, desc, features)
static void setLangDefaults(LangOptions &Opts, InputKind IK, const llvm::Triple &T, PreprocessorOptions &PPOpts, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
AnalysisInliningMode InliningMode
The mode of function selection used during inlining.
CommentOptions CommentOpts
Options for parsing comments.
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...
bool isCPlusPlus11() const
isCPlusPlus11 - Language is a C++11 variant (or later).
Defines the clang::LangOptions interface.
std::vector< std::string > Plugins
The list of plugins to load.
Show just the "best" overload candidates.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
Emit only debug info necessary for generating line number tables (-gline-tables-only).
static IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id, IntTy Default, DiagnosticsEngine *Diags)
unsigned ShowEnabledCheckerList
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
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...
unsigned RewriteIncludes
Preprocess include directives only.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
unsigned ShowTimers
Show timers for individual actions.
std::string LinkerVersion
If given, the version string of the linker in use.
Only execute frontend initialization.
Defines version macros and version-related utility functions for Clang.
unsigned IncludeNamespaceLevelDecls
Show decls in namespace (including the global namespace) in code completion results.
Print the "preamble" of the input file.
unsigned LinkFlags
Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
llvm::hash_code hash_value(const clang::SanitizerMask &Arg)
static llvm::Reloc::Model getRelocModel(ArgList &Args, DiagnosticsEngine &Diags)
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a #pragma hdrstop is expected to indicate the beginni...
unsigned ShowHeaderIncludes
Show header inclusions (-H).
std::shared_ptr< llvm::Regex > OptimizationRemarkPattern
Regular expression to select optimizations for which we should enable optimization remarks...
bool hasImplicitInt() const
hasImplicitInt - Language allows variables to be typed as int implicitly.
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
static bool IsInputCompatibleWithStandard(InputKind IK, const LangStandard &S)
Check if input file kind and language standard are compatible.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
unsigned ModulesEmbedAllFiles
Whether we should embed all used files into the PCM file.
unsigned ShowConfigOptionsList
AnalysisInliningMode
AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
Objects with "protected" visibility are seen by the dynamic linker but always dynamically resolve to ...
unsigned ShowMacros
Print macro definitions.
bool isC2x() const
isC2x - Language is a superset of C2x.
clang::ObjCRuntime ObjCRuntime
static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, ArgList &Args, frontend::ActionKind Action)
static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action)
unsigned FixOnlyWarnings
Apply fixes only for warnings.
unsigned NoNSAllocReallocError
unsigned AnalyzerWerror
Emit analyzer warnings as errors.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
bool ForceEnableInt128
If given, enables support for __int128_t and __uint128_t types.
The result type of a method or function.
Attempt to be ABI-compatible with code generated by Clang 3.8.x (SVN r257626).
static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, OptSpecifier GroupWithValue, std::vector< std::string > &Diagnostics)
std::string AuxTriple
Auxiliary triple for CUDA compilation.
bool isC11() const
isC11 - Language is a superset of C11.
Defines the clang::XRayInstrKind enum.
bool AllowPCHWithCompilerErrors
When true, a PCH with compiler errors will not be rejected.
std::string CPU
If given, the name of the target CPU to generate code for.
bool hasHexFloats() const
hasHexFloats - Language supports hexadecimal float constants.
unsigned ShowIncludeDirectives
Print includes, imports etc. within preprocessed output.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
std::string Filename
The filename of the bitcode file to link in.
unsigned ARCMTMigrateEmitARCErrors
Emit ARC errors even if the migrator can fix them.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
static void initOption(AnalyzerOptions::ConfigTable &Config, DiagnosticsEngine *Diags, StringRef &OptionField, StringRef Name, StringRef DefaultVal)
std::string ABI
If given, the name of the target ABI to use.
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
llvm::StringMap< std::string > ConfigTable
AnalyzerOptionsRef getAnalyzerOpts() const
AnalysisStores AnalysisStoreOpt
Encodes a location in the source.
Generate machine code, but don't emit anything.
std::vector< std::string > ModuleFiles
The list of additional prebuilt module files to load before processing the input. ...
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
Limit generated debug info to reduce size (-fno-standalone-debug).
Options for controlling the compiler diagnostics engine.
std::vector< FrontendInputFile > Inputs
The input files and their types.
Attempt to be ABI-compatible with code generated by Clang 4.0.x (SVN r291814).
ConfigTable Config
A key-value table of use-specified configuration values.
std::string DiagnosticSerializationFile
The file to serialize diagnostics to (non-appending).
#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN)
unsigned IncludeTimestamps
Whether timestamps should be written to the produced PCH file.
Parse ASTs and view them in Graphviz.
unsigned ShowCheckerOptionDeveloperList
std::vector< std::string > Remarks
The list of -R...
std::vector< std::string > OpenCLExtensionsAsWritten
The list of OpenCL extensions to enable or disable, as written on the command line.
std::vector< std::string > DefaultFunctionAttrs
Parse ASTs and list Decl nodes.
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
static void getAllNoBuiltinFuncValues(ArgList &Args, std::vector< std::string > &Funcs)
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a #pragma hdrstop to sepa...
Defines the clang::TargetOptions class.
Enable migration to modern ObjC property.
std::unordered_map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
DiagnosticOptions & getDiagnosticOpts() const
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
unsigned ASTDumpLookups
Whether we include lookup table dumps in AST dumps.
std::vector< std::string > ExtraDeps
A list of filenames to be used as extra dependencies for every target.
Load and verify that a PCH file is usable.
std::shared_ptr< TargetOptions > TargetOpts
Options controlling the target.
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
unsigned UseLineDirectives
Use #line instead of GCC-style # N.
Like System, but only used for ObjC.
unsigned ShowVersion
Show the -version text.
unsigned RewriteImports
Include contents of transitively-imported modules.
std::shared_ptr< llvm::Regex > OptimizationRemarkAnalysisPattern
Regular expression to select optimizations for which we should enable optimization analyses...
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line...
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
constexpr XRayInstrMask None
bool isUnknownAnalyzerConfig(StringRef Name) const
PragmaMSPointersToMembersKind
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
std::string PCHThroughHeader
If non-empty, the filename used in an #include directive in the primary source file (or command-line ...
static const StringRef GetInputKindName(InputKind IK)
Get language name for given input kind.
Enable migration to add conforming protocols.
void addMacroDef(StringRef Name)
llvm::EABI EABIVersion
The EABI version to use.
'#include ""' paths, added by 'gcc -iquote'.
std::string ThinLTOIndexFile
Name of the function summary index file to use for ThinLTO function importing.
std::vector< std::string > MacroIncludes
unsigned ShowHelp
Show the -help text.
std::string OverrideRecordLayoutsFile
File name of the file that will provide record layouts (in the format produced by -fdump-record-layou...
unsigned FixToTemporaries
Apply fixes to temporary files.
unsigned ShowComments
Show comments.
Like Angled, but marks system directories.
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.
unsigned maxBlockVisitOnPath
The maximum number of times the analyzer visits a block.
unsigned DisableAllChecks
Disable all analyzer checks.
std::string OutputFile
The file to write dependency output to.
bool allowsARC() const
Does this runtime allow ARC at all?
ASTDumpOutputFormat ASTDumpFormat
Specifies the output format of the AST.
DependencyOutputFormat OutputFormat
The format for the dependency file.
std::string CudaGpuBinaryFileName
Name of file passed with -fcuda-include-gpubinary option to forward to CUDA runtime back-end for inco...
Dataflow Directional Tag Classes.
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
Enable migration to modern ObjC literals.
static ParsedSourceLocation FromString(StringRef Str)
Construct a parsed source location from a string; the Filename is empty on error. ...
PreprocessorOptions & getPreprocessorOpts()
Enable converting setter/getter expressions to property-dot syntx.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
frontend::ActionKind ProgramAction
The frontend action to perform.
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 > VerifyPrefixes
The prefixes for comment directives sought by -verify ("expected" by default).
std::string ARCMTMigrateReportOut
std::string SymbolPartition
The name of the partition that symbols are assigned to, specified with -fsymbol-partition (see https:...
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
std::string PreferVectorWidth
The preferred width for auto-vectorization transforms.
Emit only debug directives with the line numbers data.
std::unique_ptr< DiagnosticConsumer > create(StringRef OutputFile, DiagnosticOptions *Diags, bool MergeChildRecords=false)
Returns a DiagnosticConsumer that serializes diagnostics to a bitcode file.
Like System, but only used for C.
bool empty() const
Returns true if no sanitizers are enabled.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
AnalysisConstraints AnalysisConstraintsOpt
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action)
Helper class for holding the data necessary to invoke the compiler.
std::string DebugCompilationDir
The string to embed in debug information as the current working directory.
unsigned UsePhonyTargets
Include phony targets for each dependency, which can avoid some 'make' problems.
std::string AnalyzeSpecificFunction
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i...
FrontendOptions - Options for controlling the behavior of the frontend.
bool isC17() const
isC17 - Language is a superset of C17.
static bool ParseMigratorArgs(MigratorOptions &Opts, ArgList &Args)
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
bool isGNUMode() const
isGNUMode - Language includes GNU extensions.
std::string StatsFile
Filename to write statistics to.
Parse ASTs and dump them.
Don't generate debug info.
std::string ProfileExcludeFiles
Regexes separated by a semi-colon to filter the files to not instrument.
std::string CoverageDataFile
The filename with path we use for coverage data files.
Defines the clang::FileSystemOptions interface.
std::vector< std::string > LinkerOptions
A list of linker options to embed in the object file.
std::string RecordCommandLine
The string containing the commandline for the llvm.commandline metadata, if non-empty.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::vector< std::shared_ptr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
CodeCompleteOptions CodeCompleteOpts
enum clang::FrontendOptions::@193 ARCMTAction
static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor)
IntrusiveRefCntPtr< DiagnosticOptions > DiagnosticOpts
Options controlling the diagnostic engine.
std::vector< std::string > AddPluginActions
The list of plugin actions to run in addition to the normal action.
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
AnalysisPurgeMode
AnalysisPurgeModes - Set of available strategies for dead symbol removal.
Stores options for the analyzer from the command line.
unsigned AnalyzerDisplayProgress
~CompilerInvocationBase()
Keeps track of options that affect how file operations are performed.
unsigned DisableFree
Disable memory freeing on exit.
Generate pre-compiled header.
Generate pre-compiled module from a set of header files.
int getLastArgIntValue(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, int Default, DiagnosticsEngine *Diags=nullptr)
Return the value of the last argument as an integer, or a default.
X
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
unsigned ShowMacroComments
Show comments, even in macros.
unsigned PrintSupportedCPUs
print the supported cpus for the current target
unsigned ShowCheckerOptionAlphaList
Defines the clang::SourceLocation class and associated facilities.
unsigned AnalyzeNestedBlocks
unsigned NoRetryExhausted
Do not re-analyze paths leading to exhausted nodes with a different strategy.
Interoperability with the Swift 4.2 runtime.
bool Internalize
If true, we use LLVM module internalizer.
std::vector< std::string > XRayNeverInstrumentFiles
Paths to the XRay "never instrument" files specifying which objects (files, functions, variables) should be imbued with the XRay "never instrument" attribute.
annotate property with NS_RETURNS_INNER_POINTER
bool NVPTXUseShortPointers
If enabled, use 32-bit pointers for accessing const/local/shared address space.
std::string MainFileName
The user provided name for the "main file", if non-empty.
use NS_NONATOMIC_IOSONLY for property 'atomic' attribute
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
static bool checkVerifyPrefixes(const std::vector< std::string > &VerifyPrefixes, DiagnosticsEngine *Diags)
XRayInstrMask parseXRayInstrValue(StringRef Value)
bool isC99() const
isC99 - Language is a superset of C99.
unsigned IncludeFixIts
Include results after corrections (small fix-its), e.g.
unsigned ASTDumpDecls
Whether we include declaration dumps in AST dumps.
std::string ActionName
The name of the action to run when using a plugin action.
unsigned ShowLineMarkers
Show #line markers.
bool isCPlusPlus17() const
isCPlusPlus17 - Language is a C++17 variant (or later).
FileSystemOptions & getFileSystemOpts()
static unsigned getOptimizationLevelSize(ArgList &Args)
Run one or more source code analyses.
Generate Interface Stub Files.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN)
std::vector< std::string > LLVMArgs
A list of arguments to forward to LLVM's option processing; this should only be used for debugging an...
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::string InstrProfileOutput
Name of the profile file to use as output for -fprofile-instr-generate, -fprofile-generate, and -fcs-profile-generate.
const char * getDescription() const
getDescription - Get the description of this standard.
std::string TrapFuncName
If not an empty string, trap intrinsics are lowered to calls to this function instead of to trap inst...
DiagnosticLevelMask
A bitmask representing the diagnostic levels used by VerifyDiagnosticConsumer.
Dump information about a module file.
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
unsigned AddMissingHeaderDeps
Add missing headers to dependency list.
std::string ThinLinkBitcodeFile
Name of a file that can optionally be written with minimized bitcode to be used as input for the Thin...
std::vector< std::string > SanitizerBlacklistFiles
Paths to blacklist files specifying which objects (files, functions, variables) should not be instrum...
unsigned ShowCPP
Print normal preprocessed output.
Like Angled, but marks header maps used when building frameworks.
unsigned ShouldEmitErrorsOnInvalidConfigValue
llvm::VersionTuple SDKVersion
The version of the SDK which was used during the compilation.
static InputKind getInputKindForExtension(StringRef Extension)
getInputKindForExtension - Return the appropriate input kind for a file extension.
std::string ObjCConstantStringClass
#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC)
unsigned IncludeMacros
Show macros in code completion results.
AnalysisPurgeMode AnalysisPurgeOpt
LangOptions * getLangOpts()
static void parseXRayInstrumentationBundle(StringRef FlagName, StringRef Bundle, ArgList &Args, DiagnosticsEngine &D, XRayInstrSet &S)
bool DumpDeserializedPCHDecls
Dump declarations that are deserialized from PCH, for testing.
AnalysisDiagClients
AnalysisDiagClients - Set of available diagnostic clients for rendering analysis results.
Attempt to be ABI-compatible with code generated by Clang 7.0.x (SVN r338536).
std::string Triple
The name of the target triple to compile for.
#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC)
Defines enum values for all the target-independent builtin functions.
std::string getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
static void parseSanitizerKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags, SanitizerSet &S)
bool allowsWeak() const
Does this runtime allow the use of __weak?
std::string DiagnosticLogFile
The file to log diagnostic output to.
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
std::vector< std::string > ModuleMapFiles
The list of module map files to load before processing the input.