14 #include "clang/Config/config.h"
25 #include "llvm/ADT/Hashing.h"
26 #include "llvm/ADT/STLExtras.h"
27 #include "llvm/ADT/SmallVector.h"
28 #include "llvm/ADT/StringExtras.h"
29 #include "llvm/ADT/StringSwitch.h"
30 #include "llvm/ADT/Triple.h"
31 #include "llvm/Linker/Linker.h"
32 #include "llvm/Option/Arg.h"
33 #include "llvm/Option/ArgList.h"
34 #include "llvm/Option/OptTable.h"
35 #include "llvm/Option/Option.h"
36 #include "llvm/Support/CodeGen.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include "llvm/Support/FileSystem.h"
39 #include "llvm/Support/Host.h"
40 #include "llvm/Support/Path.h"
41 #include "llvm/Support/Process.h"
42 #include "llvm/Target/TargetOptions.h"
46 #include <system_error>
47 using namespace clang;
73 using namespace clang::driver;
74 using namespace clang::driver::options;
75 using namespace llvm::opt;
81 unsigned DefaultOpt = 0;
82 if (IK ==
IK_OpenCL && !Args.hasArg(OPT_cl_opt_disable))
85 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
86 if (A->getOption().matches(options::OPT_O0))
89 if (A->getOption().matches(options::OPT_Ofast))
92 assert (A->getOption().matches(options::OPT_O));
94 StringRef
S(A->getValue());
95 if (
S ==
"s" ||
S ==
"z" ||
S.empty())
105 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
106 if (A->getOption().matches(options::OPT_O)) {
107 switch (A->getValue()[0]) {
121 OptSpecifier GroupWithValue,
122 std::vector<std::string> &Diagnostics) {
123 for (Arg *A : Args.filtered(Group)) {
124 if (A->getOption().getKind() == Option::FlagClass) {
127 Diagnostics.push_back(A->getOption().getName().drop_front(1));
128 }
else if (A->getOption().matches(GroupWithValue)) {
130 Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim(
"=-"));
133 for (
const char *Arg : A->getValues())
134 Diagnostics.emplace_back(Arg);
140 std::vector<std::string> &Funcs) {
142 for (
const auto &Arg : Args) {
143 const Option &O = Arg->getOption();
144 if (O.matches(options::OPT_fno_builtin_)) {
145 const char *FuncName = Arg->getValue();
147 Values.push_back(FuncName);
150 Funcs.insert(Funcs.end(), Values.begin(), Values.end());
155 using namespace options;
157 if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {
158 StringRef
Name = A->getValue();
161 .Case(CMDFLAG, NAME##Model)
162 #include "clang/StaticAnalyzer/Core/Analyses.def"
165 Diags.
Report(diag::err_drv_invalid_value)
166 << A->getAsString(Args) <<
Name;
173 if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
174 StringRef
Name = A->getValue();
177 .Case(CMDFLAG, NAME##Model)
178 #include "clang/StaticAnalyzer/Core/Analyses.def"
181 Diags.
Report(diag::err_drv_invalid_value)
182 << A->getAsString(Args) <<
Name;
189 if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
190 StringRef
Name = A->getValue();
193 .Case(CMDFLAG, PD_##NAME)
194 #include "clang/StaticAnalyzer/Core/Analyses.def"
197 Diags.
Report(diag::err_drv_invalid_value)
198 << A->getAsString(Args) <<
Name;
205 if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
206 StringRef
Name = A->getValue();
210 #include "clang/StaticAnalyzer/Core/Analyses.def"
213 Diags.
Report(diag::err_drv_invalid_value)
214 << A->getAsString(Args) <<
Name;
221 if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
222 StringRef
Name = A->getValue();
226 #include "clang/StaticAnalyzer/Core/Analyses.def"
229 Diags.
Report(diag::err_drv_invalid_value)
230 << A->getAsString(Args) <<
Name;
241 Args.hasArg(OPT_analyzer_viz_egraph_graphviz);
243 Args.hasArg(OPT_analyzer_viz_egraph_ubigraph);
245 Opts.
AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers);
248 Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks);
252 Opts.
TrimGraph = Args.hasArg(OPT_trim_egraph);
255 Opts.
PrintStats = Args.hasArg(OPT_analyzer_stats);
262 Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
264 bool enable = (A->getOption().getID() == OPT_analyzer_checker);
267 StringRef checkerList = A->getValue();
269 checkerList.split(checkers,
",");
270 for (StringRef checker : checkers)
275 for (
const Arg *A : Args.filtered(OPT_analyzer_config)) {
279 StringRef configList = A->getValue();
281 configList.split(configVals,
",");
282 for (
unsigned i = 0, e = configVals.size(); i != e; ++i) {
284 std::tie(key, val) = configVals[i].split(
"=");
287 diag::err_analyzer_config_no_value) << configVals[i];
291 if (val.find(
'=') != StringRef::npos) {
293 diag::err_analyzer_config_multiple_values)
317 if (Arg *A = Args.getLastArg(OPT_mcode_model)) {
318 StringRef
Value = A->getValue();
319 if (Value ==
"small" || Value ==
"kernel" || Value ==
"medium" ||
322 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Value;
329 static std::shared_ptr<llvm::Regex>
332 StringRef Val = RpassArg->getValue();
333 std::string RegexError;
334 std::shared_ptr<llvm::Regex> Pattern = std::make_shared<llvm::Regex>(Val);
335 if (!Pattern->isValid(RegexError)) {
336 Diags.
Report(diag::err_drv_optimization_remark_pattern)
337 << RegexError << RpassArg->getAsString(Args);
344 const std::vector<std::string> &Levels,
348 for (
const auto &
Level : Levels) {
350 llvm::StringSwitch<DiagnosticLevelMask>(
Level)
359 Diags->
Report(diag::err_drv_invalid_value) << FlagName <<
Level;
367 const std::vector<std::string> &Sanitizers,
369 for (
const auto &Sanitizer : Sanitizers) {
372 Diags.
Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
381 using namespace options;
383 llvm::Triple Triple = llvm::Triple(TargetOpts.
Triple);
387 unsigned MaxOptLevel = 3;
388 if (OptimizationLevel > MaxOptLevel) {
391 Diags.
Report(diag::warn_drv_optimization_value)
392 << Args.getLastArg(OPT_O)->getAsString(Args) <<
"-O" << MaxOptLevel;
393 OptimizationLevel = MaxOptLevel;
395 Opts.OptimizationLevel = OptimizationLevel;
402 Opts.NoInline = Args.hasArg(OPT_fno_inline);
403 Opts.setInlining(Args.hasArg(OPT_fno_inline_functions) ?
404 CodeGenOptions::OnlyAlwaysInlining : Opts.getInlining());
406 if (Arg *A = Args.getLastArg(OPT_fveclib)) {
407 StringRef
Name = A->getValue();
408 if (Name ==
"Accelerate")
410 else if (Name ==
"none")
413 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
416 if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
418 llvm::StringSwitch<unsigned>(A->getValue())
424 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
427 Opts.setDebugInfo(static_cast<CodeGenOptions::DebugInfoKind>(Val));
429 if (Arg *A = Args.getLastArg(OPT_debugger_tuning_EQ)) {
430 unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
436 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
439 Opts.setDebuggerTuning(static_cast<CodeGenOptions::DebuggerKind>(Val));
442 Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);
443 Opts.EmitCodeView = Args.hasArg(OPT_gcodeview);
445 Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs);
446 Opts.DebugExplicitImport = Triple.isPS4CPU();
448 for (
const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ))
452 Args.getLastArg(OPT_emit_llvm_uselists, OPT_no_emit_llvm_uselists))
453 Opts.EmitLLVMUseLists = A->getOption().getID() == OPT_emit_llvm_uselists;
455 Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
456 Opts.DisableLLVMPasses = Args.hasArg(OPT_disable_llvm_passes);
457 Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
458 Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
459 Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
460 OPT_fuse_register_sized_bitfield_access);
461 Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
462 Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa);
464 Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
465 Opts.NoCommon = Args.hasArg(OPT_fno_common);
466 Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
468 Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||
469 Args.hasArg(OPT_ffreestanding));
470 if (Opts.SimplifyLibCalls)
473 Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
474 (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize));
475 Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);
477 Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);
478 Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
480 Opts.ProfileInstrGenerate = Args.hasArg(OPT_fprofile_instr_generate) ||
481 Args.hasArg(OPT_fprofile_instr_generate_EQ);
484 Opts.CoverageMapping =
485 Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping,
false);
486 Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);
487 Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);
488 Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
489 Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
490 Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
492 Opts.
DebugPass = Args.getLastArgValue(OPT_mdebug_pass);
494 (Args.hasArg(OPT_mdisable_fp_elim) || Args.hasArg(OPT_pg));
495 Opts.DisableFree = Args.hasArg(OPT_disable_free);
496 Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
497 Opts.
FloatABI = Args.getLastArgValue(OPT_mfloat_abi);
498 if (Arg *A = Args.getLastArg(OPT_meabi)) {
499 StringRef
Value = A->getValue();
500 llvm::EABI EABIVersion = llvm::StringSwitch<llvm::EABI>(
Value)
501 .Case(
"default", llvm::EABI::Default)
502 .Case(
"4", llvm::EABI::EABI4)
503 .Case(
"5", llvm::EABI::EABI5)
504 .Case(
"gnu", llvm::EABI::GNU)
507 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
512 Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable);
514 Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
515 Args.hasArg(OPT_cl_finite_math_only) ||
516 Args.hasArg(OPT_cl_fast_relaxed_math));
517 Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
518 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
519 Args.hasArg(OPT_cl_finite_math_only) ||
520 Args.hasArg(OPT_cl_fast_relaxed_math));
521 Opts.NoSignedZeros = Args.hasArg(OPT_fno_signed_zeros);
522 Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math);
523 Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
526 Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
527 Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
528 Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);
529 Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
530 Opts.IncrementalLinkerCompatible =
531 Args.hasArg(OPT_mincremental_linker_compatible);
532 Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
533 Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
534 Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm);
535 Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
536 Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums);
537 Opts.StrictVTablePointers = Args.hasArg(OPT_fstrict_vtable_pointers);
538 Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
539 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
540 Args.hasArg(OPT_cl_fast_relaxed_math);
541 Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
542 Opts.
RelocationModel = Args.getLastArgValue(OPT_mrelocation_model,
"pic");
543 Opts.
ThreadModel = Args.getLastArgValue(OPT_mthread_model,
"posix");
545 Diags.
Report(diag::err_drv_invalid_value)
546 << Args.getLastArg(OPT_mthread_model)->getAsString(Args)
548 Opts.
TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
549 Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array);
551 Opts.FunctionSections = Args.hasFlag(OPT_ffunction_sections,
552 OPT_fno_function_sections,
false);
553 Opts.DataSections = Args.hasFlag(OPT_fdata_sections,
554 OPT_fno_data_sections,
false);
555 Opts.UniqueSectionNames = Args.hasFlag(OPT_funique_section_names,
556 OPT_fno_unique_section_names,
true);
558 Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);
560 Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ);
561 const Arg *A = Args.getLastArg(OPT_flto, OPT_flto_EQ);
562 Opts.EmitFunctionSummary = A && A->containsValue(
"thin");
563 if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
565 Diags.
Report(diag::err_drv_argument_only_allowed_with)
566 << A->getAsString(Args) <<
"-x ir";
570 Opts.MSVolatile = Args.hasArg(OPT_fms_volatile);
572 Opts.VectorizeBB = Args.hasArg(OPT_vectorize_slp_aggressive);
573 Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops);
574 Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp);
576 Opts.
MainFileName = Args.getLastArgValue(OPT_main_file_name);
577 Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);
579 Opts.DisableGCov = Args.hasArg(OPT_test_coverage);
580 Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data);
581 Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes);
582 if (Opts.EmitGcovArcs || Opts.EmitGcovNotes) {
583 Opts.
CoverageFile = Args.getLastArgValue(OPT_coverage_file);
584 Opts.CoverageExtraChecksum = Args.hasArg(OPT_coverage_cfg_checksum);
585 Opts.CoverageNoFunctionNamesInData =
586 Args.hasArg(OPT_coverage_no_function_names_in_data);
587 Opts.CoverageExitBlockBeforeBody =
588 Args.hasArg(OPT_coverage_exit_block_before_body);
589 if (Args.hasArg(OPT_coverage_version_EQ)) {
590 StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
591 if (CoverageVersion.size() != 4) {
592 Diags.
Report(diag::err_drv_invalid_value)
593 << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
601 Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
602 Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
603 Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info);
604 Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);
606 for (
auto A : Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_cuda_bitcode)) {
607 unsigned LinkFlags = llvm::Linker::Flags::None;
608 if (A->getOption().matches(OPT_mlink_cuda_bitcode))
609 LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded |
610 llvm::Linker::Flags::InternalizeLinkedSymbols;
613 Opts.SanitizeCoverageType =
615 Opts.SanitizeCoverageIndirectCalls =
616 Args.hasArg(OPT_fsanitize_coverage_indirect_calls);
617 Opts.SanitizeCoverageTraceBB = Args.hasArg(OPT_fsanitize_coverage_trace_bb);
618 Opts.SanitizeCoverageTraceCmp = Args.hasArg(OPT_fsanitize_coverage_trace_cmp);
619 Opts.SanitizeCoverage8bitCounters =
620 Args.hasArg(OPT_fsanitize_coverage_8bit_counters);
621 Opts.SanitizeMemoryTrackOrigins =
623 Opts.SanitizeMemoryUseAfterDtor =
624 Args.hasArg(OPT_fsanitize_memory_use_after_dtor);
625 Opts.SanitizeCfiCrossDso = Args.hasArg(OPT_fsanitize_cfi_cross_dso);
628 Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
629 if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
630 StringRef Val = A->getValue();
631 unsigned StackAlignment = Opts.StackAlignment;
632 Val.getAsInteger(10, StackAlignment);
633 Opts.StackAlignment = StackAlignment;
636 if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) {
637 StringRef Val = A->getValue();
638 unsigned StackProbeSize = Opts.StackProbeSize;
639 Val.getAsInteger(0, StackProbeSize);
640 Opts.StackProbeSize = StackProbeSize;
643 if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
644 StringRef
Name = A->getValue();
645 unsigned Method = llvm::StringSwitch<unsigned>(
Name)
651 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
654 Opts.setObjCDispatchMethod(
655 static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method));
660 Args.hasFlag(OPT_femulated_tls, OPT_fno_emulated_tls,
false);
662 if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) {
663 StringRef
Name = A->getValue();
664 unsigned Model = llvm::StringSwitch<unsigned>(
Name)
671 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
674 Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model));
678 if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
679 StringRef Val = A->getValue();
682 else if (Val ==
"on")
684 else if (Val ==
"off")
687 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
690 if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) {
691 if (A->getOption().matches(OPT_fpcc_struct_return)) {
694 assert(A->getOption().matches(OPT_freg_struct_return));
700 bool NeedLocTracking =
false;
702 if (Arg *A = Args.getLastArg(OPT_Rpass_EQ)) {
705 NeedLocTracking =
true;
708 if (Arg *A = Args.getLastArg(OPT_Rpass_missed_EQ)) {
711 NeedLocTracking =
true;
714 if (Arg *A = Args.getLastArg(OPT_Rpass_analysis_EQ)) {
717 NeedLocTracking =
true;
724 NeedLocTracking =
true;
736 Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
739 Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
743 Args.getAllArgValues(OPT_fcuda_include_gpubinary);
750 using namespace options;
751 Opts.
OutputFile = Args.getLastArgValue(OPT_dependency_file);
752 Opts.
Targets = Args.getAllArgValues(OPT_MT);
760 Opts.
DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
762 Args.getLastArgValue(OPT_module_dependency_dir);
763 if (Args.hasArg(OPT_MV))
768 Opts.
ExtraDeps = Args.getAllArgValues(OPT_fdepfile_entry);
769 auto ModuleFiles = Args.getAllArgValues(OPT_fmodule_file);
776 using namespace options;
781 Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
783 Opts.IgnoreWarnings = Args.hasArg(OPT_w);
784 Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
785 Opts.Pedantic = Args.hasArg(OPT_pedantic);
786 Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
787 Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
788 Opts.ShowColors = Args.hasArg(OPT_fcolor_diagnostics);
789 Opts.ShowColumn = Args.hasFlag(OPT_fshow_column,
792 Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info);
793 Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);
794 Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option);
796 llvm::sys::Process::UseANSIEscapeCodes(Args.hasArg(OPT_fansi_escape_codes));
799 Opts.ShowNoteIncludeStack =
false;
800 if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack,
801 OPT_fno_diagnostics_show_note_include_stack))
802 if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))
803 Opts.ShowNoteIncludeStack =
true;
805 StringRef ShowOverloads =
806 Args.getLastArgValue(OPT_fshow_overloads_EQ,
"all");
807 if (ShowOverloads ==
"best")
809 else if (ShowOverloads ==
"all")
810 Opts.setShowOverloads(
Ovl_All);
814 Diags->
Report(diag::err_drv_invalid_value)
815 << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)
819 StringRef ShowCategory =
820 Args.getLastArgValue(OPT_fdiagnostics_show_category,
"none");
821 if (ShowCategory ==
"none")
822 Opts.ShowCategories = 0;
823 else if (ShowCategory ==
"id")
824 Opts.ShowCategories = 1;
825 else if (ShowCategory ==
"name")
826 Opts.ShowCategories = 2;
830 Diags->
Report(diag::err_drv_invalid_value)
831 << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)
836 Args.getLastArgValue(OPT_fdiagnostics_format,
"clang");
837 if (Format ==
"clang")
839 else if (Format ==
"msvc")
841 else if (Format ==
"msvc-fallback") {
843 Opts.CLFallbackMode =
true;
844 }
else if (Format ==
"vi")
849 Diags->
Report(diag::err_drv_invalid_value)
850 << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)
854 Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
855 Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
856 Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);
857 Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);
860 Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ),
862 if (Args.hasArg(OPT_verify_ignore_unexpected))
864 Opts.setVerifyIgnoreUnexpected(DiagMask);
865 Opts.ElideType = !Args.hasArg(OPT_fno_elide_type);
866 Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);
868 Opts.MacroBacktraceLimit =
872 Args, OPT_ftemplate_backtrace_limit,
875 Args, OPT_fconstexpr_backtrace_limit,
878 Args, OPT_fspell_checking_limit,
885 Diags->
Report(diag::warn_ignoring_ftabstop_value)
896 Opts.
WorkingDir = Args.getLastArgValue(OPT_working_directory);
904 std::string &BlockName,
905 unsigned &MajorVersion,
906 unsigned &MinorVersion,
908 std::string &UserInfo) {
910 Arg.split(Args,
':', 5);
915 if (Args[1].getAsInteger(10, MajorVersion))
return true;
916 if (Args[2].getAsInteger(10, MinorVersion))
return true;
917 if (Args[3].getAsInteger(2, Hashed))
return true;
925 using namespace options;
927 if (
const Arg *A = Args.getLastArg(OPT_Action_Group)) {
928 switch (A->getOption().getID()) {
930 llvm_unreachable(
"Invalid option in group!");
934 case OPT_ast_dump_lookups:
940 case OPT_dump_raw_tokens:
942 case OPT_dump_tokens:
946 case OPT_emit_llvm_bc:
952 case OPT_emit_llvm_only:
954 case OPT_emit_codegen_only:
963 case OPT_emit_module:
971 case OPT_fsyntax_only:
973 case OPT_module_file_info:
977 case OPT_print_decl_contexts:
979 case OPT_print_preamble:
983 case OPT_rewrite_macros:
985 case OPT_rewrite_objc:
987 case OPT_rewrite_test:
998 if (
const Arg* A = Args.getLastArg(OPT_plugin)) {
999 Opts.
Plugins.emplace_back(A->getValue(0));
1003 for (
const Arg *AA : Args.filtered(OPT_plugin_arg))
1005 Opts.
PluginArgs.emplace_back(AA->getValue(1));
1011 for (
const Arg *A : Args.filtered(OPT_plugin_arg))
1015 for (
const std::string &Arg :
1016 Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
1017 std::string BlockName;
1018 unsigned MajorVersion;
1019 unsigned MinorVersion;
1021 std::string UserInfo;
1023 MinorVersion, Hashed, UserInfo)) {
1024 Diags.
Report(diag::err_test_module_file_extension_format) << Arg;
1035 if (
const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
1039 Diags.
Report(diag::err_drv_invalid_value)
1040 << A->getAsString(Args) << A->getValue();
1044 Opts.
OutputFile = Args.getLastArgValue(OPT_o);
1045 Opts.
Plugins = Args.getAllArgValues(OPT_load);
1047 Opts.
ShowHelp = Args.hasArg(OPT_help);
1048 Opts.
ShowStats = Args.hasArg(OPT_print_stats);
1049 Opts.
ShowTimers = Args.hasArg(OPT_ftime_report);
1052 Opts.
LLVMArgs = Args.getAllArgValues(OPT_mllvm);
1058 Opts.
ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter);
1062 Opts.
ModuleMapFiles = Args.getAllArgValues(OPT_fmodule_map_file);
1063 Opts.
ModuleFiles = Args.getAllArgValues(OPT_fmodule_file);
1068 = Args.hasArg(OPT_code_completion_macros);
1070 = Args.hasArg(OPT_code_completion_patterns);
1072 = !Args.hasArg(OPT_no_code_completion_globals);
1074 = Args.hasArg(OPT_code_completion_brief_comments);
1077 = Args.getLastArgValue(OPT_foverride_record_layout_EQ);
1079 llvm::Triple::normalize(Args.getLastArgValue(OPT_aux_triple));
1081 if (
const Arg *A = Args.getLastArg(OPT_arcmt_check,
1083 OPT_arcmt_migrate)) {
1084 switch (A->getOption().getID()) {
1086 llvm_unreachable(
"missed a case");
1087 case OPT_arcmt_check:
1090 case OPT_arcmt_modify:
1093 case OPT_arcmt_migrate:
1098 Opts.
MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory);
1100 = Args.getLastArgValue(OPT_arcmt_migrate_report_output);
1102 = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
1104 if (Args.hasArg(OPT_objcmt_migrate_literals))
1106 if (Args.hasArg(OPT_objcmt_migrate_subscripting))
1108 if (Args.hasArg(OPT_objcmt_migrate_property_dot_syntax))
1110 if (Args.hasArg(OPT_objcmt_migrate_property))
1112 if (Args.hasArg(OPT_objcmt_migrate_readonly_property))
1114 if (Args.hasArg(OPT_objcmt_migrate_readwrite_property))
1116 if (Args.hasArg(OPT_objcmt_migrate_annotation))
1118 if (Args.hasArg(OPT_objcmt_returns_innerpointer_property))
1120 if (Args.hasArg(OPT_objcmt_migrate_instancetype))
1122 if (Args.hasArg(OPT_objcmt_migrate_nsmacros))
1124 if (Args.hasArg(OPT_objcmt_migrate_protocol_conformance))
1126 if (Args.hasArg(OPT_objcmt_atomic_property))
1128 if (Args.hasArg(OPT_objcmt_ns_nonatomic_iosonly))
1130 if (Args.hasArg(OPT_objcmt_migrate_designated_init))
1132 if (Args.hasArg(OPT_objcmt_migrate_all))
1139 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1140 <<
"ARC migration" <<
"ObjC migration";
1144 if (
const Arg *A = Args.getLastArg(OPT_x)) {
1145 DashX = llvm::StringSwitch<InputKind>(A->getValue())
1153 .Case(
"assembler-with-cpp",
IK_Asm)
1160 .Case(
"c-header",
IK_C)
1162 .Case(
"objective-c-header",
IK_ObjC)
1163 .Case(
"c++-header",
IK_CXX)
1164 .Case(
"objective-c++-header",
IK_ObjCXX)
1165 .Cases(
"ast",
"pcm",
IK_AST)
1169 Diags.
Report(diag::err_drv_invalid_value)
1170 << A->getAsString(Args) << A->getValue();
1174 std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
1177 Inputs.push_back(
"-");
1178 for (
unsigned i = 0, e = Inputs.size(); i != e; ++i) {
1182 StringRef(Inputs[i]).rsplit(
'.').second);
1187 Opts.
Inputs.emplace_back(std::move(Inputs[i]), IK);
1195 std::string ClangExecutable =
1196 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
1197 StringRef Dir = llvm::sys::path::parent_path(ClangExecutable);
1200 StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
1202 if (ClangResourceDir !=
"")
1203 llvm::sys::path::append(P, ClangResourceDir);
1205 llvm::sys::path::append(P,
"..", Twine(
"lib") + CLANG_LIBDIR_SUFFIX,
1212 using namespace options;
1213 Opts.
Sysroot = Args.getLastArgValue(OPT_isysroot,
"/");
1214 Opts.
Verbose = Args.hasArg(OPT_v);
1218 if (
const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
1219 Opts.
UseLibcxx = (strcmp(A->getValue(),
"libc++") == 0);
1220 Opts.
ResourceDir = Args.getLastArgValue(OPT_resource_dir);
1231 Args.hasArg(OPT_fmodules_validate_once_per_build_session);
1235 Args.hasArg(OPT_fmodules_validate_system_headers);
1236 if (
const Arg *A = Args.getLastArg(OPT_fmodule_format_EQ))
1239 for (
const Arg *A : Args.filtered(OPT_fmodules_ignore_macro)) {
1240 StringRef MacroDef = A->getValue();
1245 bool IsIndexHeaderMap =
false;
1246 for (
const Arg *A : Args.filtered(OPT_I, OPT_F, OPT_index_header_map)) {
1247 if (A->getOption().matches(OPT_index_header_map)) {
1249 IsIndexHeaderMap =
true;
1256 Opts.
AddPath(A->getValue(), Group,
1257 A->getOption().matches(OPT_F),
true);
1258 IsIndexHeaderMap =
false;
1262 StringRef Prefix =
"";
1264 Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
1265 if (A->getOption().matches(OPT_iprefix))
1266 Prefix = A->getValue();
1267 else if (A->getOption().matches(OPT_iwithprefix))
1273 for (
const Arg *A : Args.filtered(OPT_idirafter))
1275 for (
const Arg *A : Args.filtered(OPT_iquote))
1277 for (
const Arg *A : Args.filtered(OPT_isystem, OPT_iwithsysroot))
1279 !A->getOption().matches(OPT_iwithsysroot));
1280 for (
const Arg *A : Args.filtered(OPT_iframework))
1284 for (
const Arg *A : Args.filtered(OPT_c_isystem))
1286 for (
const Arg *A : Args.filtered(OPT_cxx_isystem))
1288 for (
const Arg *A : Args.filtered(OPT_objc_isystem))
1290 for (
const Arg *A : Args.filtered(OPT_objcxx_isystem))
1295 Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
1297 if (A->getOption().matches(OPT_internal_externc_isystem))
1299 Opts.
AddPath(A->getValue(), Group,
false,
true);
1304 Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
1306 A->getValue(), A->getOption().matches(OPT_system_header_prefix));
1308 for (
const Arg *A : Args.filtered(OPT_ivfsoverlay))
1318 Opts.AsmPreprocessor = 1;
1323 Opts.ObjC1 = Opts.ObjC2 = 1;
1332 llvm_unreachable(
"Invalid input kind!");
1334 LangStd = LangStandard::lang_opencl;
1338 LangStd = LangStandard::lang_cuda;
1345 LangStd = LangStandard::lang_gnu11;
1351 LangStd = LangStandard::lang_gnucxx98;
1358 Opts.C99 = Std.
isC99();
1359 Opts.C11 = Std.
isC11();
1366 Opts.GNUInline = Std.
isC89();
1371 Opts.OpenCL = LangStd == LangStandard::lang_opencl || IK ==
IK_OpenCL;
1372 if (LangStd == LangStandard::lang_opencl)
1373 Opts.OpenCLVersion = 100;
1374 else if (LangStd == LangStandard::lang_opencl11)
1375 Opts.OpenCLVersion = 110;
1376 else if (LangStd == LangStandard::lang_opencl12)
1377 Opts.OpenCLVersion = 120;
1378 else if (LangStd == LangStandard::lang_opencl20)
1379 Opts.OpenCLVersion = 200;
1385 Opts.CXXOperatorNames = 1;
1386 Opts.LaxVectorConversions = 0;
1387 Opts.DefaultFPContract = 1;
1388 Opts.NativeHalfType = 1;
1392 LangStd == LangStandard::lang_cuda;
1395 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
1398 Opts.Half = Opts.OpenCL;
1401 Opts.WChar = Opts.CPlusPlus;
1403 Opts.GNUKeywords = Opts.GNUMode;
1404 Opts.CXXOperatorNames = Opts.CPlusPlus;
1406 Opts.DollarIdents = !Opts.AsmPreprocessor;
1412 StringRef value = arg->getValue();
1413 if (value ==
"default") {
1415 }
else if (value ==
"hidden" || value ==
"internal") {
1417 }
else if (value ==
"protected") {
1422 diags.
Report(diag::err_drv_invalid_value)
1423 << arg->getAsString(args) << value;
1431 if (
const Arg *A = Args.getLastArg(OPT_std_EQ)) {
1432 LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
1434 .Case(name, LangStandard::lang_##
id)
1435 #include "clang/Frontend/LangStandards.def"
1438 Diags.
Report(diag::err_drv_invalid_value)
1439 << A->getAsString(Args) << A->getValue();
1450 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1451 << A->getAsString(Args) <<
"C/ObjC";
1458 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1459 << A->getAsString(Args) <<
"C++/ObjC++";
1463 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1464 << A->getAsString(Args) <<
"OpenCL";
1469 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1470 << A->getAsString(Args) <<
"CUDA";
1480 if (
const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
1482 = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
1483 .Case(
"CL", LangStandard::lang_opencl)
1484 .Case(
"CL1.1", LangStandard::lang_opencl11)
1485 .Case(
"CL1.2", LangStandard::lang_opencl12)
1486 .Case(
"CL2.0", LangStandard::lang_opencl20)
1490 Diags.
Report(diag::err_drv_invalid_value)
1491 << A->getAsString(Args) << A->getValue();
1494 LangStd = OpenCLLangStd;
1504 Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
1507 if (Args.hasArg(OPT_fno_operator_names))
1508 Opts.CXXOperatorNames = 0;
1510 if (Args.hasArg(OPT_fcuda_is_device))
1511 Opts.CUDAIsDevice = 1;
1513 if (Args.hasArg(OPT_fcuda_allow_host_calls_from_host_device))
1514 Opts.CUDAAllowHostCallsFromHostDevice = 1;
1516 if (Args.hasArg(OPT_fcuda_disable_target_call_checks))
1517 Opts.CUDADisableTargetCallChecks = 1;
1519 if (Args.hasArg(OPT_fcuda_target_overloads))
1520 Opts.CUDATargetOverloads = 1;
1523 if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
1524 StringRef value = arg->getValue();
1526 Diags.
Report(diag::err_drv_unknown_objc_runtime) << value;
1529 if (Args.hasArg(OPT_fobjc_gc_only))
1531 else if (Args.hasArg(OPT_fobjc_gc))
1533 else if (Args.hasArg(OPT_fobjc_arc)) {
1534 Opts.ObjCAutoRefCount = 1;
1536 Diags.
Report(diag::err_arc_unsupported_on_runtime);
1543 if (Args.hasArg(OPT_fobjc_runtime_has_weak))
1544 Opts.ObjCWeakRuntime = 1;
1550 if (
auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
1551 if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
1552 assert(!Opts.ObjCWeak);
1554 Diags.
Report(diag::err_objc_weak_with_gc);
1555 }
else if (!Opts.ObjCWeakRuntime) {
1556 Diags.
Report(diag::err_objc_weak_unsupported);
1560 }
else if (Opts.ObjCAutoRefCount) {
1561 Opts.ObjCWeak = Opts.ObjCWeakRuntime;
1564 if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
1565 Opts.ObjCInferRelatedResultType = 0;
1567 if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
1568 Opts.ObjCSubscriptingLegacyRuntime =
1572 if (Args.hasArg(OPT_fgnu89_inline)) {
1574 Diags.
Report(diag::err_drv_argument_not_allowed_with) <<
"-fgnu89-inline"
1580 if (Args.hasArg(OPT_fapple_kext)) {
1581 if (!Opts.CPlusPlus)
1582 Diags.
Report(diag::warn_c_kext);
1587 if (Args.hasArg(OPT_print_ivar_layout))
1588 Opts.ObjCGCBitmapPrint = 1;
1589 if (Args.hasArg(OPT_fno_constant_cfstrings))
1590 Opts.NoConstantCFStrings = 1;
1592 if (Args.hasArg(OPT_faltivec))
1595 if (Args.hasArg(OPT_fzvector))
1598 if (Args.hasArg(OPT_pthread))
1599 Opts.POSIXThreads = 1;
1602 if (Arg *visOpt = Args.getLastArg(OPT_fvisibility)) {
1609 if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) {
1612 Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode());
1615 if (Args.hasArg(OPT_fvisibility_inlines_hidden))
1616 Opts.InlineVisibilityHidden = 1;
1618 if (Args.hasArg(OPT_ftrapv)) {
1622 Args.getLastArgValue(OPT_ftrapv_handler);
1624 else if (Args.hasArg(OPT_fwrapv))
1627 Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility);
1628 Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions);
1629 Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt;
1630 Opts.MSCompatibilityVersion = 0;
1631 if (
const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
1634 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args)
1636 Opts.MSCompatibilityVersion = VT.
getMajor() * 10000000 +
1637 VT.
getMinor().getValueOr(0) * 100000 +
1644 Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus1z;
1646 Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
1648 Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
1649 OPT_fno_dollars_in_identifiers,
1651 Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
1653 Opts.Borland = Args.hasArg(OPT_fborland_extensions);
1654 Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
1655 Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
1657 if (Args.hasArg(OPT_fno_lax_vector_conversions))
1658 Opts.LaxVectorConversions = 0;
1659 if (Args.hasArg(OPT_fno_threadsafe_statics))
1660 Opts.ThreadsafeStatics = 0;
1661 Opts.Exceptions = Args.hasArg(OPT_fexceptions);
1662 Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
1663 Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
1664 Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions);
1665 Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
1667 Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
1668 Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data);
1669 Opts.Blocks = Args.hasArg(OPT_fblocks);
1670 Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
1671 Opts.Coroutines = Args.hasArg(OPT_fcoroutines);
1672 Opts.Modules = Args.hasArg(OPT_fmodules);
1673 Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse);
1674 Opts.ModulesDeclUse =
1675 Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse;
1676 Opts.ModulesLocalVisibility =
1677 Args.hasArg(OPT_fmodules_local_submodule_visibility);
1678 Opts.ModulesSearchAll = Opts.Modules &&
1679 !Args.hasArg(OPT_fno_modules_search_all) &&
1680 Args.hasArg(OPT_fmodules_search_all);
1681 Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery);
1682 Opts.ImplicitModules = !Args.hasArg(OPT_fno_implicit_modules);
1683 Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);
1684 Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);
1685 Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar,
false);
1686 Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
1687 Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
1688 Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
1689 if (!Opts.NoBuiltin)
1691 Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);
1692 Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
1693 Opts.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation);
1694 Opts.ConceptsTS = Args.hasArg(OPT_fconcepts_ts);
1695 Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
1696 Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
1697 Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
1698 Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno);
1699 Opts.InstantiationDepth =
1703 Opts.ConstexprCallDepth =
1705 Opts.ConstexprStepLimit =
1708 Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing);
1709 Opts.NumLargeByValueCopy =
1711 Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
1713 Args.getLastArgValue(OPT_fconstant_string_class);
1714 Opts.ObjCDefaultSynthProperties =
1715 !Args.hasArg(OPT_disable_objc_default_synthesize_properties);
1716 Opts.EncodeExtendedBlockSig =
1717 Args.hasArg(OPT_fencode_extended_block_signature);
1718 Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
1723 Opts.Static = Args.hasArg(OPT_static_define);
1724 Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
1725 Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple
1726 || Args.hasArg(OPT_fdump_record_layouts);
1727 Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
1728 Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
1729 Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
1730 Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant);
1731 Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math);
1732 Opts.MRTD = Args.hasArg(OPT_mrtd);
1733 Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat);
1734 Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
1735 Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
1736 Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
1737 Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
1738 Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
1739 Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
1740 Opts.
CurrentModule = Args.getLastArgValue(OPT_fmodule_name);
1741 Opts.AppExt = Args.hasArg(OPT_fapplication_extension);
1743 Args.getLastArgValue(OPT_fmodule_implementation_of);
1746 Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
1747 Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns);
1748 Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
1757 Opts.DeclSpecKeyword =
1758 Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec,
1759 (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA));
1763 Diags.
Report(diag::err_conflicting_module_names)
1769 if (Opts.ModulesLocalVisibility && !Opts.CPlusPlus)
1770 Diags.
Report(diag::err_drv_argument_not_allowed_with)
1771 <<
"-fmodules-local-submodule-visibility" <<
"C";
1773 if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) {
1774 switch (llvm::StringSwitch<unsigned>(A->getValue())
1780 Diags.
Report(diag::err_drv_invalid_value)
1781 <<
"-faddress-space-map-mangling=" << A->getValue();
1795 if (Arg *A = Args.getLastArg(OPT_fms_memptr_rep_EQ)) {
1797 llvm::StringSwitch<LangOptions::PragmaMSPointersToMembersKind>(
1807 Diags.
Report(diag::err_drv_invalid_value)
1808 <<
"-fms-memptr-rep=" << A->getValue();
1810 Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel);
1814 Opts.OpenMP = Args.hasArg(options::OPT_fopenmp);
1816 Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
1817 Opts.OpenMPIsDevice =
1818 Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_device);
1821 if (Arg *A = Args.getLastArg(options::OPT_omptargets_EQ)) {
1823 for (
unsigned i = 0; i < A->getNumValues(); ++i) {
1824 llvm::Triple TT(A->getValue(i));
1826 if (TT.getArch() == llvm::Triple::UnknownArch)
1827 Diags.
Report(clang::diag::err_drv_invalid_omp_target) << A->getValue(i);
1835 if (Arg *A = Args.getLastArg(options::OPT_omp_host_ir_file_path)) {
1838 Diags.
Report(clang::diag::err_drv_omp_host_ir_file_not_found)
1843 Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
1844 OPT_fno_deprecated_macro,
1850 Opts.Optimize = Opt != 0;
1851 Opts.OptimizeSize = OptSize != 0;
1856 Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline);
1858 Opts.FastMath = Args.hasArg(OPT_ffast_math) ||
1859 Args.hasArg(OPT_cl_fast_relaxed_math);
1860 Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) ||
1861 Args.hasArg(OPT_cl_finite_math_only) ||
1862 Args.hasArg(OPT_cl_fast_relaxed_math);
1863 Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
1864 Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
1865 Args.hasArg(OPT_cl_fast_relaxed_math);
1867 Opts.RetainCommentsFromSystemHeaders =
1868 Args.hasArg(OPT_fretain_comments_from_system_headers);
1873 Diags.
Report(diag::err_drv_invalid_value)
1874 << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
1886 Opts.SanitizeAddressFieldPadding =
1894 using namespace options;
1897 if (
const Arg *A = Args.getLastArg(OPT_token_cache))
1902 Opts.
DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record);
1906 for (
const Arg *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
1909 if (
const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
1910 StringRef
Value(A->getValue());
1913 unsigned EndOfLine = 0;
1915 if (Comma == StringRef::npos ||
1916 Value.substr(0, Comma).getAsInteger(10, Bytes) ||
1917 Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
1918 Diags.
Report(diag::err_drv_preamble_format);
1926 for (
const Arg *A : Args.filtered(OPT_D, OPT_U)) {
1927 if (A->getOption().matches(OPT_D))
1936 for (
const Arg *A : Args.filtered(OPT_include))
1937 Opts.
Includes.emplace_back(A->getValue());
1939 for (
const Arg *A : Args.filtered(OPT_chain_include))
1943 if (Args.hasArg(OPT_faltivec))
1944 Opts.
Includes.emplace_back(
"altivec.h");
1946 for (
const Arg *A : Args.filtered(OPT_remap_file)) {
1947 std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(
';');
1949 if (Split.second.empty()) {
1950 Diags.
Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
1957 if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
1958 StringRef
Name = A->getValue();
1959 unsigned Library = llvm::StringSwitch<unsigned>(
Name)
1965 Diags.
Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
Name;
1974 using namespace options;
2011 Opts.
ShowCPP = !Args.hasArg(OPT_dM);
2018 Opts.
ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
2024 using namespace options;
2025 Opts.
ABI = Args.getLastArgValue(OPT_target_abi);
2026 Opts.
CPU = Args.getLastArgValue(OPT_target_cpu);
2027 Opts.
FPMath = Args.getLastArgValue(OPT_mfpmath);
2029 Opts.
LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);
2030 Opts.
Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
2031 Opts.
Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ);
2034 Opts.
Triple = llvm::sys::getDefaultTargetTriple();
2038 const char *
const *ArgBegin,
2039 const char *
const *ArgEnd,
2041 bool Success =
true;
2046 unsigned MissingArgIndex, MissingArgCount;
2048 Opts->ParseArgs(llvm::makeArrayRef(ArgBegin, ArgEnd), MissingArgIndex,
2049 MissingArgCount, IncludedFlagsBitmask);
2052 if (MissingArgCount) {
2053 Diags.
Report(diag::err_drv_missing_argument)
2054 << Args.getArgString(MissingArgIndex) << MissingArgCount;
2059 for (
const Arg *A : Args.filtered(OPT_UNKNOWN)) {
2060 Diags.
Report(diag::err_drv_unknown_argument) << A->getAsString(Args);
2080 if (Args.hasArg(OPT_fobjc_arc))
2103 class ModuleSignature {
2109 ModuleSignature() : CurBit(0), CurValue(0) { }
2111 void add(uint64_t
Value,
unsigned Bits);
2112 void add(StringRef
Value);
2115 llvm::APInt getAsInteger()
const;
2119 void ModuleSignature::add(uint64_t
Value,
unsigned int NumBits) {
2120 CurValue |= Value << CurBit;
2121 if (CurBit + NumBits < 64) {
2127 Data.push_back(CurValue);
2130 CurValue = Value >> (64-CurBit);
2133 CurBit = (CurBit+NumBits) & 63;
2136 void ModuleSignature::flush() {
2140 Data.push_back(CurValue);
2145 void ModuleSignature::add(StringRef Value) {
2146 for (
auto &c : Value)
2150 llvm::APInt ModuleSignature::getAsInteger()
const {
2151 return llvm::APInt(Data.size() * 64, Data);
2157 using llvm::hash_code;
2158 using llvm::hash_value;
2159 using llvm::hash_combine;
2167 #define LANGOPT(Name, Bits, Default, Description) \
2168 code = hash_combine(code, LangOpts->Name);
2169 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
2170 code = hash_combine(code, static_cast<unsigned>(LangOpts->get##Name()));
2171 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
2172 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
2173 #include "clang/Basic/LangOptions.def"
2175 for (StringRef Feature : LangOpts->ModuleFeatures)
2176 code = hash_combine(code, Feature);
2179 code = hash_combine(code, TargetOpts->Triple, TargetOpts->CPU,
2181 for (
unsigned i = 0, n = TargetOpts->FeaturesAsWritten.size(); i != n; ++i)
2182 code = hash_combine(code, TargetOpts->FeaturesAsWritten[i]);
2189 for (std::vector<std::pair<std::string, bool/*isUndef*/>>::const_iterator
2190 I = getPreprocessorOpts().Macros.begin(),
2191 IEnd = getPreprocessorOpts().Macros.end();
2197 StringRef MacroDef =
I->first;
2202 code = hash_combine(code,
I->first,
I->second);
2206 code = hash_combine(code, hsOpts.
Sysroot,
2221 code = ext->hashExtension(code);
2228 if (!hsOpts.
Sysroot.empty()) {
2230 systemVersionFile += hsOpts.
Sysroot;
2231 llvm::sys::path::append(systemVersionFile,
"System");
2232 llvm::sys::path::append(systemVersionFile,
"Library");
2233 llvm::sys::path::append(systemVersionFile,
"CoreServices");
2234 llvm::sys::path::append(systemVersionFile,
"SystemVersion.plist");
2236 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer =
2237 llvm::MemoryBuffer::getFile(systemVersionFile);
2239 code = hash_combine(code, buffer.get()->getBuffer());
2241 struct stat statBuf;
2242 if (stat(systemVersionFile.c_str(), &statBuf) == 0)
2243 code = hash_combine(code, statBuf.st_mtime);
2247 return llvm::APInt(64, code).toString(36,
false);
2252 template<
typename IntTy>
2256 IntTy Res = Default;
2257 if (Arg *A = Args.getLastArg(Id)) {
2258 if (StringRef(A->getValue()).getAsInteger(10, Res)) {
2260 Diags->
Report(diag::err_drv_invalid_int_value) << A->getAsString(Args)
2271 return getLastArgIntValueImpl<int>(Args, Id, Default, Diags);
2277 return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags);
2286 static const size_t kGraveYardMaxSize = 16;
2287 LLVM_ATTRIBUTE_UNUSED
static const void *GraveYard[kGraveYardMaxSize];
2288 static std::atomic<unsigned> GraveYardSize;
2289 unsigned Idx = GraveYardSize++;
2290 if (Idx >= kGraveYardMaxSize)
2292 GraveYard[Idx] = Ptr;
2305 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
Buffer =
2306 llvm::MemoryBuffer::getFile(File);
2308 Diags.
Report(diag::err_missing_vfs_overlay_file) << File;
2315 Diags.
Report(diag::err_invalid_vfs_overlay) << File;
2318 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.
Expand macros but not #includes.
std::string OutputFile
The output file, if any.
static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args)
unsigned NoFinalizeRemoval
static void ParseCommentArgs(CommentOptions &Opts, ArgList &Args)
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.
Enable migration to add conforming protocols.
std::string DOTOutputFile
The file to write GraphViz-formatted header dependencies to.
void addMacroUndef(StringRef Name)
std::vector< std::vector< std::string > > AddPluginArgs
Args to pass to the additional plugins.
Generate pre-compiled module.
Represents a version number in the form major[.minor[.subminor[.build]]].
unsigned IncludeBriefComments
Show brief documentation comments in code completion results.
Implements support for file system lookup, file system caching, and directory search management...
static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args)
TargetOptions & getTargetOpts()
Defines the clang::FileManager interface and associated types.
Parse and perform semantic analysis.
Enable inferring NS_DESIGNATED_INITIALIZER for ObjC methods.
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
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.
bool isGNUMode() const
isGNUMode - Language includes GNU extensions.
unsigned IncludeModuleFiles
Include module file dependencies.
Parse ASTs and print them.
Like System, but only used for C++.
std::string EABIVersion
The EABI version to use.
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)
Optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
unsigned visualizeExplodedGraphWithGraphViz
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
Like System, but only used for ObjC++.
Emit only debug info necessary for generating line number tables (-gline-tables-only).
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 definining 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.
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.
std::string ImplicitPTHInclude
The implicit PTH input included at the start of the translation unit, or empty.
static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags)
Options for controlling the target.
bool allowsARC() const
Does this runtime allow ARC at all?
void addRemappedFile(StringRef From, StringRef To)
std::string CoverageFile
The filename with path we use for coverage files.
Enable migration to NS_ENUM/NS_OPTIONS macros.
std::vector< std::string > PluginArgs
Args to pass to the plugin.
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
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.
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...
Enable annotation of ObjCMethods of all kinds.
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
IntrusiveRefCntPtr< FileSystem > getVFSFromYAML(std::unique_ptr< llvm::MemoryBuffer > Buffer, llvm::SourceMgr::DiagHandlerTy DiagHandler, void *DiagContext=nullptr, IntrusiveRefCntPtr< FileSystem > ExternalFS=getRealFileSystem())
Gets a FileSystem for a virtual file system described in YAML format.
std::map< std::string, std::string > DebugPrefixMap
class LLVM_ALIGNAS(8) DependentTemplateSpecializationType const IdentifierInfo * Name
Represents a template specialization type whose template cannot be resolved, e.g. ...
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.
Don't generate debug info.
Translate input source into HTML.
unsigned DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
Emit location information but do not generate debug info in the output.
Enable migration to modern ObjC readwrite property.
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.
A module file extension used for testing purposes.
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.
static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, ArgList &Args)
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::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.
detail::InMemoryDirectory::const_iterator I
bool DisablePCHValidation
When true, disables most of the normal validation performed on precompiled headers.
static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, FileManager &FileMgr, DiagnosticsEngine &Diags)
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)
MigratorOptions & getMigratorOpts()
annotate property with NS_RETURNS_INNER_POINTER
char CoverageVersion[4]
The version string to put into coverage files.
Dump out preprocessed tokens.
std::string CurrentModule
The name of the current module.
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.
PreprocessorOutputOptions - Options for controlling the C preprocessor output (e.g., -E).
std::string LimitFloatPrecision
The float precision limit to use, if non-empty.
Enable migration to modern ObjC literals.
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)
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 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...
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.
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.
IntrusiveRefCntPtr< vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
bool isC89() const
isC89 - Language is a superset of C89.
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...
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)
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.
std::string CPU
If given, the name of the target CPU to generate code for.
unsigned ARCMTMigrateEmitARCErrors
bool isC99() const
isC99 - Language is a superset of C99.
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags=nullptr)
Fill out Opts based on the options given in Args.
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
enum clang::FrontendOptions::@155 ARCMTAction
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.
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)
Parse ASTs and view them in Graphviz.
std::vector< std::string > Remarks
The list of -R...
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::string InstrProfileInput
Name of the profile file to use as input for -fprofile-instr-use.
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.
static void setLangDefaults(LangOptions &Opts, InputKind IK, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
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.
Enable converting setter/getter expressions to property-dot syntx.
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...
PragmaMSPointersToMembersKind
unsigned GenerateGlobalModuleIndex
Whether we can generate the global module index if needed.
void addMacroDef(StringRef Name)
'#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.
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.
Enable migration to modern ObjC readonly property.
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
Like System, but only used for C.
unsigned UseGlobalModuleIndex
Whether we can use the global module index if available.
AnalysisConstraints AnalysisConstraintsOpt
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
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 ImplementationOfModule
The name of the module that the translation unit is an implementation of.
static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args)
void BuryPointer(const void *Ptr)
Parse ASTs and dump them.
use NS_NONATOMIC_IOSONLY for property 'atomic' attribute
Enable migration to modern ObjC subscripting.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
CodeCompleteOptions CodeCompleteOpts
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.
llvm::opt::OptTable * createDriverOptTable()
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.
std::string MainFileName
The user provided name for the "main file", if non-empty.
prefer 'atomic' property over 'nonatomic'.
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.
#define LANGSTANDARD(id, name, desc, features)
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
Enable migration of ObjC methods to 'instancetype'.
std::vector< IntrusiveRefCntPtr< ModuleFileExtension > > ModuleFileExtensions
The list of module file extensions.
#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::vector< std::pair< unsigned, std::string > > LinkBitcodeFiles
The name of the bitcode file to link before optzns.
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.
Limit generated debug info to reduce size (-fno-standalone-debug).
Dump information about a module file.
#define CLANG_VERSION_STRING
A string that describes the Clang version number, e.g., "1.0".
unsigned AddMissingHeaderDeps
Add missing headers to dependency list.
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 void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
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()
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
If given, 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)
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.
Enable migration to modern ObjC property.
bool hasHexFloats() const
hasHexFloats - Language supports hexadecimal float constants.
std::vector< std::string > ModuleMapFiles
The list of module map files to load before processing the input.