15 #include "clang/Config/config.h"
26 #include "llvm/ADT/Hashing.h"
27 #include "llvm/ADT/STLExtras.h"
28 #include "llvm/ADT/SmallVector.h"
29 #include "llvm/ADT/StringExtras.h"
30 #include "llvm/ADT/StringSwitch.h"
31 #include "llvm/ADT/Triple.h"
32 #include "llvm/Linker/Linker.h"
33 #include "llvm/Option/Arg.h"
34 #include "llvm/Option/ArgList.h"
35 #include "llvm/Option/OptTable.h"
36 #include "llvm/Option/Option.h"
37 #include "llvm/ProfileData/InstrProfReader.h"
38 #include "llvm/Support/CodeGen.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/Support/FileSystem.h"
41 #include "llvm/Support/Host.h"
42 #include "llvm/Support/Path.h"
43 #include "llvm/Support/Process.h"
44 #include "llvm/Target/TargetOptions.h"
45 #include "llvm/Support/ScopedPrinter.h"
49 #include <system_error>
50 using namespace clang;
75 using namespace clang::driver;
76 using namespace clang::driver::options;
77 using namespace llvm::opt;
83 unsigned DefaultOpt = 0;
87 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
88 if (A->getOption().matches(options::OPT_O0))
91 if (A->getOption().matches(options::OPT_Ofast))
94 assert (A->getOption().matches(options::OPT_O));
96 StringRef
S(A->getValue());
97 if (
S ==
"s" ||
S ==
"z" ||
S.empty())
110 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
111 if (A->getOption().matches(options::OPT_O)) {
112 switch (A->getValue()[0]) {
126 OptSpecifier GroupWithValue,
127 std::vector<std::string> &Diagnostics) {
128 for (Arg *A : Args.filtered(Group)) {
129 if (A->getOption().getKind() == Option::FlagClass) {
132 Diagnostics.push_back(A->getOption().getName().drop_front(1));
133 }
else if (A->getOption().matches(GroupWithValue)) {
135 Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim(
"=-"));
138 for (
const char *Arg : A->getValues())
139 Diagnostics.emplace_back(Arg);
145 std::vector<std::string> &Funcs) {
147 for (
const auto &Arg : Args) {
148 const Option &O = Arg->getOption();
149 if (O.matches(options::OPT_fno_builtin_)) {
150 const char *FuncName = Arg->getValue();
152 Values.push_back(FuncName);
155 Funcs.insert(Funcs.end(), Values.begin(), Values.end());
160 using namespace options;
162 if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {
163 StringRef
Name = A->getValue();
166 .Case(CMDFLAG, NAME##Model)
167 #include "clang/StaticAnalyzer/Core/Analyses.def"
170 Diags.
Report(diag::err_drv_invalid_value)
171 << A->getAsString(Args) <<
Name;
178 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
179 StringRef
Name = A->getValue();
182 .Case(CMDFLAG, NAME##Model)
183 #include "clang/StaticAnalyzer/Core/Analyses.def"
186 Diags.
Report(diag::err_drv_invalid_value)
187 << A->getAsString(Args) <<
Name;
194 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
195 StringRef
Name = A->getValue();
198 .Case(CMDFLAG, PD_##NAME)
199 #include "clang/StaticAnalyzer/Core/Analyses.def"
202 Diags.
Report(diag::err_drv_invalid_value)
203 << A->getAsString(Args) <<
Name;
210 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
211 StringRef
Name = A->getValue();
215 #include "clang/StaticAnalyzer/Core/Analyses.def"
218 Diags.
Report(diag::err_drv_invalid_value)
219 << A->getAsString(Args) <<
Name;
226 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
227 StringRef
Name = A->getValue();
231 #include "clang/StaticAnalyzer/Core/Analyses.def"
234 Diags.
Report(diag::err_drv_invalid_value)
235 << A->getAsString(Args) <<
Name;
247 Args.hasArg(OPT_analyzer_viz_egraph_graphviz);
249 Args.hasArg(OPT_analyzer_viz_egraph_ubigraph);
251 Opts.
AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers);
254 Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks);
258 Opts.
TrimGraph = Args.hasArg(OPT_trim_egraph);
261 Opts.
PrintStats = Args.hasArg(OPT_analyzer_stats);
268 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
270 bool enable = (A->getOption().getID() == OPT_analyzer_checker);
273 StringRef checkerList = A->getValue();
275 checkerList.split(checkers,
",");
276 for (StringRef checker : checkers)
281 for (
const Arg *A : Args.filtered(OPT_analyzer_config)) {
285 StringRef configList = A->getValue();
287 configList.split(configVals,
",");
288 for (
unsigned i = 0, e = configVals.size(); i != e; ++i) {
290 std::tie(key, val) = configVals[i].split(
"=");
293 diag::err_analyzer_config_no_value) << configVals[i];
297 if (val.find(
'=') != StringRef::npos) {
299 diag::err_analyzer_config_multiple_values)
323 if (Arg *A = Args.getLastArg(OPT_mcode_model)) {
324 StringRef
Value = A->getValue();
325 if (Value ==
"small" || Value ==
"kernel" || Value ==
"medium" ||
328 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Value;
334 if (Arg *A = Args.getLastArg(OPT_mrelocation_model)) {
335 StringRef
Value = A->getValue();
336 if (Value ==
"static" || Value ==
"pic" || Value ==
"ropi" ||
337 Value ==
"rwpi" || Value ==
"ropi-rwpi" || Value ==
"dynamic-no-pic")
339 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Value;
346 static std::shared_ptr<llvm::Regex>
349 StringRef Val = RpassArg->getValue();
350 std::string RegexError;
351 std::shared_ptr<llvm::Regex> Pattern = std::make_shared<llvm::Regex>(Val);
352 if (!Pattern->isValid(RegexError)) {
353 Diags.
Report(diag::err_drv_optimization_remark_pattern)
354 << RegexError << RpassArg->getAsString(Args);
361 const std::vector<std::string> &Levels,
365 for (
const auto &
Level : Levels) {
367 llvm::StringSwitch<DiagnosticLevelMask>(
Level)
376 Diags->
Report(diag::err_drv_invalid_value) << FlagName <<
Level;
384 const std::vector<std::string> &Sanitizers,
386 for (
const auto &Sanitizer : Sanitizers) {
389 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
398 Arg *A = Args.getLastArg(OPT_fprofile_instrument_EQ);
401 StringRef
S = A->getValue();
402 unsigned I = llvm::StringSwitch<unsigned>(
S)
408 Diags.
Report(diag::err_drv_invalid_pgo_instrumentor) << A->getAsString(Args)
414 Opts.setProfileInstr(Instrumentor);
419 const Twine &ProfileName) {
422 if (
auto E = ReaderOrErr.takeError()) {
423 llvm::consumeError(std::move(
E));
427 std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader =
428 std::move(ReaderOrErr.get());
429 if (PGOReader->isIRLevelProfile())
438 using namespace options;
440 llvm::Triple Triple = llvm::Triple(TargetOpts.
Triple);
444 unsigned MaxOptLevel = 3;
445 if (OptimizationLevel > MaxOptLevel) {
448 Diags.
Report(diag::warn_drv_optimization_value)
449 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
450 OptimizationLevel = MaxOptLevel;
452 Opts.OptimizationLevel = OptimizationLevel;
456 Opts.setInlining((Opts.OptimizationLevel == 0)
461 if (Arg *InlineArg = Args.getLastArg(
462 options::OPT_finline_functions, options::OPT_finline_hint_functions,
463 options::OPT_fno_inline_functions, options::OPT_fno_inline)) {
464 if (Opts.OptimizationLevel > 0) {
465 const Option &InlineOpt = InlineArg->getOption();
466 if (InlineOpt.matches(options::OPT_finline_functions))
467 Opts.setInlining(CodeGenOptions::NormalInlining);
468 else if (InlineOpt.matches(options::OPT_finline_hint_functions))
475 Opts.ExperimentalNewPassManager = Args.hasFlag(
476 OPT_fexperimental_new_pass_manager, OPT_fno_experimental_new_pass_manager,
479 Opts.DebugPassManager =
480 Args.hasFlag(OPT_fdebug_pass_manager, OPT_fno_debug_pass_manager,
483 if (Arg *A = Args.getLastArg(OPT_fveclib)) {
484 StringRef
Name = A->getValue();
485 if (Name ==
"Accelerate")
487 else if (Name ==
"SVML")
489 else if (Name ==
"none")
492 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
495 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
497 llvm::StringSwitch<unsigned>(A->getValue())
503 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
506 Opts.setDebugInfo(static_cast<codegenoptions::DebugInfoKind>(Val));
508 if (Arg *A = Args.getLastArg(OPT_debugger_tuning_EQ)) {
509 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
510 .Case(
"gdb",
unsigned(llvm::DebuggerKind::GDB))
511 .Case(
"lldb",
unsigned(llvm::DebuggerKind::LLDB))
512 .Case(
"sce",
unsigned(llvm::DebuggerKind::SCE))
515 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
518 Opts.setDebuggerTuning(static_cast<llvm::DebuggerKind>(Val));
521 Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);
522 Opts.EmitCodeView = Args.hasArg(OPT_gcodeview);
523 Opts.MacroDebugInfo = Args.hasArg(OPT_debug_info_macro);
524 Opts.WholeProgramVTables = Args.hasArg(OPT_fwhole_program_vtables);
525 Opts.LTOVisibilityPublicStd = Args.hasArg(OPT_flto_visibility_public_std);
526 Opts.EnableSplitDwarf = Args.hasArg(OPT_enable_split_dwarf);
528 Opts.SplitDwarfInlining = !Args.hasArg(OPT_fno_split_dwarf_inlining);
529 Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs);
530 Opts.DebugExplicitImport = Triple.isPS4CPU();
532 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ))
536 Args.getLastArg(OPT_emit_llvm_uselists, OPT_no_emit_llvm_uselists))
537 Opts.EmitLLVMUseLists = A->getOption().getID() == OPT_emit_llvm_uselists;
539 Opts.DisableLLVMPasses = Args.hasArg(OPT_disable_llvm_passes);
540 Opts.DisableLifetimeMarkers = Args.hasArg(OPT_disable_lifetimemarkers);
541 Opts.DisableO0ImplyOptNone = Args.hasArg(OPT_disable_O0_optnone);
542 Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
543 Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
544 Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
545 OPT_fuse_register_sized_bitfield_access);
546 Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
547 Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa);
549 Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
550 Opts.NoCommon = Args.hasArg(OPT_fno_common);
551 Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
553 Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||
554 Args.hasArg(OPT_ffreestanding));
555 if (Opts.SimplifyLibCalls)
558 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
559 (Opts.OptimizationLevel > 1));
560 Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);
562 Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);
563 Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
565 Opts.DebugInfoForProfiling = Args.hasFlag(
566 OPT_fdebug_info_for_profiling, OPT_fno_debug_info_for_profiling,
false);
570 Args.getLastArgValue(OPT_fprofile_instrument_path_EQ);
572 Args.getLastArgValue(OPT_fprofile_instrument_use_path_EQ);
576 if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
579 StringRef Ver = A->getValue();
580 std::pair<StringRef, StringRef> VerParts = Ver.split(
'.');
581 unsigned Major, Minor = 0;
585 if (!VerParts.first.startswith(
"0") &&
586 !VerParts.first.getAsInteger(10, Major) &&
587 3 <= Major && Major <= CLANG_VERSION_MAJOR &&
588 (Major == 3 ? VerParts.second.size() == 1 &&
589 !VerParts.second.getAsInteger(10, Minor)
590 : VerParts.first.size() == Ver.size() ||
591 VerParts.second ==
"0")) {
593 if (Major == 3 && Minor <= 8)
597 }
else if (Ver !=
"latest") {
598 Diags.
Report(diag::err_drv_invalid_value)
599 << A->getAsString(Args) << A->getValue();
603 Opts.CoverageMapping =
604 Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping,
false);
605 Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);
606 Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);
607 Opts.PreserveAsmComments = !Args.hasArg(OPT_fno_preserve_as_comments);
608 Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
609 Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
610 Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
611 Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
613 Opts.
DebugPass = Args.getLastArgValue(OPT_mdebug_pass);
615 (Args.hasArg(OPT_mdisable_fp_elim) || Args.hasArg(OPT_pg));
616 Opts.DisableFree = Args.hasArg(OPT_disable_free);
617 Opts.DiscardValueNames = Args.hasArg(OPT_discard_value_names);
618 Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
619 Opts.
FloatABI = Args.getLastArgValue(OPT_mfloat_abi);
620 Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable) ||
621 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
622 Args.hasArg(OPT_cl_fast_relaxed_math);
624 Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
625 Args.hasArg(OPT_cl_finite_math_only) ||
626 Args.hasArg(OPT_cl_fast_relaxed_math));
627 Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
628 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
629 Args.hasArg(OPT_cl_finite_math_only) ||
630 Args.hasArg(OPT_cl_fast_relaxed_math));
631 Opts.NoSignedZeros = (Args.hasArg(OPT_fno_signed_zeros) ||
632 Args.hasArg(OPT_cl_no_signed_zeros) ||
633 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
634 Args.hasArg(OPT_cl_fast_relaxed_math));
635 Opts.FlushDenorm = Args.hasArg(OPT_cl_denorms_are_zero);
636 Opts.CorrectlyRoundedDivSqrt =
637 Args.hasArg(OPT_cl_fp32_correctly_rounded_divide_sqrt);
638 Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math);
639 Opts.NoTrappingMath = Args.hasArg(OPT_fno_trapping_math);
640 Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
643 Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
644 Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
645 Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);
646 Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
647 Opts.IncrementalLinkerCompatible =
648 Args.hasArg(OPT_mincremental_linker_compatible);
649 Opts.PIECopyRelocations =
650 Args.hasArg(OPT_mpie_copy_relocations);
651 Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
652 Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
653 Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm);
654 Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
655 Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums);
656 Opts.StrictReturn = !Args.hasArg(OPT_fno_strict_return);
657 Opts.StrictVTablePointers = Args.hasArg(OPT_fstrict_vtable_pointers);
658 Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
659 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
660 Args.hasArg(OPT_cl_fast_relaxed_math);
661 Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
663 Opts.
ThreadModel = Args.getLastArgValue(OPT_mthread_model,
"posix");
665 Diags.
Report(diag::err_drv_invalid_value)
666 << Args.getLastArg(OPT_mthread_model)->getAsString(Args)
668 Opts.
TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
669 Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array);
671 Opts.FunctionSections = Args.hasFlag(OPT_ffunction_sections,
672 OPT_fno_function_sections,
false);
673 Opts.DataSections = Args.hasFlag(OPT_fdata_sections,
674 OPT_fno_data_sections,
false);
675 Opts.UniqueSectionNames = Args.hasFlag(OPT_funique_section_names,
676 OPT_fno_unique_section_names,
true);
678 Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);
680 Opts.NoUseJumpTables = Args.hasArg(OPT_fno_jump_tables);
682 Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ);
683 Opts.EmitSummaryIndex =
false;
684 if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
685 StringRef
S = A->getValue();
687 Opts.EmitSummaryIndex =
true;
688 else if (S !=
"full")
689 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
S;
691 Opts.LTOUnit = Args.hasFlag(OPT_flto_unit, OPT_fno_lto_unit,
false);
692 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
694 Diags.
Report(diag::err_drv_argument_only_allowed_with)
695 << A->getAsString(Args) <<
"-x ir";
700 Opts.MSVolatile = Args.hasArg(OPT_fms_volatile);
702 Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops);
703 Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp);
705 Opts.
MainFileName = Args.getLastArgValue(OPT_main_file_name);
706 Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);
708 Opts.DisableGCov = Args.hasArg(OPT_test_coverage);
709 Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data);
710 Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes);
711 if (Opts.EmitGcovArcs || Opts.EmitGcovNotes) {
714 Opts.CoverageExtraChecksum = Args.hasArg(OPT_coverage_cfg_checksum);
715 Opts.CoverageNoFunctionNamesInData =
716 Args.hasArg(OPT_coverage_no_function_names_in_data);
717 Opts.CoverageExitBlockBeforeBody =
718 Args.hasArg(OPT_coverage_exit_block_before_body);
719 if (Args.hasArg(OPT_coverage_version_EQ)) {
720 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
721 if (CoverageVersion.size() != 4) {
722 Diags.
Report(diag::err_drv_invalid_value)
723 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
731 if (Arg *A = Args.getLastArg(OPT_fembed_bitcode_EQ)) {
732 StringRef
Name = A->getValue();
733 unsigned Model = llvm::StringSwitch<unsigned>(
Name)
740 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
743 Opts.setEmbedBitcode(
744 static_cast<CodeGenOptions::EmbedBitcodeKind>(Model));
750 for (
const auto &A : Args) {
752 if (A->getOption().getID() == options::OPT_o ||
753 A->getOption().getID() == options::OPT_INPUT ||
754 A->getOption().getID() == options::OPT_x ||
755 A->getOption().getID() == options::OPT_fembed_bitcode ||
756 (A->getOption().getGroup().isValid() &&
757 A->getOption().getGroup().getID() == options::OPT_W_Group))
760 A->render(Args, ASL);
761 for (
const auto &arg : ASL) {
762 StringRef ArgStr(arg);
763 Opts.
CmdArgs.insert(Opts.
CmdArgs.end(), ArgStr.begin(), ArgStr.end());
770 Opts.PreserveVec3Type = Args.hasArg(OPT_fpreserve_vec3_type);
771 Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
772 Opts.XRayInstrumentFunctions = Args.hasArg(OPT_fxray_instrument);
773 Opts.XRayInstructionThreshold =
775 Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
776 Opts.CallFEntry = Args.hasArg(OPT_mfentry);
777 Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info);
779 if (
const Arg *A = Args.getLastArg(OPT_compress_debug_sections,
780 OPT_compress_debug_sections_EQ)) {
781 if (A->getOption().getID() == OPT_compress_debug_sections) {
783 Opts.setCompressDebugSections(llvm::DebugCompressionType::GNU);
785 auto DCT = llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())
786 .Case(
"none", llvm::DebugCompressionType::None)
787 .Case(
"zlib", llvm::DebugCompressionType::Z)
788 .Case(
"zlib-gnu", llvm::DebugCompressionType::GNU)
789 .Default(llvm::DebugCompressionType::None);
790 Opts.setCompressDebugSections(DCT);
794 Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
796 for (
auto A : Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_cuda_bitcode)) {
799 if (A->getOption().matches(OPT_mlink_cuda_bitcode)) {
800 F.
LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
808 Opts.SanitizeCoverageType =
810 Opts.SanitizeCoverageIndirectCalls =
811 Args.hasArg(OPT_fsanitize_coverage_indirect_calls);
812 Opts.SanitizeCoverageTraceBB = Args.hasArg(OPT_fsanitize_coverage_trace_bb);
813 Opts.SanitizeCoverageTraceCmp = Args.hasArg(OPT_fsanitize_coverage_trace_cmp);
814 Opts.SanitizeCoverageTraceDiv = Args.hasArg(OPT_fsanitize_coverage_trace_div);
815 Opts.SanitizeCoverageTraceGep = Args.hasArg(OPT_fsanitize_coverage_trace_gep);
816 Opts.SanitizeCoverage8bitCounters =
817 Args.hasArg(OPT_fsanitize_coverage_8bit_counters);
818 Opts.SanitizeCoverageTracePC = Args.hasArg(OPT_fsanitize_coverage_trace_pc);
819 Opts.SanitizeCoverageTracePCGuard =
820 Args.hasArg(OPT_fsanitize_coverage_trace_pc_guard);
821 Opts.SanitizeCoverageNoPrune = Args.hasArg(OPT_fsanitize_coverage_no_prune);
822 Opts.SanitizeCoverageInline8bitCounters =
823 Args.hasArg(OPT_fsanitize_coverage_inline_8bit_counters);
824 Opts.SanitizeMemoryTrackOrigins =
826 Opts.SanitizeMemoryUseAfterDtor =
827 Args.hasArg(OPT_fsanitize_memory_use_after_dtor);
828 Opts.SanitizeCfiCrossDso = Args.hasArg(OPT_fsanitize_cfi_cross_dso);
829 Opts.SanitizeStats = Args.hasArg(OPT_fsanitize_stats);
830 if (Arg *A = Args.getLastArg(OPT_fsanitize_address_use_after_scope,
831 OPT_fno_sanitize_address_use_after_scope)) {
832 Opts.SanitizeAddressUseAfterScope =
833 A->getOption().getID() == OPT_fsanitize_address_use_after_scope;
835 Opts.SanitizeAddressGlobalsDeadStripping =
836 Args.hasArg(OPT_fsanitize_address_globals_dead_stripping);
839 Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
840 if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
841 StringRef Val = A->getValue();
842 unsigned StackAlignment = Opts.StackAlignment;
843 Val.getAsInteger(10, StackAlignment);
844 Opts.StackAlignment = StackAlignment;
847 if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) {
848 StringRef Val = A->getValue();
849 unsigned StackProbeSize = Opts.StackProbeSize;
850 Val.getAsInteger(0, StackProbeSize);
851 Opts.StackProbeSize = StackProbeSize;
854 if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
855 StringRef
Name = A->getValue();
856 unsigned Method = llvm::StringSwitch<unsigned>(
Name)
862 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
865 Opts.setObjCDispatchMethod(
866 static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method));
871 Args.hasFlag(OPT_femulated_tls, OPT_fno_emulated_tls,
false);
873 if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) {
874 StringRef
Name = A->getValue();
875 unsigned Model = llvm::StringSwitch<unsigned>(
Name)
882 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
885 Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model));
889 if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
890 StringRef Val = A->getValue();
893 else if (Val ==
"preserve-sign")
895 else if (Val ==
"positive-zero")
898 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
901 if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) {
902 if (A->getOption().matches(OPT_fpcc_struct_return)) {
905 assert(A->getOption().matches(OPT_freg_struct_return));
911 Opts.
LinkerOptions = Args.getAllArgValues(OPT_linker_option);
912 bool NeedLocTracking =
false;
914 Opts.
OptRecordFile = Args.getLastArgValue(OPT_opt_record_file);
916 NeedLocTracking =
true;
918 if (Arg *A = Args.getLastArg(OPT_Rpass_EQ)) {
921 NeedLocTracking =
true;
924 if (Arg *A = Args.getLastArg(OPT_Rpass_missed_EQ)) {
927 NeedLocTracking =
true;
930 if (Arg *A = Args.getLastArg(OPT_Rpass_analysis_EQ)) {
933 NeedLocTracking =
true;
936 Opts.DiagnosticsWithHotness =
937 Args.hasArg(options::OPT_fdiagnostics_show_hotness);
939 bool UsingProfile = UsingSampleProfile ||
942 if (Opts.DiagnosticsWithHotness && !UsingProfile)
943 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
944 <<
"-fdiagnostics-show-hotness";
947 Args, options::OPT_fdiagnostics_hotness_threshold_EQ, 0);
948 if (Opts.DiagnosticsHotnessThreshold > 0 && !UsingProfile)
949 Diags.
Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
950 <<
"-fdiagnostics-hotness-threshold=";
955 if (UsingSampleProfile)
956 NeedLocTracking =
true;
968 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
971 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
975 Args.getAllArgValues(OPT_fcuda_include_gpubinary);
977 Opts.Backchain = Args.hasArg(OPT_mbackchain);
980 Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags);
987 using namespace options;
988 Opts.
OutputFile = Args.getLastArgValue(OPT_dependency_file);
989 Opts.
Targets = Args.getAllArgValues(OPT_MT);
997 Opts.
DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
999 Args.getLastArgValue(OPT_module_dependency_dir);
1000 if (Args.hasArg(OPT_MV))
1005 Opts.
ExtraDeps = Args.getAllArgValues(OPT_fdepfile_entry);
1006 auto ModuleFiles = Args.getAllArgValues(OPT_fmodule_file);
1020 } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
1021 for (Arg *A : Args) {
1022 const Option &O = A->getOption();
1023 if (O.matches(options::OPT_fcolor_diagnostics) ||
1024 O.matches(options::OPT_fdiagnostics_color)) {
1025 ShowColors = Colors_On;
1026 }
else if (O.matches(options::OPT_fno_color_diagnostics) ||
1027 O.matches(options::OPT_fno_diagnostics_color)) {
1028 ShowColors = Colors_Off;
1029 }
else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
1030 StringRef
Value(A->getValue());
1031 if (
Value ==
"always")
1032 ShowColors = Colors_On;
1033 else if (
Value ==
"never")
1034 ShowColors = Colors_Off;
1035 else if (
Value ==
"auto")
1036 ShowColors = Colors_Auto;
1039 return ShowColors == Colors_On ||
1040 (ShowColors == Colors_Auto &&
1041 llvm::sys::Process::StandardErrHasColors());
1046 bool DefaultDiagColor,
bool DefaultShowOpt) {
1047 using namespace options;
1052 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
1054 Opts.IgnoreWarnings = Args.hasArg(OPT_w);
1055 Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
1056 Opts.Pedantic = Args.hasArg(OPT_pedantic);
1057 Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
1058 Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
1060 Opts.ShowColumn = Args.hasFlag(OPT_fshow_column,
1061 OPT_fno_show_column,
1063 Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info);
1064 Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);
1065 Opts.AbsolutePath = Args.hasArg(OPT_fdiagnostics_absolute_paths);
1066 Opts.ShowOptionNames =
1067 Args.hasFlag(OPT_fdiagnostics_show_option,
1068 OPT_fno_diagnostics_show_option, DefaultShowOpt);
1070 llvm::sys::Process::UseANSIEscapeCodes(Args.hasArg(OPT_fansi_escape_codes));
1073 Opts.ShowNoteIncludeStack =
false;
1074 if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack,
1075 OPT_fno_diagnostics_show_note_include_stack))
1076 if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))
1077 Opts.ShowNoteIncludeStack =
true;
1079 StringRef ShowOverloads =
1080 Args.getLastArgValue(OPT_fshow_overloads_EQ,
"all");
1081 if (ShowOverloads ==
"best")
1083 else if (ShowOverloads ==
"all")
1084 Opts.setShowOverloads(
Ovl_All);
1088 Diags->
Report(diag::err_drv_invalid_value)
1089 << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)
1093 StringRef ShowCategory =
1094 Args.getLastArgValue(OPT_fdiagnostics_show_category,
"none");
1095 if (ShowCategory ==
"none")
1096 Opts.ShowCategories = 0;
1097 else if (ShowCategory ==
"id")
1098 Opts.ShowCategories = 1;
1099 else if (ShowCategory ==
"name")
1100 Opts.ShowCategories = 2;
1104 Diags->
Report(diag::err_drv_invalid_value)
1105 << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)
1110 Args.getLastArgValue(OPT_fdiagnostics_format,
"clang");
1111 if (Format ==
"clang")
1113 else if (Format ==
"msvc")
1115 else if (Format ==
"msvc-fallback") {
1117 Opts.CLFallbackMode =
true;
1118 }
else if (Format ==
"vi")
1123 Diags->
Report(diag::err_drv_invalid_value)
1124 << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)
1128 Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
1129 Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
1130 Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);
1131 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);
1134 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ),
1136 if (Args.hasArg(OPT_verify_ignore_unexpected))
1138 Opts.setVerifyIgnoreUnexpected(DiagMask);
1139 Opts.ElideType = !Args.hasArg(OPT_fno_elide_type);
1140 Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);
1142 Opts.MacroBacktraceLimit =
1146 Args, OPT_ftemplate_backtrace_limit,
1149 Args, OPT_fconstexpr_backtrace_limit,
1152 Args, OPT_fspell_checking_limit,
1155 Args, OPT_fcaret_diagnostics_max_lines,
1162 Diags->
Report(diag::warn_ignoring_ftabstop_value)
1173 Opts.
WorkingDir = Args.getLastArgValue(OPT_working_directory);
1181 std::string &BlockName,
1182 unsigned &MajorVersion,
1183 unsigned &MinorVersion,
1185 std::string &UserInfo) {
1187 Arg.split(Args,
':', 5);
1188 if (Args.size() < 5)
1191 BlockName = Args[0];
1192 if (Args[1].getAsInteger(10, MajorVersion))
return true;
1193 if (Args[2].getAsInteger(10, MinorVersion))
return true;
1194 if (Args[3].getAsInteger(2, Hashed))
return true;
1195 if (Args.size() > 4)
1203 using namespace options;
1205 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
1206 switch (A->getOption().getID()) {
1208 llvm_unreachable(
"Invalid option in group!");
1212 case OPT_ast_dump_all:
1213 case OPT_ast_dump_lookups:
1219 case OPT_dump_raw_tokens:
1221 case OPT_dump_tokens:
1225 case OPT_emit_llvm_bc:
1231 case OPT_emit_llvm_only:
1233 case OPT_emit_codegen_only:
1242 case OPT_emit_module:
1244 case OPT_emit_module_interface:
1252 case OPT_fsyntax_only:
1254 case OPT_module_file_info:
1256 case OPT_verify_pch:
1258 case OPT_print_decl_contexts:
1260 case OPT_print_preamble:
1264 case OPT_rewrite_macros:
1266 case OPT_rewrite_objc:
1268 case OPT_rewrite_test:
1279 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
1280 Opts.
Plugins.emplace_back(A->getValue(0));
1285 for (
const Arg *AA : Args.filtered(OPT_plugin_arg))
1286 Opts.
PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
1288 for (
const std::string &Arg :
1289 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
1290 std::string BlockName;
1291 unsigned MajorVersion;
1292 unsigned MinorVersion;
1294 std::string UserInfo;
1296 MinorVersion, Hashed, UserInfo)) {
1297 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
1304 std::make_shared<TestModuleFileExtension>(
1305 BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
1308 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
1312 Diags.
Report(diag::err_drv_invalid_value)
1313 << A->getAsString(Args) << A->getValue();
1317 Opts.
OutputFile = Args.getLastArgValue(OPT_o);
1318 Opts.
Plugins = Args.getAllArgValues(OPT_load);
1320 Opts.
ShowHelp = Args.hasArg(OPT_help);
1321 Opts.
ShowStats = Args.hasArg(OPT_print_stats);
1322 Opts.
ShowTimers = Args.hasArg(OPT_ftime_report);
1325 Opts.
LLVMArgs = Args.getAllArgValues(OPT_mllvm);
1331 Opts.
ASTDumpAll = Args.hasArg(OPT_ast_dump_all);
1332 Opts.
ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter);
1336 Opts.
ModuleMapFiles = Args.getAllArgValues(OPT_fmodule_map_file);
1337 Opts.
ModuleFiles = Args.getAllArgValues(OPT_fmodule_file);
1343 = Args.hasArg(OPT_code_completion_macros);
1345 = Args.hasArg(OPT_code_completion_patterns);
1347 = !Args.hasArg(OPT_no_code_completion_globals);
1349 = Args.hasArg(OPT_code_completion_brief_comments);
1352 = Args.getLastArgValue(OPT_foverride_record_layout_EQ);
1355 Opts.
FindPchSource = Args.getLastArgValue(OPT_find_pch_source_EQ);
1356 Opts.
StatsFile = Args.getLastArgValue(OPT_stats_file);
1358 if (
const Arg *A = Args.getLastArg(OPT_arcmt_check,
1360 OPT_arcmt_migrate)) {
1361 switch (A->getOption().getID()) {
1363 llvm_unreachable(
"missed a case");
1364 case OPT_arcmt_check:
1367 case OPT_arcmt_modify:
1370 case OPT_arcmt_migrate:
1375 Opts.
MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory);
1377 = Args.getLastArgValue(OPT_arcmt_migrate_report_output);
1379 = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
1381 if (Args.hasArg(OPT_objcmt_migrate_literals))
1383 if (Args.hasArg(OPT_objcmt_migrate_subscripting))
1385 if (Args.hasArg(OPT_objcmt_migrate_property_dot_syntax))
1387 if (Args.hasArg(OPT_objcmt_migrate_property))
1389 if (Args.hasArg(OPT_objcmt_migrate_readonly_property))
1391 if (Args.hasArg(OPT_objcmt_migrate_readwrite_property))
1393 if (Args.hasArg(OPT_objcmt_migrate_annotation))
1395 if (Args.hasArg(OPT_objcmt_returns_innerpointer_property))
1397 if (Args.hasArg(OPT_objcmt_migrate_instancetype))
1399 if (Args.hasArg(OPT_objcmt_migrate_nsmacros))
1401 if (Args.hasArg(OPT_objcmt_migrate_protocol_conformance))
1403 if (Args.hasArg(OPT_objcmt_atomic_property))
1405 if (Args.hasArg(OPT_objcmt_ns_nonatomic_iosonly))
1407 if (Args.hasArg(OPT_objcmt_migrate_designated_init))
1409 if (Args.hasArg(OPT_objcmt_migrate_all))
1416 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1417 <<
"ARC migration" <<
"ObjC migration";
1421 if (
const Arg *A = Args.getLastArg(OPT_x)) {
1422 StringRef XValue = A->getValue();
1426 bool Preprocessed = XValue.consume_back(
"-cpp-output");
1427 bool ModuleMap = XValue.consume_back(
"-module-map");
1429 !Preprocessed && !ModuleMap && XValue.consume_back(
"-header");
1432 DashX = llvm::StringSwitch<InputKind>(XValue)
1444 if (DashX.
isUnknown() && Preprocessed && !IsHeaderFile && !ModuleMap)
1445 DashX = llvm::StringSwitch<InputKind>(XValue)
1452 DashX = llvm::StringSwitch<InputKind>(XValue)
1455 .Cases(
"ast",
"pcm",
1461 Diags.
Report(diag::err_drv_invalid_value)
1462 << A->getAsString(Args) << A->getValue();
1471 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
1474 Inputs.push_back(
"-");
1475 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
1479 StringRef(Inputs[i]).rsplit(
'.').second);
1493 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK);
1501 std::string ClangExecutable =
1502 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
1503 StringRef Dir = llvm::sys::path::parent_path(ClangExecutable);
1506 StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
1508 if (ClangResourceDir !=
"")
1509 llvm::sys::path::append(P, ClangResourceDir);
1511 llvm::sys::path::append(P,
"..", Twine(
"lib") + CLANG_LIBDIR_SUFFIX,
1512 "clang", CLANG_VERSION_STRING);
1518 const std::string &WorkingDir) {
1519 using namespace options;
1520 Opts.
Sysroot = Args.getLastArgValue(OPT_isysroot,
"/");
1521 Opts.
Verbose = Args.hasArg(OPT_v);
1525 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
1526 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
1527 Opts.
ResourceDir = Args.getLastArgValue(OPT_resource_dir);
1531 if (!(
P.empty() || llvm::sys::path::is_absolute(
P))) {
1532 if (WorkingDir.empty())
1533 llvm::sys::fs::make_absolute(
P);
1535 llvm::sys::fs::make_absolute(WorkingDir,
P);
1537 llvm::sys::path::remove_dots(
P);
1541 for (
const Arg *A : Args.filtered(OPT_fprebuilt_module_path))
1546 !Args.hasArg(OPT_fmodules_disable_diagnostic_validation);
1554 Args.hasArg(OPT_fmodules_validate_once_per_build_session);
1558 Args.hasArg(OPT_fmodules_validate_system_headers);
1559 if (
const Arg *A = Args.getLastArg(OPT_fmodule_format_EQ))
1562 for (
const Arg *A : Args.filtered(OPT_fmodules_ignore_macro)) {
1563 StringRef MacroDef = A->getValue();
1565 llvm::CachedHashString(MacroDef.split(
'=').first));
1569 bool IsIndexHeaderMap =
false;
1570 bool IsSysrootSpecified =
1571 Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
1572 for (
const Arg *A : Args.filtered(OPT_I, OPT_F, OPT_index_header_map)) {
1573 if (A->getOption().matches(OPT_index_header_map)) {
1575 IsIndexHeaderMap =
true;
1582 bool IsFramework = A->getOption().matches(OPT_F);
1583 std::string Path = A->getValue();
1585 if (IsSysrootSpecified && !IsFramework && A->getValue()[0] ==
'=') {
1587 llvm::sys::path::append(Buffer, Opts.
Sysroot,
1588 llvm::StringRef(A->getValue()).substr(1));
1589 Path = Buffer.str();
1592 Opts.
AddPath(Path, Group, IsFramework,
1594 IsIndexHeaderMap =
false;
1598 StringRef Prefix =
"";
1600 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
1601 if (A->getOption().matches(OPT_iprefix))
1602 Prefix = A->getValue();
1603 else if (A->getOption().matches(OPT_iwithprefix))
1609 for (
const Arg *A : Args.filtered(OPT_idirafter))
1611 for (
const Arg *A : Args.filtered(OPT_iquote))
1613 for (
const Arg *A : Args.filtered(OPT_isystem, OPT_iwithsysroot))
1615 !A->getOption().matches(OPT_iwithsysroot));
1616 for (
const Arg *A : Args.filtered(OPT_iframework))
1618 for (
const Arg *A : Args.filtered(OPT_iframeworkwithsysroot))
1623 for (
const Arg *A : Args.filtered(OPT_c_isystem))
1625 for (
const Arg *A : Args.filtered(OPT_cxx_isystem))
1627 for (
const Arg *A : Args.filtered(OPT_objc_isystem))
1629 for (
const Arg *A : Args.filtered(OPT_objcxx_isystem))
1634 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
1636 if (A->getOption().matches(OPT_internal_externc_isystem))
1638 Opts.
AddPath(A->getValue(), Group,
false,
true);
1643 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
1645 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
1647 for (
const Arg *A : Args.filtered(OPT_ivfsoverlay))
1652 const llvm::Triple &T,
1663 Opts.AsmPreprocessor = 1;
1665 Opts.ObjC1 = Opts.ObjC2 = 1;
1673 llvm_unreachable(
"Invalid input kind!");
1675 LangStd = LangStandard::lang_opencl10;
1678 LangStd = LangStandard::lang_cuda;
1684 LangStd = LangStandard::lang_gnu99;
1686 LangStd = LangStandard::lang_gnu11;
1689 LangStd = LangStandard::lang_gnu11;
1695 LangStd = LangStandard::lang_gnucxx11;
1697 LangStd = LangStandard::lang_gnucxx98;
1700 LangStd = LangStandard::lang_c99;
1707 Opts.C99 = Std.
isC99();
1708 Opts.C11 = Std.
isC11();
1716 Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus;
1722 if (LangStd == LangStandard::lang_opencl10)
1723 Opts.OpenCLVersion = 100;
1724 else if (LangStd == LangStandard::lang_opencl11)
1725 Opts.OpenCLVersion = 110;
1726 else if (LangStd == LangStandard::lang_opencl12)
1727 Opts.OpenCLVersion = 120;
1728 else if (LangStd == LangStandard::lang_opencl20)
1729 Opts.OpenCLVersion = 200;
1735 Opts.LaxVectorConversions = 0;
1737 Opts.NativeHalfType = 1;
1738 Opts.NativeHalfArgsAndReturns = 1;
1740 if (Opts.IncludeDefaultHeader) {
1741 PPOpts.
Includes.push_back(
"opencl-c.h");
1751 if (Opts.RenderScript) {
1752 Opts.NativeHalfType = 1;
1753 Opts.NativeHalfArgsAndReturns = 1;
1757 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
1760 Opts.Half = Opts.OpenCL;
1763 Opts.WChar = Opts.CPlusPlus;
1765 Opts.GNUKeywords = Opts.GNUMode;
1766 Opts.CXXOperatorNames = Opts.CPlusPlus;
1768 Opts.AlignedAllocation = Opts.CPlusPlus1z;
1770 Opts.DollarIdents = !Opts.AsmPreprocessor;
1776 StringRef value = arg->getValue();
1777 if (value ==
"default") {
1779 }
else if (value ==
"hidden" || value ==
"internal") {
1781 }
else if (value ==
"protected") {
1786 diags.
Report(diag::err_drv_invalid_value)
1787 << arg->getAsString(args) << value;
1797 llvm_unreachable(
"should not parse language flags for this input");
1823 llvm_unreachable(
"unexpected input language");
1832 return "Objective-C";
1836 return "Objective-C++";
1842 return "RenderScript";
1852 llvm_unreachable(
"unknown input language");
1861 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
1862 LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
1864 .Case(name, LangStandard::lang_##
id)
1865 #define LANGSTANDARD_ALIAS(id, alias) \
1866 .Case(alias, LangStandard::lang_##id)
1867 #include "clang/Frontend/LangStandards.def"
1870 Diags.
Report(diag::err_drv_invalid_value)
1871 << A->getAsString(Args) << A->getValue();
1873 for (
unsigned KindValue = 0;
1877 static_cast<LangStandard::Kind>(KindValue));
1879 auto Diag = Diags.
Report(diag::note_drv_use_standard);
1881 unsigned NumAliases = 0;
1882 #define LANGSTANDARD(id, name, lang, desc, features)
1883 #define LANGSTANDARD_ALIAS(id, alias) \
1884 if (KindValue == LangStandard::lang_##id) ++NumAliases;
1885 #define LANGSTANDARD_ALIAS_DEPR(id, alias)
1886 #include "clang/Frontend/LangStandards.def"
1888 #define LANGSTANDARD(id, name, lang, desc, features)
1889 #define LANGSTANDARD_ALIAS(id, alias) \
1890 if (KindValue == LangStandard::lang_##id) Diag << alias;
1891 #define LANGSTANDARD_ALIAS_DEPR(id, alias)
1892 #include "clang/Frontend/LangStandards.def"
1900 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1908 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
1910 = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
1911 .Cases(
"cl",
"CL", LangStandard::lang_opencl10)
1912 .Cases(
"cl1.1",
"CL1.1", LangStandard::lang_opencl11)
1913 .Cases(
"cl1.2",
"CL1.2", LangStandard::lang_opencl12)
1914 .Cases(
"cl2.0",
"CL2.0", LangStandard::lang_opencl20)
1918 Diags.
Report(diag::err_drv_invalid_value)
1919 << A->getAsString(Args) << A->getValue();
1922 LangStd = OpenCLLangStd;
1925 Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
1927 llvm::Triple T(TargetOpts.
Triple);
1933 if (Args.getLastArg(OPT_cl_strict_aliasing)
1934 && Opts.OpenCLVersion > 100) {
1935 std::string VerSpec = llvm::to_string(Opts.OpenCLVersion / 100) +
1937 llvm::to_string((Opts.OpenCLVersion % 100) / 10);
1938 Diags.
Report(diag::warn_option_invalid_ocl_version)
1939 << VerSpec << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
1947 Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
1950 if (Args.hasArg(OPT_fno_operator_names))
1951 Opts.CXXOperatorNames = 0;
1953 if (Args.hasArg(OPT_fcuda_is_device))
1954 Opts.CUDAIsDevice = 1;
1956 if (Args.hasArg(OPT_fcuda_allow_variadic_functions))
1957 Opts.CUDAAllowVariadicFunctions = 1;
1959 if (Args.hasArg(OPT_fno_cuda_host_device_constexpr))
1960 Opts.CUDAHostDeviceConstexpr = 0;
1962 if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_flush_denormals_to_zero))
1963 Opts.CUDADeviceFlushDenormalsToZero = 1;
1965 if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_approx_transcendentals))
1966 Opts.CUDADeviceApproxTranscendentals = 1;
1969 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
1970 StringRef value = arg->getValue();
1972 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
1975 if (Args.hasArg(OPT_fobjc_gc_only))
1977 else if (Args.hasArg(OPT_fobjc_gc))
1979 else if (Args.hasArg(OPT_fobjc_arc)) {
1980 Opts.ObjCAutoRefCount = 1;
1982 Diags.
Report(diag::err_arc_unsupported_on_runtime);
1989 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
1990 Opts.ObjCWeakRuntime = 1;
1996 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
1997 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
1998 assert(!Opts.ObjCWeak);
2000 Diags.
Report(diag::err_objc_weak_with_gc);
2001 }
else if (!Opts.ObjCWeakRuntime) {
2002 Diags.
Report(diag::err_objc_weak_unsupported);
2006 }
else if (Opts.ObjCAutoRefCount) {
2007 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
2010 if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
2011 Opts.ObjCInferRelatedResultType = 0;
2013 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
2014 Opts.ObjCSubscriptingLegacyRuntime =
2018 if (Args.hasArg(OPT_fgnu89_inline)) {
2020 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2026 if (Args.hasArg(OPT_fapple_kext)) {
2027 if (!Opts.CPlusPlus)
2028 Diags.
Report(diag::warn_c_kext);
2033 if (Args.hasArg(OPT_print_ivar_layout))
2034 Opts.ObjCGCBitmapPrint = 1;
2035 if (Args.hasArg(OPT_fno_constant_cfstrings))
2036 Opts.NoConstantCFStrings = 1;
2038 if (Args.hasArg(OPT_fzvector))
2041 if (Args.hasArg(OPT_pthread))
2042 Opts.POSIXThreads = 1;
2045 if (Arg *visOpt = Args.getLastArg(OPT_fvisibility)) {
2052 if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) {
2055 Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode());
2058 if (Args.hasArg(OPT_fvisibility_inlines_hidden))
2059 Opts.InlineVisibilityHidden = 1;
2061 if (Args.hasArg(OPT_ftrapv)) {
2065 Args.getLastArgValue(OPT_ftrapv_handler);
2067 else if (Args.hasArg(OPT_fwrapv))
2070 Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility);
2071 Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions);
2072 Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt;
2073 Opts.MSCompatibilityVersion = 0;
2074 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
2077 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
2079 Opts.MSCompatibilityVersion = VT.
getMajor() * 10000000 +
2080 VT.
getMinor().getValueOr(0) * 100000 +
2087 Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus1z;
2089 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
2091 Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
2092 OPT_fno_dollars_in_identifiers,
2094 Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
2096 Opts.Borland = Args.hasArg(OPT_fborland_extensions);
2097 Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
2098 Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
2100 if (Args.hasArg(OPT_fno_lax_vector_conversions))
2101 Opts.LaxVectorConversions = 0;
2102 if (Args.hasArg(OPT_fno_threadsafe_statics))
2103 Opts.ThreadsafeStatics = 0;
2104 Opts.Exceptions = Args.hasArg(OPT_fexceptions);
2105 Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
2106 Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
2107 Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions);
2108 Opts.ExternCNoUnwind = Args.hasArg(OPT_fexternc_nounwind);
2109 Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
2111 Opts.RTTI = Opts.CPlusPlus && !Args.hasArg(OPT_fno_rtti);
2112 Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data);
2113 Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
2114 && Opts.OpenCLVersion >= 200);
2115 Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
2116 Opts.CoroutinesTS = Args.hasArg(OPT_fcoroutines_ts);
2117 Opts.ModulesTS = Args.hasArg(OPT_fmodules_ts);
2118 Opts.Modules = Args.hasArg(OPT_fmodules) || Opts.ModulesTS;
2119 Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse);
2120 Opts.ModulesDeclUse =
2121 Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse;
2122 Opts.ModulesLocalVisibility =
2123 Args.hasArg(OPT_fmodules_local_submodule_visibility) || Opts.ModulesTS;
2124 Opts.ModulesCodegen = Args.hasArg(OPT_fmodules_codegen);
2125 Opts.ModulesDebugInfo = Args.hasArg(OPT_fmodules_debuginfo);
2126 Opts.ModulesSearchAll = Opts.Modules &&
2127 !Args.hasArg(OPT_fno_modules_search_all) &&
2128 Args.hasArg(OPT_fmodules_search_all);
2129 Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery);
2130 Opts.ImplicitModules = !Args.hasArg(OPT_fno_implicit_modules);
2131 Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);
2132 Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);
2133 Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar,
false);
2134 Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
2135 Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
2136 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
2137 if (!Opts.NoBuiltin)
2139 Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);
2140 Opts.RelaxedTemplateTemplateArgs =
2141 Args.hasArg(OPT_frelaxed_template_template_args);
2142 Opts.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation);
2143 Opts.AlignedAllocation =
2144 Args.hasFlag(OPT_faligned_allocation, OPT_fno_aligned_allocation,
2145 Opts.AlignedAllocation);
2146 Opts.AlignedAllocationUnavailable =
2147 Opts.AlignedAllocation && Args.hasArg(OPT_aligned_alloc_unavailable);
2148 Opts.NewAlignOverride =
2150 if (Opts.NewAlignOverride && !llvm::isPowerOf2_32(Opts.NewAlignOverride)) {
2151 Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
2152 Diags.
Report(diag::err_fe_invalid_alignment) << A->getAsString(Args)
2154 Opts.NewAlignOverride = 0;
2156 Opts.ConceptsTS = Args.hasArg(OPT_fconcepts_ts);
2157 Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
2158 Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
2159 Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
2160 Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno);
2161 Opts.InstantiationDepth =
2165 Opts.ConstexprCallDepth =
2167 Opts.ConstexprStepLimit =
2170 Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing);
2171 Opts.NumLargeByValueCopy =
2173 Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
2175 Args.getLastArgValue(OPT_fconstant_string_class);
2176 Opts.ObjCDefaultSynthProperties =
2177 !Args.hasArg(OPT_disable_objc_default_synthesize_properties);
2178 Opts.EncodeExtendedBlockSig =
2179 Args.hasArg(OPT_fencode_extended_block_signature);
2180 Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
2183 Opts.AlignDouble = Args.hasArg(OPT_malign_double);
2185 Opts.PIE = Args.hasArg(OPT_pic_is_pie);
2186 Opts.Static = Args.hasArg(OPT_static_define);
2187 Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
2188 Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple
2189 || Args.hasArg(OPT_fdump_record_layouts);
2190 Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
2191 Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
2192 Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
2193 Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant);
2194 Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math);
2195 Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat);
2196 Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
2197 Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
2198 Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
2199 Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
2200 Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
2201 Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
2202 Opts.
CurrentModule = Args.getLastArgValue(OPT_fmodule_name_EQ);
2203 Opts.AppExt = Args.hasArg(OPT_fapplication_extension);
2206 Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
2207 Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
2210 Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
2211 | Opts.NativeHalfArgsAndReturns;
2212 Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
2222 Opts.DeclSpecKeyword =
2223 Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec,
2224 (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA));
2226 if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) {
2227 switch (llvm::StringSwitch<unsigned>(A->getValue())
2233 Diags.
Report(diag::err_drv_invalid_value)
2234 <<
"-faddress-space-map-mangling=" << A->getValue();
2248 if (Arg *A = Args.getLastArg(OPT_fms_memptr_rep_EQ)) {
2250 llvm::StringSwitch<LangOptions::PragmaMSPointersToMembersKind>(
2260 Diags.
Report(diag::err_drv_invalid_value)
2261 <<
"-fms-memptr-rep=" << A->getValue();
2263 Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel);
2267 if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
2269 llvm::StringSwitch<LangOptions::DefaultCallingConvention>(
2277 Diags.
Report(diag::err_drv_invalid_value)
2278 <<
"-fdefault-calling-conv=" << A->getValue();
2280 llvm::Triple T(TargetOpts.
Triple);
2281 llvm::Triple::ArchType Arch = T.getArch();
2284 Arch != llvm::Triple::x86;
2286 !(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64);
2288 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2289 << A->getSpelling() << T.getTriple();
2291 Opts.setDefaultCallingConv(DefaultCC);
2295 if (Arg *A = Args.getLastArg(OPT_mrtd)) {
2297 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2298 << A->getSpelling() <<
"-fdefault-calling-conv";
2300 llvm::Triple T(TargetOpts.
Triple);
2301 if (T.getArch() != llvm::Triple::x86)
2302 Diags.
Report(diag::err_drv_argument_not_allowed_with)
2303 << A->getSpelling() << T.getTriple();
2310 Opts.OpenMP = Args.hasArg(options::OPT_fopenmp) ? 1 : 0;
2312 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
2313 Opts.OpenMPIsDevice =
2314 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_device);
2320 Opts.OpenMP = Version;
2323 if (!Opts.OpenMPIsDevice) {
2324 switch (T.getArch()) {
2328 case llvm::Triple::nvptx:
2329 case llvm::Triple::nvptx64:
2330 Diags.
Report(clang::diag::err_drv_omp_host_target_not_supported)
2338 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
2340 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
2341 llvm::Triple TT(A->getValue(i));
2343 if (TT.getArch() == llvm::Triple::UnknownArch)
2344 Diags.
Report(clang::diag::err_drv_invalid_omp_target) << A->getValue(i);
2352 if (Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) {
2355 Diags.
Report(clang::diag::err_drv_omp_host_ir_file_not_found)
2360 Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
2361 OPT_fno_deprecated_macro,
2367 Opts.Optimize = Opt != 0;
2368 Opts.OptimizeSize = OptSize != 0;
2373 Opts.NoInlineDefine = !Opts.Optimize;
2374 if (Arg *InlineArg = Args.getLastArg(
2375 options::OPT_finline_functions, options::OPT_finline_hint_functions,
2376 options::OPT_fno_inline_functions, options::OPT_fno_inline))
2377 if (InlineArg->getOption().matches(options::OPT_fno_inline))
2378 Opts.NoInlineDefine =
true;
2380 Opts.FastMath = Args.hasArg(OPT_ffast_math) ||
2381 Args.hasArg(OPT_cl_fast_relaxed_math);
2382 Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) ||
2383 Args.hasArg(OPT_cl_finite_math_only) ||
2384 Args.hasArg(OPT_cl_fast_relaxed_math);
2385 Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
2386 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
2387 Args.hasArg(OPT_cl_fast_relaxed_math);
2389 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
2390 StringRef Val = A->getValue();
2393 else if (Val ==
"on")
2395 else if (Val ==
"off")
2398 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
2401 Opts.RetainCommentsFromSystemHeaders =
2402 Args.hasArg(OPT_fretain_comments_from_system_headers);
2407 Diags.
Report(diag::err_drv_invalid_value)
2408 << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
2420 Opts.SanitizeAddressFieldPadding =
2425 Opts.XRayInstrument =
2426 Args.hasFlag(OPT_fxray_instrument, OPT_fnoxray_instrument,
false);
2430 Args.getAllArgValues(OPT_fxray_always_instrument);
2432 Args.getAllArgValues(OPT_fxray_never_instrument);
2435 Opts.AllowEditorPlaceholders = Args.hasArg(OPT_fallow_editor_placeholders);
2476 llvm_unreachable(
"invalid frontend action");
2483 using namespace options;
2486 if (
const Arg *A = Args.getLastArg(OPT_token_cache))
2491 Opts.
DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record);
2496 for (
const Arg *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
2499 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
2500 StringRef
Value(A->getValue());
2503 unsigned EndOfLine = 0;
2505 if (Comma == StringRef::npos ||
2506 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
2507 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
2508 Diags.
Report(diag::err_drv_preamble_format);
2516 for (
const Arg *A : Args.filtered(OPT_D, OPT_U)) {
2517 if (A->getOption().matches(OPT_D))
2526 for (
const Arg *A : Args.filtered(OPT_include))
2527 Opts.
Includes.emplace_back(A->getValue());
2529 for (
const Arg *A : Args.filtered(OPT_chain_include))
2532 for (
const Arg *A : Args.filtered(OPT_remap_file)) {
2533 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
2535 if (Split.second.empty()) {
2536 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
2543 if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
2544 StringRef
Name = A->getValue();
2545 unsigned Library = llvm::StringSwitch<unsigned>(
Name)
2551 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
2566 using namespace options;
2569 Opts.
ShowCPP = !Args.hasArg(OPT_dM);
2576 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
2585 using namespace options;
2586 Opts.
ABI = Args.getLastArgValue(OPT_target_abi);
2587 if (Arg *A = Args.getLastArg(OPT_meabi)) {
2588 StringRef
Value = A->getValue();
2589 llvm::EABI EABIVersion = llvm::StringSwitch<llvm::EABI>(
Value)
2591 .Case(
"4", llvm::EABI::EABI4)
2592 .Case(
"5", llvm::EABI::EABI5)
2593 .Case(
"gnu", llvm::EABI::GNU)
2596 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
2601 Opts.
CPU = Args.getLastArgValue(OPT_target_cpu);
2602 Opts.
FPMath = Args.getLastArgValue(OPT_mfpmath);
2604 Opts.
LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);
2606 Opts.
Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ);
2609 Opts.
Triple = llvm::sys::getDefaultTargetTriple();
2614 const char *
const *ArgBegin,
2615 const char *
const *ArgEnd,
2617 bool Success =
true;
2622 unsigned MissingArgIndex, MissingArgCount;
2624 Opts->ParseArgs(llvm::makeArrayRef(ArgBegin, ArgEnd), MissingArgIndex,
2625 MissingArgCount, IncludedFlagsBitmask);
2629 if (MissingArgCount) {
2630 Diags.
Report(diag::err_drv_missing_argument)
2631 << Args.getArgString(MissingArgIndex) << MissingArgCount;
2636 for (
const Arg *A : Args.filtered(OPT_UNKNOWN)) {
2637 Diags.
Report(diag::err_drv_unknown_argument) << A->getAsString(Args);
2662 if (Args.hasArg(OPT_fobjc_arc))
2663 LangOpts.ObjCAutoRefCount = 1;
2667 LangOpts.PIE = Args.hasArg(OPT_pic_is_pie);
2676 LangOpts.ObjCExceptions = 1;
2679 if (LangOpts.CUDA) {
2682 if (LangOpts.CUDAIsDevice)
2687 if (LangOpts.OpenMPIsDevice)
2709 auto Arch = T.getArch();
2710 if (Arch == llvm::Triple::spir || Arch == llvm::Triple::spir64) {
2719 using llvm::hash_code;
2720 using llvm::hash_value;
2721 using llvm::hash_combine;
2729 #define LANGOPT(Name, Bits, Default, Description) \
2730 code = hash_combine(code, LangOpts->Name);
2731 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
2732 code = hash_combine(code, static_cast<unsigned>(LangOpts->get##Name()));
2733 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
2734 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
2735 #include "clang/Basic/LangOptions.def"
2737 for (StringRef Feature : LangOpts->ModuleFeatures)
2738 code = hash_combine(code, Feature);
2741 code = hash_combine(code, TargetOpts->Triple, TargetOpts->CPU,
2743 for (
unsigned i = 0, n = TargetOpts->FeaturesAsWritten.size(); i != n; ++i)
2744 code = hash_combine(code, TargetOpts->FeaturesAsWritten[i]);
2751 for (std::vector<std::pair<std::string, bool/*isUndef*/>>::const_iterator
2752 I = getPreprocessorOpts().Macros.begin(),
2753 IEnd = getPreprocessorOpts().Macros.end();
2759 StringRef MacroDef =
I->first;
2761 llvm::CachedHashString(MacroDef.split(
'=').first)))
2765 code = hash_combine(code,
I->first,
I->second);
2769 code = hash_combine(code, hsOpts.
Sysroot,
2785 code = ext->hashExtension(code);
2792 if (!SanHash.
empty())
2793 code = hash_combine(code, SanHash.
Mask);
2795 return llvm::APInt(64, code).toString(36,
false);
2800 template<
typename IntTy>
2805 if (Arg *A = Args.getLastArg(Id)) {
2806 if (StringRef(A->getValue()).getAsInteger(10, Res)) {
2808 Diags->
Report(diag::err_drv_invalid_int_value) << A->getAsString(Args)
2819 return getLastArgIntValueImpl<int>(Args, Id,
Default, Diags);
2825 return getLastArgIntValueImpl<uint64_t>(Args, Id,
Default, Diags);
2834 static const size_t kGraveYardMaxSize = 16;
2835 LLVM_ATTRIBUTE_UNUSED
static const void *GraveYard[kGraveYardMaxSize];
2836 static std::atomic<unsigned> GraveYardSize;
2837 unsigned Idx = GraveYardSize++;
2838 if (Idx >= kGraveYardMaxSize)
2840 GraveYard[Idx] = Ptr;
2860 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
Buffer =
2861 BaseFS->getBufferForFile(File);
2863 Diags.
Report(diag::err_missing_vfs_overlay_file) << File;
2868 std::move(Buffer.get()),
nullptr, File);
2870 Diags.
Report(diag::err_invalid_vfs_overlay) << File;
2873 Overlay->pushOverlay(FS);
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
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)
annotate property with NS_RETURNS_INNER_POINTER
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.
Conform to the underlying platform's C and C++ ABIs as closely as we can.
std::string ObjCMTWhiteListPath
std::string DwarfDebugFlags
The string to embed in the debug information for the compile unit, if non-empty.
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.
Represents a version number in the form major[.minor[.subminor[.build]]].
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)
Implements support for file system lookup, file system caching, and directory search management...
TargetOptions & getTargetOpts()
Defines the clang::FileManager interface and associated types.
Parse and perform semantic analysis.
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
static SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
static StringRef getCodeModel(ArgList &Args, DiagnosticsEngine &Diags)
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()
IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
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)
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.
Enable annotation of ObjCMethods of all kinds.
bool isGNUMode() const
isGNUMode - Language includes GNU extensions.
unsigned IncludeModuleFiles
Include module file dependencies.
Parse ASTs and print them.
Enable migration to modern ObjC readonly property.
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 FPDenormalMode
The floating-point denormal mode to use.
Optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
Enable migration to modern ObjC readwrite property.
unsigned visualizeExplodedGraphWithGraphViz
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
Like System, but only used for ObjC++.
std::unique_ptr< llvm::MemoryBuffer > Buffer
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.
bool allowsWeak() const
Does this runtime allow the use of __weak?
#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, DiagnosticsEngine &Diags, const TargetOptions &TargetOpts)
std::vector< std::string > RewriteMapFiles
Set of files defining the rules for the symbol rewriting.
bool hasLineComments() const
Language supports '//' comments.
static const LangStandard & getLangStandardForKind(Kind K)
std::string ASTDumpFilter
If given, filter dumped AST Decl nodes by this substring.
const char * getDescription() const
getDescription - Get the description of this standard.
std::string getModuleHash() const
Retrieve a module hash string that is suitable for uniquely identifying the conditions under which th...
Objects with "hidden" visibility are not seen by the dynamic linker.
static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, const std::string &WorkingDir)
std::string ImplicitPTHInclude
The implicit PTH input included at the start of the translation unit, or empty.
Options for controlling the target.
InputKind::Language getLanguage() const
Get the language that this standard describes.
bool allowsARC() const
Does this runtime allow ARC at all?
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)
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
Enable migration to modern ObjC literals.
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 that we'll break out.
Like System, but searched after the system directories.
std::string DebugPass
Enable additional debugging information.
Attempt to be ABI-compatible with code generated by Clang 4.0.x (SVN r291814).
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.
std::vector< std::string > Reciprocals
std::vector< std::string > CudaGpuBinaryFileNames
A list of file names passed with -fcuda-include-gpubinary options to forward to CUDA runtime back-end...
std::string FindPchSource
If non-empty, search the pch input file as if it was a header included by this file.
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.
std::string FPMath
If given, the unit to use for floating point math.
bool isCPlusPlus11() const
isCPlusPlus11 - Language is a C++11 variant (or later).
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.
bool isCPlusPlus() const
isCPlusPlus - Language is a C++ variant.
unsigned IncludeSystemHeaders
Include system header dependencies.
IntrusiveRefCntPtr< FileSystem > getVFSFromYAML(std::unique_ptr< llvm::MemoryBuffer > Buffer, llvm::SourceMgr::DiagHandlerTy DiagHandler, StringRef YAMLFilePath, void *DiagContext=nullptr, IntrusiveRefCntPtr< FileSystem > ExternalFS=getRealFileSystem())
Gets a FileSystem for a virtual file system described in YAML format.
Translate input source into HTML.
Enable migration to NS_ENUM/NS_OPTIONS macros.
SanitizerMask Mask
Bitmask of enabled sanitizers.
unsigned DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
unsigned eagerlyAssumeBinOpBifurcation
The flag regulates if we should eagerly assume evaluations of conditionals, thus, bifurcating the pat...
std::vector< std::string > ASTMergeFiles
The list of AST files to merge.
std::string CodeModel
The code model to use (-mcmodel).
Print DeclContext and their Decls.
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...
unsigned IncludeCodePatterns
Show code patterns in code completion results.
Enable migration to modern ObjC property.
Action - Represent an abstract compilation step to perform.
A file system that allows overlaying one AbstractFileSystem on top of another.
Generate LLVM IR, but do not emit anything.
static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
CodeGenOptions & getCodeGenOpts()
unsigned ShowStats
Show frontend performance metrics and statistics.
Enable migration to add conforming protocols.
static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args)
static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
Visibility
Describes the different kinds of visibility that a declaration may have.
Concrete class used by the front-end to report problems and issues.
unsigned FixWhatYouCan
Apply fixes even if there are unfixable errors.
std::unique_ptr< llvm::opt::OptTable > createDriverOptTable()
std::vector< std::string > Warnings
The list of -W...
static StringRef getRelocModel(ArgList &Args, DiagnosticsEngine &Diags)
std::vector< std::pair< std::string, bool > > CheckersControlList
Pair of checker name and enable/disable.
AnalysisStores
AnalysisStores - Set of available analysis store models.
detail::InMemoryDirectory::const_iterator I
bool DisablePCHValidation
When true, disables most of the normal validation performed on precompiled headers.
static void setPGOUseInstrumentor(CodeGenOptions &Opts, const Twine &ProfileName)
unsigned FixAndRecompile
Apply fixes and recompile.
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.
static IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id, IntTy Default, DiagnosticsEngine *Diags)
Enable inferring NS_DESIGNATED_INITIALIZER for ObjC methods.
MigratorOptions & getMigratorOpts()
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.
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.
const char * getName() const
getName - Get the name of this standard.
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.
bool isCPlusPlus14() const
isCPlusPlus14 - Language is a C++14 variant (or later).
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...
unsigned UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
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 isOpenCL() const
isOpenCL - Language is a OpenCL variant.
bool hasDigraphs() const
hasDigraphs - Language supports digraphs.
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).
bool isCPlusPlus2a() const
isCPlusPlus2a - Language is a post-C++17 variant (or later).
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...
prefer 'atomic' property over 'nonatomic'.
unsigned RewriteIncludes
Preprocess include directives only.
unsigned ShowTimers
Show timers for individual actions.
std::string LinkerVersion
If given, the version string of the linker in use.
Only execute frontend initialization.
bool isCPlusPlus1z() const
isCPlusPlus1z - Language is a C++17 variant (or later).
Defines version macros and version-related utility functions for Clang.
std::string RelocationModel
The name of the relocation model to use.
Print the "preamble" of the input file.
unsigned LinkFlags
Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
IntrusiveRefCntPtr< vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
unsigned ShowHeaderIncludes
Show header inclusions (-H).
std::shared_ptr< llvm::Regex > OptimizationRemarkPattern
Regular expression to select optimizations for which we should enable optimization remarks...
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.
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.
clang::ObjCRuntime ObjCRuntime
static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, ArgList &Args, frontend::ActionKind Action)
bool empty() const
Returns true if at least one sanitizer is enabled.
unsigned FixOnlyWarnings
Apply fixes only for warnings.
bool hasImplicitInt() const
hasImplicitInt - Language allows variables to be typed as int implicitly.
unsigned NoNSAllocReallocError
static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, OptSpecifier GroupWithValue, std::vector< std::string > &Diagnostics)
std::string AuxTriple
Auxiliary triple for CUDA compilation.
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.
unsigned ShowIncludeDirectives
Print includes, imports etc. within preprocessed output.
enum clang::FrontendOptions::@166 ARCMTAction
std::string Filename
The filename of the bitcode file to link in.
unsigned ARCMTMigrateEmitARCErrors
bool isC99() const
isC99 - Language is a superset of C99.
Enable migration to modern ObjC subscripting.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
std::string ABI
If given, the name of the target ABI to use.
AnalysisConstraints
AnalysisConstraints - Set of available constraint models.
bool isC11() const
isC11 - Language is a superset of C11.
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.
Enable converting setter/getter expressions to property-dot syntx.
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.
AnalyzerOptionsRef getAnalyzerOpts() const
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.
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.
unsigned visualizeExplodedGraphWithUbiGraph
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)
std::unordered_map< std::string, std::vector< std::string > > PluginArgs
Args to pass to the plugins.
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
unsigned getMajor() const
Retrieve the major version number.
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.
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...
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
PragmaMSPointersToMembersKind
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
static const StringRef GetInputKindName(InputKind IK)
Get language name for given input kind.
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...
use NS_NONATOMIC_IOSONLY for property 'atomic' attribute
unsigned FixToTemporaries
Apply fixes to temporary files.
unsigned ShowComments
Show comments.
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.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T-> getSizeExpr()))
DependencyOutputFormat OutputFormat
The format for the dependency file.
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
bool tryParse(StringRef string)
Try to parse the given string as a version number.
static ParsedSourceLocation FromString(StringRef Str)
Construct a parsed source location from a string; the Filename is empty on error. ...
PreprocessorOptions & getPreprocessorOpts()
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::string ARCMTMigrateReportOut
Emit location information but do not generate debug info in the output.
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.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
AnalysisConstraints AnalysisConstraintsOpt
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action)
Helper class for holding the data necessary to invoke the compiler.
DiagnosticOptions & getDiagnosticOpts() const
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
detail::InMemoryDirectory::const_iterator E
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.
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.
std::string StatsFile
Filename to write statistics to.
void BuryPointer(const void *Ptr)
Parse ASTs and dump them.
Don't generate debug info.
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::vector< std::string > LinkerOptions
A list of linker options to embed in the object file.
static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, FileManager &FileMgr, DiagnosticsEngine &Diags, frontend::ActionKind Action)
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
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
static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor)
std::vector< std::string > AddPluginActions
The list of plugin actions to run in addition to the normal action.
Optional< unsigned > getSubminor() const
Retrieve the subminor version number, if provided.
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.
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.
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 AnalyzeNestedBlocks
unsigned NoRetryExhausted
Do not re-analyze paths leading to exhausted nodes with a different strategy.
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.
std::string MainFileName
The user provided name for the "main file", if non-empty.
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
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.
FileSystemOptions & getFileSystemOpts()
static unsigned getOptimizationLevelSize(ArgList &Args)
Run one or more source code analyses.
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 and -fprofile-generate.
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.
std::vector< std::string > BackendOptions
A list of command-line options to forward to the LLVM backend.
Like Angled, but marks header maps used when.
Generate pre-tokenized header.
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
Enable migration of ObjC methods to 'instancetype'.
LangOptions * getLangOpts()
unsigned PrintShowIncludes
Print cl.exe style /showIncludes info.
bool DumpDeserializedPCHDecls
Dump declarations that are deserialized from PCH, for testing.
AnalysisDiagClients
AnalysisDiagClients - Set of available diagnostic clients for rendering analysis results.
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.
static void parseSanitizerKinds(StringRef FlagName, const std::vector< std::string > &Sanitizers, DiagnosticsEngine &Diags, SanitizerSet &S)
Attempt to be ABI-compatible with code generated by Clang 3.8.x (SVN r257626).
std::string DiagnosticLogFile
The file to log diagnostic output to.
std::string TokenCache
If given, a PTH cache file to use for speeding up header parsing.
bool hasHexFloats() const
hasHexFloats - Language supports hexadecimal float constants.
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.