;
76 if(Arg *A = Args.getLastArg(clang::driver::options::OPT_C, options::OPT_CC,
77options::OPT_fminimize_whitespace,
78options::OPT_fno_minimize_whitespace,
79options::OPT_fkeep_system_includes,
80options::OPT_fno_keep_system_includes)) {
81 if(!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
82!Args.hasArg(options::OPT__SLASH_EP) && !
D.CCCIsCPP()) {
83 D.Diag(clang::diag::err_drv_argument_only_allowed_with)
84<< A->getBaseArg().getAsString(Args)
85<< (
D.IsCLMode() ?
"/E, /P or /EP":
"-E");
92 if(Args.hasArg(options::OPT_static))
94Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
95 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
104llvm::function_ref<
void(
const ToolChain&)> Work) {
106Work(RegularToolChain);
121 for(
autoII = TCs.first, IE = TCs.second; II != IE; ++II)
128 for(
autoII = TCs.first, IE = TCs.second; II != IE; ++II)
143 constArg &A,
size_t&Position) {
144 const charRefinementStepToken =
':';
145Position = In.find(RefinementStepToken);
146 if(Position != StringRef::npos) {
147StringRef Option = A.getOption().getName();
148StringRef RefStep = In.substr(Position + 1);
156 if(RefStep.size() != 1) {
157 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
160 charRefStepChar = RefStep[0];
161 if(RefStepChar <
'0'|| RefStepChar >
'9') {
162 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
171ArgStringList &OutStrings) {
172StringRef DisabledPrefixIn =
"!";
173StringRef DisabledPrefixOut =
"!";
174StringRef EnabledPrefixOut =
"";
175StringRef Out =
"-mrecip=";
177Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
181 unsignedNumOptions = A->getNumValues();
182 if(NumOptions == 0) {
184OutStrings.push_back(Args.MakeArgString(Out +
"all"));
189 if(NumOptions == 1) {
190StringRef Val = A->getValue(0);
194StringRef ValBase = Val.slice(0, RefStepLoc);
195 if(ValBase ==
"all"|| ValBase ==
"none"|| ValBase ==
"default") {
196OutStrings.push_back(Args.MakeArgString(Out + Val));
205llvm::StringMap<bool> OptionStrings;
206OptionStrings.insert(std::make_pair(
"divd",
false));
207OptionStrings.insert(std::make_pair(
"divf",
false));
208OptionStrings.insert(std::make_pair(
"divh",
false));
209OptionStrings.insert(std::make_pair(
"vec-divd",
false));
210OptionStrings.insert(std::make_pair(
"vec-divf",
false));
211OptionStrings.insert(std::make_pair(
"vec-divh",
false));
212OptionStrings.insert(std::make_pair(
"sqrtd",
false));
213OptionStrings.insert(std::make_pair(
"sqrtf",
false));
214OptionStrings.insert(std::make_pair(
"sqrth",
false));
215OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
216OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
217OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
219 for(
unsignedi = 0; i != NumOptions; ++i) {
220StringRef Val = A->getValue(i);
222 boolIsDisabled = Val.starts_with(DisabledPrefixIn);
231StringRef ValBase = Val.slice(0, RefStep);
232llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
233 if(OptionIter == OptionStrings.end()) {
235OptionIter = OptionStrings.find(ValBase.str() +
'f');
236 if(OptionIter == OptionStrings.end()) {
238 D.Diag(diag::err_drv_unknown_argument) << Val;
244 if(OptionStrings[ValBase.str() +
'd'] ||
245OptionStrings[ValBase.str() +
'h']) {
246 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
251 if(OptionIter->second ==
true) {
253 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
258OptionIter->second =
true;
262 if(ValBase.back() !=
'f'&& ValBase.back() !=
'd'&& ValBase.back() !=
'h') {
263OptionStrings[ValBase.str() +
'd'] =
true;
264OptionStrings[ValBase.str() +
'h'] =
true;
268StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
269Out = Args.MakeArgString(Out + Prefix + Val);
270 if(i != NumOptions - 1)
271Out = Args.MakeArgString(Out +
",");
274OutStrings.push_back(Args.MakeArgString(Out));
280ArgStringList &CmdArgs) {
281Arg *A = Args.getLastArg(options::OPT_mprefer_vector_width_EQ);
285StringRef
Value= A->getValue();
286 if(
Value==
"none") {
287CmdArgs.push_back(
"-mprefer-vector-width=none");
290 if(
Value.getAsInteger(10, Width)) {
291 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() <<
Value;
294CmdArgs.push_back(Args.MakeArgString(
"-mprefer-vector-width="+
Value));
300 constllvm::Triple &Triple) {
307 if(!Triple.isMacOSX())
310 return(!Triple.isMacOSXVersionLT(10, 5) &&
311(Triple.getArch() == llvm::Triple::x86_64 ||
312Triple.getArch() == llvm::Triple::arm));
322ArgStringList &CmdArgs) {
323 constllvm::Triple &Triple = TC.
getTriple();
328Args.ClaimAllArgs(options::OPT_fexceptions);
329Args.ClaimAllArgs(options::OPT_fno_exceptions);
330Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
331Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
332Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
333Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
334Args.ClaimAllArgs(options::OPT_fasync_exceptions);
335Args.ClaimAllArgs(options::OPT_fno_async_exceptions);
340 boolEH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
344 if(Triple.isWindowsMSVCEnvironment()) {
345 boolEHa = Args.hasFlag(options::OPT_fasync_exceptions,
346options::OPT_fno_async_exceptions,
false);
348CmdArgs.push_back(
"-fasync-exceptions");
356Args.hasFlag(options::OPT_fobjc_exceptions,
357options::OPT_fno_objc_exceptions,
true)) {
358CmdArgs.push_back(
"-fobjc-exceptions");
365 boolCXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
366!Triple.isPS() && !Triple.isDriverKit();
367Arg *ExceptionArg = Args.getLastArg(
368options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
369options::OPT_fexceptions, options::OPT_fno_exceptions);
371CXXExceptionsEnabled =
372ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
373ExceptionArg->getOption().matches(options::OPT_fexceptions);
375 if(CXXExceptionsEnabled) {
376CmdArgs.push_back(
"-fcxx-exceptions");
385Args.AddLastArg(CmdArgs, options::OPT_fignore_exceptions);
387Args.addOptInFlag(CmdArgs, options::OPT_fassume_nothrow_exception_dtor,
388options::OPT_fno_assume_nothrow_exception_dtor);
391CmdArgs.push_back(
"-fexceptions");
407 returnArgs.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
413ArgStringList &CmdArgs,
414 constllvm::vfs::FileSystem &VFS) {
415 if(Arg *A = Args.getLastArg(options::OPT_ffile_compilation_dir_EQ,
416options::OPT_fdebug_compilation_dir_EQ)) {
417 if(A->getOption().matches(options::OPT_ffile_compilation_dir_EQ))
418CmdArgs.push_back(Args.MakeArgString(Twine(
"-fdebug-compilation-dir=") +
421A->render(Args, CmdArgs);
422}
else if(llvm::ErrorOr<std::string> CWD =
423VFS.getCurrentWorkingDirectory()) {
424CmdArgs.push_back(Args.MakeArgString(
"-fdebug-compilation-dir="+ *CWD));
426StringRef
Path(CmdArgs.back());
427 return Path.substr(
Path.find(
'=') + 1).data();
431 const char*DebugCompilationDir,
432 const char*OutputFileName) {
434 for(
auto*Arg : Args.filtered(options::OPT_Xclang))
435 if(StringRef(Arg->getValue()).starts_with(
"-object-file-name"))
438 if(Args.hasArg(options::OPT_object_file_name_EQ))
442 if(ObjFileNameForDebug !=
"-"&&
443!llvm::sys::path::is_absolute(ObjFileNameForDebug) &&
444(!DebugCompilationDir ||
445llvm::sys::path::is_absolute(DebugCompilationDir))) {
447llvm::sys::fs::make_absolute(ObjFileNameForDebug);
453llvm::sys::path::Style Style =
454llvm::sys::path::is_absolute(ObjFileNameForDebug)
455? llvm::sys::path::Style::native
456: llvm::sys::path::Style::windows_backslash;
457llvm::sys::path::remove_dots(ObjFileNameForDebug,
true,
460Args.MakeArgString(Twine(
"-object-file-name=") + ObjFileNameForDebug));
465 constArgList &Args, ArgStringList &CmdArgs) {
466 autoAddOneArg = [&](StringRef Map, StringRef Name) {
467 if(!Map.contains(
'='))
468 D.Diag(diag::err_drv_invalid_argument_to_option) << Map << Name;
470CmdArgs.push_back(Args.MakeArgString(
"-fdebug-prefix-map="+ Map));
473 for(
constArg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
474options::OPT_fdebug_prefix_map_EQ)) {
475AddOneArg(A->getValue(), A->getOption().getName());
479 if(GlobalRemapEntry.empty())
481AddOneArg(GlobalRemapEntry,
"environment");
486ArgStringList &CmdArgs) {
487 for(
constArg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
488options::OPT_fmacro_prefix_map_EQ)) {
489StringRef Map = A->getValue();
490 if(!Map.contains(
'='))
491 D.Diag(diag::err_drv_invalid_argument_to_option)
492<< Map << A->getOption().getName();
494CmdArgs.push_back(Args.MakeArgString(
"-fmacro-prefix-map="+ Map));
501ArgStringList &CmdArgs) {
502 for(
constArg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
503options::OPT_fcoverage_prefix_map_EQ)) {
504StringRef Map = A->getValue();
505 if(!Map.contains(
'='))
506 D.Diag(diag::err_drv_invalid_argument_to_option)
507<< Map << A->getOption().getName();
509CmdArgs.push_back(Args.MakeArgString(
"-fcoverage-prefix-map="+ Map));
518 if(Arg *A = Args.getLastArg(options::OPT_O_Group)) {
519 if(A->getOption().matches(options::OPT_O4) ||
520A->getOption().matches(options::OPT_Ofast))
523 if(A->getOption().matches(options::OPT_O0))
526assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
529StringRef S(A->getValue());
537 unsignedOptLevel = 0;
538 if(S.getAsInteger(10, OptLevel))
549ArgStringList &CmdArgs) {
552 if(Args.hasArg(options::OPT_verify_pch) && Input.
getType() == types::TY_PCH)
555CmdArgs.push_back(
"-x");
556 if(Args.hasArg(options::OPT_rewrite_objc))
562 const char*ClangType;
564 casetypes::TY_CXXModule:
567 casetypes::TY_PP_CXXModule:
568ClangType =
"c++-cpp-output";
574CmdArgs.push_back(ClangType);
581ArgStringList &CmdArgs) {
583 auto*PGOGenerateArg = Args.getLastArg(options::OPT_fprofile_generate,
584options::OPT_fprofile_generate_EQ,
585options::OPT_fno_profile_generate);
586 if(PGOGenerateArg &&
587PGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
588PGOGenerateArg =
nullptr;
592 auto*ProfileGenerateArg = Args.getLastArg(
593options::OPT_fprofile_instr_generate,
594options::OPT_fprofile_instr_generate_EQ,
595options::OPT_fno_profile_instr_generate);
596 if(ProfileGenerateArg &&
597ProfileGenerateArg->getOption().matches(
598options::OPT_fno_profile_instr_generate))
599ProfileGenerateArg =
nullptr;
601 if(PGOGenerateArg && ProfileGenerateArg)
602 D.Diag(diag::err_drv_argument_not_allowed_with)
603<< PGOGenerateArg->getSpelling() << ProfileGenerateArg->getSpelling();
607 if(PGOGenerateArg && ProfileUseArg)
608 D.Diag(diag::err_drv_argument_not_allowed_with)
609<< ProfileUseArg->getSpelling() << PGOGenerateArg->getSpelling();
611 if(ProfileGenerateArg && ProfileUseArg)
612 D.Diag(diag::err_drv_argument_not_allowed_with)
613<< ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
615 if(CSPGOGenerateArg && PGOGenerateArg) {
616 D.Diag(diag::err_drv_argument_not_allowed_with)
617<< CSPGOGenerateArg->getSpelling() << PGOGenerateArg->getSpelling();
618PGOGenerateArg =
nullptr;
623 D.Diag(diag::err_drv_unsupported_opt_for_target)
624<< ProfileSampleUseArg->getSpelling() << TC.
getTriple().str();
627 if(ProfileGenerateArg) {
628 if(ProfileGenerateArg->getOption().matches(
629options::OPT_fprofile_instr_generate_EQ))
630CmdArgs.push_back(Args.MakeArgString(Twine(
"-fprofile-instrument-path=") +
631ProfileGenerateArg->getValue()));
633CmdArgs.push_back(
"-fprofile-instrument=clang");
634 if(TC.
getTriple().isWindowsMSVCEnvironment() &&
635Args.hasFlag(options::OPT_frtlib_defaultlib,
636options::OPT_fno_rtlib_defaultlib,
true)) {
638CmdArgs.push_back(Args.MakeArgString(
643 if(
auto*ColdFuncCoverageArg = Args.getLastArg(
644options::OPT_fprofile_generate_cold_function_coverage,
645options::OPT_fprofile_generate_cold_function_coverage_EQ)) {
647ColdFuncCoverageArg->getOption().matches(
648options::OPT_fprofile_generate_cold_function_coverage_EQ)
649? ColdFuncCoverageArg->getValue()
651llvm::sys::path::append(
Path,
"default_%m.profraw");
656CmdArgs.push_back(
"-mllvm");
657CmdArgs.push_back(Args.MakeArgString(
658Twine(
"--instrument-cold-function-only-path=") +
Path));
659CmdArgs.push_back(
"-mllvm");
660CmdArgs.push_back(
"--pgo-instrument-cold-function-only");
661CmdArgs.push_back(
"-mllvm");
662CmdArgs.push_back(
"--pgo-function-entry-coverage");
665 if(
auto*A = Args.getLastArg(options::OPT_ftemporal_profile)) {
666 if(!PGOGenerateArg && !CSPGOGenerateArg)
667 D.Diag(clang::diag::err_drv_argument_only_allowed_with)
668<< A->getSpelling() <<
"-fprofile-generate or -fcs-profile-generate";
669CmdArgs.push_back(
"-mllvm");
670CmdArgs.push_back(
"--pgo-temporal-instrumentation");
673Arg *PGOGenArg =
nullptr;
674 if(PGOGenerateArg) {
675assert(!CSPGOGenerateArg);
676PGOGenArg = PGOGenerateArg;
677CmdArgs.push_back(
"-fprofile-instrument=llvm");
679 if(CSPGOGenerateArg) {
680assert(!PGOGenerateArg);
681PGOGenArg = CSPGOGenerateArg;
682CmdArgs.push_back(
"-fprofile-instrument=csllvm");
685 if(TC.
getTriple().isWindowsMSVCEnvironment() &&
686Args.hasFlag(options::OPT_frtlib_defaultlib,
687options::OPT_fno_rtlib_defaultlib,
true)) {
689CmdArgs.push_back(Args.MakeArgString(
692 if(PGOGenArg->getOption().matches(
693PGOGenerateArg ? options::OPT_fprofile_generate_EQ
694: options::OPT_fcs_profile_generate_EQ)) {
696llvm::sys::path::append(
Path,
"default_%m.profraw");
698Args.MakeArgString(Twine(
"-fprofile-instrument-path=") +
Path));
703 if(ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
704CmdArgs.push_back(Args.MakeArgString(
705Twine(
"-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
706 else if((ProfileUseArg->getOption().matches(
707options::OPT_fprofile_use_EQ) ||
708ProfileUseArg->getOption().matches(
709options::OPT_fprofile_instr_use))) {
711ProfileUseArg->getNumValues() == 0 ?
"": ProfileUseArg->getValue());
712 if(
Path.empty() || llvm::sys::fs::is_directory(
Path))
713llvm::sys::path::append(
Path,
"default.profdata");
715Args.MakeArgString(Twine(
"-fprofile-instrument-use-path=") +
Path));
719 boolEmitCovNotes = Args.hasFlag(options::OPT_ftest_coverage,
720options::OPT_fno_test_coverage,
false) ||
721Args.hasArg(options::OPT_coverage);
724 if(Args.hasFlag(options::OPT_fcoverage_mapping,
725options::OPT_fno_coverage_mapping,
false)) {
726 if(!ProfileGenerateArg)
727 D.Diag(clang::diag::err_drv_argument_only_allowed_with)
728<<
"-fcoverage-mapping" 729<<
"-fprofile-instr-generate";
731CmdArgs.push_back(
"-fcoverage-mapping");
734 if(Args.hasFlag(options::OPT_fmcdc_coverage, options::OPT_fno_mcdc_coverage,
736 if(!Args.hasFlag(options::OPT_fcoverage_mapping,
737options::OPT_fno_coverage_mapping,
false))
738 D.Diag(clang::diag::err_drv_argument_only_allowed_with)
740<<
"-fcoverage-mapping";
742CmdArgs.push_back(
"-fcoverage-mcdc");
745 if(Arg *A = Args.getLastArg(options::OPT_ffile_compilation_dir_EQ,
746options::OPT_fcoverage_compilation_dir_EQ)) {
747 if(A->getOption().matches(options::OPT_ffile_compilation_dir_EQ))
748CmdArgs.push_back(Args.MakeArgString(
749Twine(
"-fcoverage-compilation-dir=") + A->getValue()));
751A->render(Args, CmdArgs);
752}
else if(llvm::ErrorOr<std::string> CWD =
753 D.getVFS().getCurrentWorkingDirectory()) {
754CmdArgs.push_back(Args.MakeArgString(
"-fcoverage-compilation-dir="+ *CWD));
757 if(Args.hasArg(options::OPT_fprofile_exclude_files_EQ)) {
758 auto*Arg = Args.getLastArg(options::OPT_fprofile_exclude_files_EQ);
759 if(!Args.hasArg(options::OPT_coverage))
760 D.Diag(clang::diag::err_drv_argument_only_allowed_with)
761<<
"-fprofile-exclude-files=" 764StringRef
v= Arg->getValue();
766Args.MakeArgString(Twine(
"-fprofile-exclude-files="+
v)));
769 if(Args.hasArg(options::OPT_fprofile_filter_files_EQ)) {
770 auto*Arg = Args.getLastArg(options::OPT_fprofile_filter_files_EQ);
771 if(!Args.hasArg(options::OPT_coverage))
772 D.Diag(clang::diag::err_drv_argument_only_allowed_with)
773<<
"-fprofile-filter-files=" 776StringRef
v= Arg->getValue();
777CmdArgs.push_back(Args.MakeArgString(Twine(
"-fprofile-filter-files="+
v)));
780 if(
const auto*A = Args.getLastArg(options::OPT_fprofile_update_EQ)) {
781StringRef Val = A->getValue();
782 if(Val ==
"atomic"|| Val ==
"prefer-atomic")
783CmdArgs.push_back(
"-fprofile-update=atomic");
784 else if(Val !=
"single")
785 D.Diag(diag::err_drv_unsupported_option_argument)
786<< A->getSpelling() << Val;
789 intFunctionGroups = 1;
790 intSelectedFunctionGroup = 0;
791 if(
const auto*A = Args.getLastArg(options::OPT_fprofile_function_groups)) {
792StringRef Val = A->getValue();
793 if(Val.getAsInteger(0, FunctionGroups) || FunctionGroups < 1)
794 D.Diag(diag::err_drv_invalid_int_value) << A->getAsString(Args) << Val;
797Args.getLastArg(options::OPT_fprofile_selected_function_group)) {
798StringRef Val = A->getValue();
799 if(Val.getAsInteger(0, SelectedFunctionGroup) ||
800SelectedFunctionGroup < 0 || SelectedFunctionGroup >= FunctionGroups)
801 D.Diag(diag::err_drv_invalid_int_value) << A->getAsString(Args) << Val;
803 if(FunctionGroups != 1)
804CmdArgs.push_back(Args.MakeArgString(
"-fprofile-function-groups="+
805Twine(FunctionGroups)));
806 if(SelectedFunctionGroup != 0)
807CmdArgs.push_back(Args.MakeArgString(
"-fprofile-selected-function-group="+
808Twine(SelectedFunctionGroup)));
814Arg *FProfileDir =
nullptr;
815 if(Args.hasArg(options::OPT_fprofile_arcs) ||
816Args.hasArg(options::OPT_coverage))
817FProfileDir = Args.getLastArg(options::OPT_fprofile_dir);
822 if(EmitCovNotes || EmitCovData) {
824 if(Arg *DumpDir = Args.getLastArgNoClaim(options::OPT_dumpdir)) {
827CoverageFilename = DumpDir->getValue();
828CoverageFilename += llvm::sys::path::filename(Output.
getBaseInput());
829}
else if(Arg *FinalOutput =
830 C.getArgs().getLastArg(options::OPT__SLASH_Fo)) {
831CoverageFilename = FinalOutput->getValue();
832}
else if(Arg *FinalOutput =
C.getArgs().getLastArg(options::OPT_o)) {
833CoverageFilename = FinalOutput->getValue();
835CoverageFilename = llvm::sys::path::filename(Output.
getBaseInput());
837 if(llvm::sys::path::is_relative(CoverageFilename))
838(void)
D.getVFS().makeAbsolute(CoverageFilename);
839llvm::sys::path::replace_extension(CoverageFilename,
"gcno");
842Args.MakeArgString(
"-coverage-notes-file="+ CoverageFilename));
848CoverageFilename = FProfileDir->getValue();
849llvm::sys::path::append(CoverageFilename, Gcno);
851llvm::sys::path::replace_extension(CoverageFilename,
"gcda");
853Args.MakeArgString(
"-coverage-data-file="+ CoverageFilename));
860llvm::codegenoptions::DebugInfoKind DebugInfoKind,
861 unsignedDwarfVersion,
862llvm::DebuggerKind DebuggerTuning) {
864 if(DwarfVersion > 0)
866Args.MakeArgString(
"-dwarf-version="+ Twine(DwarfVersion)));
867 switch(DebuggerTuning) {
868 casellvm::DebuggerKind::GDB:
869CmdArgs.push_back(
"-debugger-tuning=gdb");
871 casellvm::DebuggerKind::LLDB:
872CmdArgs.push_back(
"-debugger-tuning=lldb");
874 casellvm::DebuggerKind::SCE:
875CmdArgs.push_back(
"-debugger-tuning=sce");
877 casellvm::DebuggerKind::DBX:
878CmdArgs.push_back(
"-debugger-tuning=dbx");
887assert(A &&
"Expected non-nullptr argument.");
890 D.Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
896ArgStringList &CmdArgs,
899 constArg *A = Args.getLastArg(options::OPT_gz_EQ);
903StringRef
Value= A->getValue();
904 if(
Value==
"none") {
905CmdArgs.push_back(
"--compress-debug-sections=none");
906}
else if(
Value==
"zlib") {
907 if(llvm::compression::zlib::isAvailable()) {
909Args.MakeArgString(
"--compress-debug-sections="+ Twine(
Value)));
911 D.Diag(diag::warn_debug_compression_unavailable) <<
"zlib";
913}
else if(
Value==
"zstd") {
914 if(llvm::compression::zstd::isAvailable()) {
916Args.MakeArgString(
"--compress-debug-sections="+ Twine(
Value)));
918 D.Diag(diag::warn_debug_compression_unavailable) <<
"zstd";
921 D.Diag(diag::err_drv_unsupported_option_argument)
922<< A->getSpelling() <<
Value;
929ArgStringList &CmdArgs,
930 boolIsCC1As =
false) {
938CmdArgs.insert(CmdArgs.begin() + 1,
939Args.MakeArgString(Twine(
"--amdhsa-code-object-version=") +
941CmdArgs.insert(CmdArgs.begin() + 1,
"-mllvm");
944CmdArgs.insert(CmdArgs.begin() + 1,
945Args.MakeArgString(Twine(
"-mcode-object-version=") +
951llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MemBuf =
952 D.getVFS().getBufferForFile(
Path);
955llvm::file_magic Magic = llvm::identify_magic((*MemBuf)->getBuffer());
956 if(Magic == llvm::file_magic::unknown)
960 if(Magic == llvm::file_magic::clang_ast)
963llvm::object::ObjectFile::createObjectFile(**MemBuf, Magic);
964 return!Obj.takeError();
968llvm::ErrorOr<llvm::vfs::Status> Status =
D.getVFS().status(
Path);
972 if(Status->isDirectory()) {
974 for(llvm::vfs::directory_iterator DI =
D.getVFS().dir_begin(
Path, EC), DE;
975!EC && DI != DE; DI = DI.increment(EC)) {
979 D.Diag(diag::warn_drv_pch_ignoring_gch_dir) <<
Path;
985 D.Diag(diag::warn_drv_pch_ignoring_gch_file) <<
Path;
990 const Driver&
D,
constArgList &Args,
991ArgStringList &CmdArgs,
998Args.AddLastArg(CmdArgs, options::OPT_C);
999Args.AddLastArg(CmdArgs, options::OPT_CC);
1002Arg *ArgM = Args.getLastArg(options::OPT_MM);
1004ArgM = Args.getLastArg(options::OPT_M);
1005Arg *ArgMD = Args.getLastArg(options::OPT_MMD);
1007ArgMD = Args.getLastArg(options::OPT_MD);
1011CmdArgs.push_back(
"-w");
1017 const char*DepFile;
1018 if(Arg *MF = Args.getLastArg(options::OPT_MF)) {
1019DepFile = MF->getValue();
1020 C.addFailureResultFile(DepFile, &JA);
1021}
else if(Output.
getType() == types::TY_Dependencies) {
1023}
else if(!ArgMD) {
1027 C.addFailureResultFile(DepFile, &JA);
1029CmdArgs.push_back(
"-dependency-file");
1030CmdArgs.push_back(DepFile);
1032 boolHasTarget =
false;
1033 for(
constArg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
1036 if(A->getOption().matches(options::OPT_MT)) {
1037A->render(Args, CmdArgs);
1039CmdArgs.push_back(
"-MT");
1042CmdArgs.push_back(Args.MakeArgString(Quoted));
1048 const char*DepTarget;
1052Arg *OutputOpt = Args.getLastArg(options::OPT_o, options::OPT__SLASH_Fo);
1053 if(OutputOpt && Output.
getType() != types::TY_Dependencies) {
1054DepTarget = OutputOpt->getValue();
1060llvm::sys::path::replace_extension(
P,
"o");
1061DepTarget = Args.MakeArgString(llvm::sys::path::filename(
P));
1064CmdArgs.push_back(
"-MT");
1067CmdArgs.push_back(Args.MakeArgString(Quoted));
1070 if(ArgM->getOption().matches(options::OPT_M) ||
1071ArgM->getOption().matches(options::OPT_MD))
1072CmdArgs.push_back(
"-sys-header-deps");
1073 if((isa<PrecompileJobAction>(JA) &&
1074!Args.hasArg(options::OPT_fno_module_file_deps)) ||
1075Args.hasArg(options::OPT_fmodule_file_deps))
1076CmdArgs.push_back(
"-module-file-deps");
1079 if(Args.hasArg(options::OPT_MG)) {
1080 if(!ArgM || ArgM->getOption().matches(options::OPT_MD) ||
1081ArgM->getOption().matches(options::OPT_MMD))
1082 D.Diag(diag::err_drv_mg_requires_m_or_mm);
1083CmdArgs.push_back(
"-MG");
1086Args.AddLastArg(CmdArgs, options::OPT_MP);
1087Args.AddLastArg(CmdArgs, options::OPT_MV);
1103!Args.hasArg(options::OPT_nostdinc) &&
1104!Args.hasArg(options::OPT_nogpuinc) &&
1107 if(!Args.hasArg(options::OPT_nobuiltininc)) {
1111llvm::sys::path::append(
P,
"include");
1112llvm::sys::path::append(
P,
"openmp_wrappers");
1113CmdArgs.push_back(
"-internal-isystem");
1114CmdArgs.push_back(Args.MakeArgString(
P));
1117CmdArgs.push_back(
"-include");
1118CmdArgs.push_back(
"__clang_openmp_device_functions.h");
1121 if(Args.hasArg(options::OPT_foffload_via_llvm)) {
1125llvm::sys::path::append(
P,
"include",
"llvm_offload_wrappers");
1126CmdArgs.append({
"-internal-isystem", Args.MakeArgString(
P),
"-include"});
1128CmdArgs.push_back(
"__llvm_offload_device.h");
1130CmdArgs.push_back(
"__llvm_offload_host.h");
1140 constArg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
1141 constArg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
1144CmdArgs.push_back(Args.MakeArgString(
"-building-pch-with-obj"));
1147 if(Args.hasFlag(options::OPT_fpch_instantiate_templates,
1148options::OPT_fno_pch_instantiate_templates,
true))
1149CmdArgs.push_back(Args.MakeArgString(
"-fpch-instantiate-templates"));
1151 if(YcArg || YuArg) {
1152StringRef ThroughHeader = YcArg ? YcArg->getValue() : YuArg->getValue();
1153 if(!isa<PrecompileJobAction>(JA)) {
1154CmdArgs.push_back(
"-include-pch");
1155CmdArgs.push_back(Args.MakeArgString(
D.GetClPchPath(
1156 C, !ThroughHeader.empty()
1158: llvm::sys::path::filename(Inputs[0].getBaseInput()))));
1161 if(ThroughHeader.empty()) {
1162CmdArgs.push_back(Args.MakeArgString(
1163Twine(
"-pch-through-hdrstop-") + (YcArg ?
"create":
"use")));
1166Args.MakeArgString(Twine(
"-pch-through-header=") + ThroughHeader));
1171 boolRenderedImplicitInclude =
false;
1172 for(
constArg *A : Args.filtered(options::OPT_clang_i_Group)) {
1173 if(A->getOption().matches(options::OPT_include) &&
1174 D.getProbePrecompiled()) {
1176 boolIsFirstImplicitInclude = !RenderedImplicitInclude;
1177RenderedImplicitInclude =
true;
1179 boolFoundPCH =
false;
1184llvm::sys::path::replace_extension(
P,
"pch");
1185 if(
D.getVFS().exists(
P))
1190llvm::sys::path::replace_extension(
P,
"gch");
1195 if(IsFirstImplicitInclude) {
1197CmdArgs.push_back(
"-include-pch");
1198CmdArgs.push_back(Args.MakeArgString(
P));
1202 D.Diag(diag::warn_drv_pch_not_first_include) <<
P 1203<< A->getAsString(Args);
1206}
else if(A->getOption().matches(options::OPT_isystem_after)) {
1213}
else if(A->getOption().matches(options::OPT_stdlibxx_isystem)) {
1216}
else if(A->getOption().matches(options::OPT_ibuiltininc)) {
1223A->render(Args, CmdArgs);
1226Args.addAllArgs(CmdArgs,
1227{options::OPT_D, options::OPT_U, options::OPT_I_Group,
1228options::OPT_F, options::OPT_embed_dir_EQ});
1236Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
1237options::OPT_Xpreprocessor);
1240 if(Arg *A = Args.getLastArg(options::OPT_I_))
1241 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
1245StringRef sysroot =
C.getSysRoot();
1246 if(sysroot !=
"") {
1247 if(!Args.hasArg(options::OPT_isysroot)) {
1248CmdArgs.push_back(
"-isysroot");
1249CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
1266 addDirectoryList(Args, CmdArgs,
"-objcxx-isystem",
"OBJCPLUS_INCLUDE_PATH");
1274 boolHasStdlibxxIsystem = Args.hasArg(options::OPT_stdlibxx_isystem);
1277[&Args, &CmdArgs, HasStdlibxxIsystem](
const ToolChain&TC) {
1287 if(!Args.hasArg(options::OPT_nostdinc) &&
1288!Args.hasArg(options::OPT_nogpuinc) &&
1289!Args.hasArg(options::OPT_nobuiltininc)) {
1297llvm::sys::path::append(
P,
"include");
1298llvm::sys::path::append(
P,
getToolChain().getTripleString());
1299CmdArgs.push_back(
"-internal-isystem");
1300CmdArgs.push_back(Args.MakeArgString(
P));
1305llvm::sys::path::append(
P,
"include");
1306llvm::sys::path::append(
P,
"llvm_libc_wrappers");
1307CmdArgs.push_back(
"-internal-isystem");
1308CmdArgs.push_back(Args.MakeArgString(
P));
1315[&Args, &CmdArgs](
const ToolChain&TC) {
1326Args.AddLastArg(CmdArgs, options::OPT_ffile_reproducible,
1327options::OPT_fno_file_reproducible);
1329 if(
const char*Epoch = std::getenv(
"SOURCE_DATE_EPOCH")) {
1330CmdArgs.push_back(
"-source-date-epoch");
1331CmdArgs.push_back(Args.MakeArgString(Epoch));
1334Args.addOptInFlag(CmdArgs, options::OPT_fdefine_target_os_macros,
1335options::OPT_fno_define_target_os_macros);
1340 switch(Triple.getArch()) {
1344 casellvm::Triple::aarch64:
1345 casellvm::Triple::aarch64_32:
1346 casellvm::Triple::aarch64_be:
1347 casellvm::Triple::arm:
1348 casellvm::Triple::armeb:
1349 casellvm::Triple::thumb:
1350 casellvm::Triple::thumbeb:
1351 if(Triple.isOSDarwin() || Triple.isOSWindows())
1355 casellvm::Triple::ppc:
1356 casellvm::Triple::ppc64:
1357 if(Triple.isOSDarwin())
1361 casellvm::Triple::hexagon:
1362 casellvm::Triple::msp430:
1363 casellvm::Triple::ppcle:
1364 casellvm::Triple::ppc64le:
1365 casellvm::Triple::riscv32:
1366 casellvm::Triple::riscv64:
1367 casellvm::Triple::systemz:
1368 casellvm::Triple::xcore:
1369 casellvm::Triple::xtensa:
1375 constArgList &Args) {
1378 if(!Triple.isOSDarwin())
1382 returnArgs.getAllArgValues(options::OPT_arch).size() > 1;
1386 constllvm::Triple &Triple) {
1391 boolhasExplicitOutputFile =
1392Args.getLastArg(options::OPT_foptimization_record_file_EQ);
1394 D.Diag(diag::err_drv_invalid_output_with_multiple_archs)
1395<<
"-foptimization-record-file";
1402 constllvm::Triple &Triple,
1405StringRef Format =
"yaml";
1406 if(
constArg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
1407Format = A->getValue();
1409CmdArgs.push_back(
"-opt-record-file");
1411 constArg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
1413CmdArgs.push_back(A->getValue());
1415 boolhasMultipleArchs =
1416Triple.isOSDarwin() &&
1417Args.getAllArgValues(options::OPT_arch).size() > 1;
1421 if(Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) {
1422 if(Arg *FinalOutput = Args.getLastArg(options::OPT_o))
1423F = FinalOutput->getValue();
1425 if(Format !=
"yaml"&&
1426Triple.isOSDarwin() &&
1440llvm::sys::path::replace_extension(F,
"");
1442Triple.normalize());
1452 if(hasMultipleArchs) {
1456llvm::sys::path::replace_extension(F,
"");
1459F += Triple.getArchName();
1461llvm::sys::path::replace_extension(F, OldExtension);
1465Extension +=
"opt.";
1466Extension += Format;
1468llvm::sys::path::replace_extension(F, Extension);
1469CmdArgs.push_back(Args.MakeArgString(F));
1473Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
1474CmdArgs.push_back(
"-opt-record-passes");
1475CmdArgs.push_back(A->getValue());
1478 if(!Format.empty()) {
1479CmdArgs.push_back(
"-opt-record-format");
1480CmdArgs.push_back(Format.data());
1485 if(!Args.hasFlag(options::OPT_faapcs_bitfield_width,
1486options::OPT_fno_aapcs_bitfield_width,
true))
1487CmdArgs.push_back(
"-fno-aapcs-bitfield-width");
1489 if(Args.getLastArg(options::OPT_ForceAAPCSBitfieldLoad))
1490CmdArgs.push_back(
"-faapcs-bitfield-load");
1494voidRenderARMABI(
const Driver&
D,
constllvm::Triple &Triple,
1495 constArgList &Args, ArgStringList &CmdArgs) {
1499 const char*ABIName =
nullptr;
1500 if(Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1501ABIName = A->getValue();
1503std::string CPU =
getCPUName(
D, Args, Triple,
false);
1504ABIName = llvm::ARM::computeDefaultTargetABI(Triple, CPU).data();
1507CmdArgs.push_back(
"-target-abi");
1508CmdArgs.push_back(ABIName);
1511voidAddUnalignedAccessWarning(ArgStringList &CmdArgs) {
1512 autoStrictAlignIter =
1513llvm::find_if(llvm::reverse(CmdArgs), [](StringRef Arg) {
1514 returnArg ==
"+strict-align"|| Arg ==
"-strict-align";
1516 if(StrictAlignIter != CmdArgs.rend() &&
1517StringRef(*StrictAlignIter) ==
"+strict-align")
1518CmdArgs.push_back(
"-Wunaligned-access");
1526 if(!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
1527options::OPT_fno_ptrauth_intrinsics))
1528CC1Args.push_back(
"-fptrauth-intrinsics");
1530 if(!DriverArgs.hasArg(options::OPT_fptrauth_calls,
1531options::OPT_fno_ptrauth_calls))
1532CC1Args.push_back(
"-fptrauth-calls");
1534 if(!DriverArgs.hasArg(options::OPT_fptrauth_returns,
1535options::OPT_fno_ptrauth_returns))
1536CC1Args.push_back(
"-fptrauth-returns");
1538 if(!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
1539options::OPT_fno_ptrauth_auth_traps))
1540CC1Args.push_back(
"-fptrauth-auth-traps");
1542 if(!DriverArgs.hasArg(
1543options::OPT_fptrauth_vtable_pointer_address_discrimination,
1544options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1545CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
1547 if(!DriverArgs.hasArg(
1548options::OPT_fptrauth_vtable_pointer_type_discrimination,
1549options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1550CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
1552 if(!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
1553options::OPT_fno_ptrauth_indirect_gotos))
1554CC1Args.push_back(
"-fptrauth-indirect-gotos");
1556 if(!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
1557options::OPT_fno_ptrauth_init_fini))
1558CC1Args.push_back(
"-fptrauth-init-fini");
1562ArgStringList &CmdArgs,
boolisAArch64) {
1563 constArg *A = isAArch64
1564? Args.getLastArg(options::OPT_msign_return_address_EQ,
1565options::OPT_mbranch_protection_EQ)
1566: Args.getLastArg(options::OPT_mbranch_protection_EQ);
1572 if(!(isAArch64 || (Triple.isArmT32() && Triple.isArmMClass())))
1573 D.Diag(diag::warn_incompatible_branch_protection_option)
1574<< Triple.getArchName();
1576StringRef
Scope, Key;
1577 boolIndirectBranches, BranchProtectionPAuthLR, GuardedControlStack;
1579 if(A->getOption().matches(options::OPT_msign_return_address_EQ)) {
1580 Scope= A->getValue();
1582 D.Diag(diag::err_drv_unsupported_option_argument)
1583<< A->getSpelling() <<
Scope;
1585IndirectBranches =
false;
1586BranchProtectionPAuthLR =
false;
1587GuardedControlStack =
false;
1590llvm::ARM::ParsedBranchProtection PBP;
1591 boolEnablePAuthLR =
false;
1598 autoisPAuthLR = [](
const char*member) {
1599llvm::AArch64::ExtensionInfo pauthlr_extension =
1600llvm::AArch64::getExtensionByID(llvm::AArch64::AEK_PAUTHLR);
1601 returnpauthlr_extension.PosTargetFeature == member;
1604 if(std::any_of(CmdArgs.begin(), CmdArgs.end(), isPAuthLR))
1605EnablePAuthLR =
true;
1607 if(!llvm::ARM::parseBranchProtection(A->getValue(), PBP, DiagMsg,
1609 D.Diag(diag::err_drv_unsupported_option_argument)
1610<< A->getSpelling() << DiagMsg;
1611 if(!isAArch64 && PBP.Key ==
"b_key")
1612 D.Diag(diag::warn_unsupported_branch_protection)
1613<<
"b-key"<< A->getAsString(Args);
1616BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
1617IndirectBranches = PBP.BranchTargetEnforcement;
1618GuardedControlStack = PBP.GuardedControlStack;
1622Args.MakeArgString(Twine(
"-msign-return-address=") +
Scope));
1623 if(
Scope!=
"none") {
1624 if(Triple.getEnvironment() == llvm::Triple::PAuthTest)
1625 D.Diag(diag::err_drv_unsupported_opt_for_target)
1626<< A->getAsString(Args) << Triple.getTriple();
1628Args.MakeArgString(Twine(
"-msign-return-address-key=") + Key));
1630 if(BranchProtectionPAuthLR) {
1631 if(Triple.getEnvironment() == llvm::Triple::PAuthTest)
1632 D.Diag(diag::err_drv_unsupported_opt_for_target)
1633<< A->getAsString(Args) << Triple.getTriple();
1635Args.MakeArgString(Twine(
"-mbranch-protection-pauth-lr")));
1637 if(IndirectBranches)
1638CmdArgs.push_back(
"-mbranch-target-enforce");
1641 if(GuardedControlStack) {
1642 if(Triple.getEnvironment() == llvm::Triple::PAuthTest)
1643 D.Diag(diag::err_drv_unsupported_opt_for_target)
1644<< A->getAsString(Args) << Triple.getTriple();
1645CmdArgs.push_back(
"-mguarded-control-stack");
1649voidClang::AddARMTargetArgs(
constllvm::Triple &Triple,
constArgList &Args,
1650ArgStringList &CmdArgs,
boolKernelOrKext)
const{
1651RenderARMABI(
getToolChain().getDriver(), Triple, Args, CmdArgs);
1658CmdArgs.push_back(
"-msoft-float");
1659CmdArgs.push_back(
"-mfloat-abi");
1660CmdArgs.push_back(
"soft");
1663CmdArgs.push_back(
"-mfloat-abi");
1664CmdArgs.push_back(
"soft");
1668CmdArgs.push_back(
"-mfloat-abi");
1669CmdArgs.push_back(
"hard");
1673 if(Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1674options::OPT_mno_global_merge)) {
1675CmdArgs.push_back(
"-mllvm");
1676 if(A->getOption().matches(options::OPT_mno_global_merge))
1677CmdArgs.push_back(
"-arm-global-merge=false");
1679CmdArgs.push_back(
"-arm-global-merge=true");
1682 if(!Args.hasFlag(options::OPT_mimplicit_float,
1683options::OPT_mno_implicit_float,
true))
1684CmdArgs.push_back(
"-no-implicit-float");
1686 if(Args.getLastArg(options::OPT_mcmse))
1687CmdArgs.push_back(
"-mcmse");
1694AddUnalignedAccessWarning(CmdArgs);
1697voidClang::RenderTargetOptions(
constllvm::Triple &EffectiveTriple,
1698 constArgList &Args,
boolKernelOrKext,
1699ArgStringList &CmdArgs)
const{
1710 casellvm::Triple::arm:
1711 casellvm::Triple::armeb:
1712 casellvm::Triple::thumb:
1713 casellvm::Triple::thumbeb:
1715AddARMTargetArgs(EffectiveTriple, Args, CmdArgs, KernelOrKext);
1718 casellvm::Triple::aarch64:
1719 casellvm::Triple::aarch64_32:
1720 casellvm::Triple::aarch64_be:
1721AddAArch64TargetArgs(Args, CmdArgs);
1724 casellvm::Triple::loongarch32:
1725 casellvm::Triple::loongarch64:
1726AddLoongArchTargetArgs(Args, CmdArgs);
1729 casellvm::Triple::mips:
1730 casellvm::Triple::mipsel:
1731 casellvm::Triple::mips64:
1732 casellvm::Triple::mips64el:
1733AddMIPSTargetArgs(Args, CmdArgs);
1736 casellvm::Triple::ppc:
1737 casellvm::Triple::ppcle:
1738 casellvm::Triple::ppc64:
1739 casellvm::Triple::ppc64le:
1740AddPPCTargetArgs(Args, CmdArgs);
1743 casellvm::Triple::riscv32:
1744 casellvm::Triple::riscv64:
1745AddRISCVTargetArgs(Args, CmdArgs);
1748 casellvm::Triple::sparc:
1749 casellvm::Triple::sparcel:
1750 casellvm::Triple::sparcv9:
1751AddSparcTargetArgs(Args, CmdArgs);
1754 casellvm::Triple::systemz:
1755AddSystemZTargetArgs(Args, CmdArgs);
1758 casellvm::Triple::x86:
1759 casellvm::Triple::x86_64:
1760AddX86TargetArgs(Args, CmdArgs);
1763 casellvm::Triple::lanai:
1764AddLanaiTargetArgs(Args, CmdArgs);
1767 casellvm::Triple::hexagon:
1768AddHexagonTargetArgs(Args, CmdArgs);
1771 casellvm::Triple::wasm32:
1772 casellvm::Triple::wasm64:
1773AddWebAssemblyTargetArgs(Args, CmdArgs);
1776 casellvm::Triple::ve:
1777AddVETargetArgs(Args, CmdArgs);
1783voidRenderAArch64ABI(
constllvm::Triple &Triple,
constArgList &Args,
1784ArgStringList &CmdArgs) {
1785 const char*ABIName =
nullptr;
1786 if(Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1787ABIName = A->getValue();
1788 else if(Triple.isOSDarwin())
1789ABIName =
"darwinpcs";
1790 else if(Triple.getEnvironment() == llvm::Triple::PAuthTest)
1791ABIName =
"pauthtest";
1795CmdArgs.push_back(
"-target-abi");
1796CmdArgs.push_back(ABIName);
1800voidClang::AddAArch64TargetArgs(
constArgList &Args,
1801ArgStringList &CmdArgs)
const{
1804 if(!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone,
true) ||
1805Args.hasArg(options::OPT_mkernel) ||
1806Args.hasArg(options::OPT_fapple_kext))
1807CmdArgs.push_back(
"-disable-red-zone");
1809 if(!Args.hasFlag(options::OPT_mimplicit_float,
1810options::OPT_mno_implicit_float,
true))
1811CmdArgs.push_back(
"-no-implicit-float");
1813RenderAArch64ABI(Triple, Args, CmdArgs);
1816 if(Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1817options::OPT_mno_global_merge)) {
1818CmdArgs.push_back(
"-mllvm");
1819 if(A->getOption().matches(options::OPT_mno_global_merge))
1820CmdArgs.push_back(
"-aarch64-enable-global-merge=false");
1822CmdArgs.push_back(
"-aarch64-enable-global-merge=true");
1828 if(Triple.getEnvironment() == llvm::Triple::PAuthTest)
1832 if(Arg *A = Args.getLastArg(options::OPT_msve_vector_bits_EQ)) {
1833StringRef Val = A->getValue();
1835 if(Val ==
"128"|| Val ==
"256"|| Val ==
"512"|| Val ==
"1024"||
1836Val ==
"2048"|| Val ==
"128+"|| Val ==
"256+"|| Val ==
"512+"||
1837Val ==
"1024+"|| Val ==
"2048+") {
1839 if(!Val.consume_back(
"+")) {
1841assert(!
Invalid&&
"Failed to parse value");
1843Args.MakeArgString(
"-mvscale-max="+ llvm::Twine(Bits / 128)));
1847assert(!
Invalid&&
"Failed to parse value");
1849Args.MakeArgString(
"-mvscale-min="+ llvm::Twine(Bits / 128)));
1851}
else if(Val !=
"scalable")
1853 D.Diag(diag::err_drv_unsupported_option_argument)
1854<< A->getSpelling() << Val;
1859 if(
constArg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
1860CmdArgs.push_back(
"-tune-cpu");
1861 if(strcmp(A->getValue(),
"native") == 0)
1862CmdArgs.push_back(Args.MakeArgString(llvm::sys::getHostCPUName()));
1864CmdArgs.push_back(A->getValue());
1867AddUnalignedAccessWarning(CmdArgs);
1869Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_intrinsics,
1870options::OPT_fno_ptrauth_intrinsics);
1871Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_calls,
1872options::OPT_fno_ptrauth_calls);
1873Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_returns,
1874options::OPT_fno_ptrauth_returns);
1875Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_auth_traps,
1876options::OPT_fno_ptrauth_auth_traps);
1878CmdArgs, options::OPT_fptrauth_vtable_pointer_address_discrimination,
1879options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
1881CmdArgs, options::OPT_fptrauth_vtable_pointer_type_discrimination,
1882options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
1884CmdArgs, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
1885options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
1887CmdArgs, options::OPT_fptrauth_function_pointer_type_discrimination,
1888options::OPT_fno_ptrauth_function_pointer_type_discrimination);
1890Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_indirect_gotos,
1891options::OPT_fno_ptrauth_indirect_gotos);
1892Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
1893options::OPT_fno_ptrauth_init_fini);
1894Args.addOptInFlag(CmdArgs,
1895options::OPT_fptrauth_init_fini_address_discrimination,
1896options::OPT_fno_ptrauth_init_fini_address_discrimination);
1897Args.addOptInFlag(CmdArgs, options::OPT_faarch64_jump_table_hardening,
1898options::OPT_fno_aarch64_jump_table_hardening);
1901voidClang::AddLoongArchTargetArgs(
constArgList &Args,
1902ArgStringList &CmdArgs)
const{
1905CmdArgs.push_back(
"-target-abi");
1911 if(
constArg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
1912std::string TuneCPU = A->getValue();
1914CmdArgs.push_back(
"-tune-cpu");
1915CmdArgs.push_back(Args.MakeArgString(TuneCPU));
1918 if(Arg *A = Args.getLastArg(options::OPT_mannotate_tablejump,
1919options::OPT_mno_annotate_tablejump)) {
1920 if(A->getOption().matches(options::OPT_mannotate_tablejump)) {
1921CmdArgs.push_back(
"-mllvm");
1922CmdArgs.push_back(
"-loongarch-annotate-tablejump");
1927voidClang::AddMIPSTargetArgs(
constArgList &Args,
1928ArgStringList &CmdArgs)
const{
1935CmdArgs.push_back(
"-target-abi");
1936CmdArgs.push_back(ABIName.data());
1941CmdArgs.push_back(
"-msoft-float");
1942CmdArgs.push_back(
"-mfloat-abi");
1943CmdArgs.push_back(
"soft");
1947CmdArgs.push_back(
"-mfloat-abi");
1948CmdArgs.push_back(
"hard");
1951 if(Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1952options::OPT_mno_ldc1_sdc1)) {
1953 if(A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1954CmdArgs.push_back(
"-mllvm");
1955CmdArgs.push_back(
"-mno-ldc1-sdc1");
1959 if(Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1960options::OPT_mno_check_zero_division)) {
1961 if(A->getOption().matches(options::OPT_mno_check_zero_division)) {
1962CmdArgs.push_back(
"-mllvm");
1963CmdArgs.push_back(
"-mno-check-zero-division");
1967 if(Args.getLastArg(options::OPT_mfix4300)) {
1968CmdArgs.push_back(
"-mllvm");
1969CmdArgs.push_back(
"-mfix4300");
1972 if(Arg *A = Args.getLastArg(options::OPT_G)) {
1973StringRef
v= A->getValue();
1974CmdArgs.push_back(
"-mllvm");
1975CmdArgs.push_back(Args.MakeArgString(
"-mips-ssection-threshold="+
v));
1979Arg *GPOpt = Args.getLastArg(options::OPT_mgpopt, options::OPT_mno_gpopt);
1981Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
1994ABICalls && ABICalls->getOption().matches(options::OPT_mno_abicalls);
1996llvm::Reloc::Model RelocationModel;
1999std::tie(RelocationModel, PICLevel, IsPIE) =
2002NoABICalls = NoABICalls ||
2003(RelocationModel == llvm::Reloc::Static && ABIName ==
"n64");
2005 boolWantGPOpt = GPOpt && GPOpt->getOption().matches(options::OPT_mgpopt);
2007 if(NoABICalls && (!GPOpt || WantGPOpt)) {
2008CmdArgs.push_back(
"-mllvm");
2009CmdArgs.push_back(
"-mgpopt");
2011Arg *LocalSData = Args.getLastArg(options::OPT_mlocal_sdata,
2012options::OPT_mno_local_sdata);
2013Arg *ExternSData = Args.getLastArg(options::OPT_mextern_sdata,
2014options::OPT_mno_extern_sdata);
2015Arg *EmbeddedData = Args.getLastArg(options::OPT_membedded_data,
2016options::OPT_mno_embedded_data);
2018CmdArgs.push_back(
"-mllvm");
2019 if(LocalSData->getOption().matches(options::OPT_mlocal_sdata)) {
2020CmdArgs.push_back(
"-mlocal-sdata=1");
2022CmdArgs.push_back(
"-mlocal-sdata=0");
2024LocalSData->claim();
2028CmdArgs.push_back(
"-mllvm");
2029 if(ExternSData->getOption().matches(options::OPT_mextern_sdata)) {
2030CmdArgs.push_back(
"-mextern-sdata=1");
2032CmdArgs.push_back(
"-mextern-sdata=0");
2034ExternSData->claim();
2038CmdArgs.push_back(
"-mllvm");
2039 if(EmbeddedData->getOption().matches(options::OPT_membedded_data)) {
2040CmdArgs.push_back(
"-membedded-data=1");
2042CmdArgs.push_back(
"-membedded-data=0");
2044EmbeddedData->claim();
2047}
else if((!ABICalls || (!NoABICalls && ABICalls)) && WantGPOpt)
2048 D.Diag(diag::warn_drv_unsupported_gpopt) << (ABICalls ? 0 : 1);
2053 if(Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) {
2054StringRef Val = StringRef(A->getValue());
2056 if(Val ==
"never"|| Val ==
"always"|| Val ==
"optimal") {
2057CmdArgs.push_back(
"-mllvm");
2058CmdArgs.push_back(Args.MakeArgString(
"-mips-compact-branches="+ Val));
2060 D.Diag(diag::err_drv_unsupported_option_argument)
2061<< A->getSpelling() << Val;
2063 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName;
2066 if(Arg *A = Args.getLastArg(options::OPT_mrelax_pic_calls,
2067options::OPT_mno_relax_pic_calls)) {
2068 if(A->getOption().matches(options::OPT_mno_relax_pic_calls)) {
2069CmdArgs.push_back(
"-mllvm");
2070CmdArgs.push_back(
"-mips-jalr-reloc=0");
2075voidClang::AddPPCTargetArgs(
constArgList &Args,
2076ArgStringList &CmdArgs)
const{
2079 if(Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
2080CmdArgs.push_back(
"-tune-cpu");
2081StringRef CPU = llvm::PPC::getNormalizedPPCTuneCPU(
T, A->getValue());
2082CmdArgs.push_back(Args.MakeArgString(CPU.str()));
2086 const char*ABIName =
nullptr;
2087 if(
T.isOSBinFormatELF()) {
2089 casellvm::Triple::ppc64: {
2090 if(
T.isPPC64ELFv2ABI())
2096 casellvm::Triple::ppc64le:
2105 boolVecExtabi =
false;
2106 for(
constArg *A : Args.filtered(options::OPT_mabi_EQ)) {
2107StringRef
V= A->getValue();
2108 if(
V==
"ieeelongdouble") {
2109IEEELongDouble =
true;
2111}
else if(
V==
"ibmlongdouble") {
2112IEEELongDouble =
false;
2114}
else if(
V==
"vec-default") {
2117}
else if(
V==
"vec-extabi") {
2120}
else if(
V==
"elfv1") {
2123}
else if(
V==
"elfv2") {
2126}
else if(
V!=
"altivec")
2130ABIName = A->getValue();
2133CmdArgs.push_back(
"-mabi=ieeelongdouble");
2136 D.Diag(diag::err_drv_unsupported_opt_for_target)
2137<<
"-mabi=vec-extabi"<<
T.str();
2138CmdArgs.push_back(
"-mabi=vec-extabi");
2141 if(!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone,
true))
2142CmdArgs.push_back(
"-disable-red-zone");
2147CmdArgs.push_back(
"-msoft-float");
2148CmdArgs.push_back(
"-mfloat-abi");
2149CmdArgs.push_back(
"soft");
2153CmdArgs.push_back(
"-mfloat-abi");
2154CmdArgs.push_back(
"hard");
2158CmdArgs.push_back(
"-target-abi");
2159CmdArgs.push_back(ABIName);
2163voidClang::AddRISCVTargetArgs(
constArgList &Args,
2164ArgStringList &CmdArgs)
const{
2168CmdArgs.push_back(
"-target-abi");
2169CmdArgs.push_back(ABIName.data());
2171 if(Arg *A = Args.getLastArg(options::OPT_G)) {
2172CmdArgs.push_back(
"-msmall-data-limit");
2173CmdArgs.push_back(A->getValue());
2176 if(!Args.hasFlag(options::OPT_mimplicit_float,
2177options::OPT_mno_implicit_float,
true))
2178CmdArgs.push_back(
"-no-implicit-float");
2180 if(
constArg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
2181CmdArgs.push_back(
"-tune-cpu");
2182 if(strcmp(A->getValue(),
"native") == 0)
2183CmdArgs.push_back(Args.MakeArgString(llvm::sys::getHostCPUName()));
2185CmdArgs.push_back(A->getValue());
2189 if(Arg *A = Args.getLastArg(options::OPT_mrvv_vector_bits_EQ)) {
2190StringRef Val = A->getValue();
2194 unsignedMinVLen = 0;
2196 autoISAInfo = llvm::RISCVISAInfo::parseArchString(
2199 if(!errorToBool(ISAInfo.takeError()))
2200MinVLen = (*ISAInfo)->getMinVLen();
2205 if(Val ==
"zvl"&& MinVLen >= llvm::RISCV::RVVBitsPerBlock) {
2207}
else if(!Val.getAsInteger(10, Bits)) {
2210 if(Bits < MinVLen || Bits < llvm::RISCV::RVVBitsPerBlock ||
2211Bits > 65536 || !llvm::isPowerOf2_32(Bits))
2217 unsignedVScaleMin = Bits / llvm::RISCV::RVVBitsPerBlock;
2219Args.MakeArgString(
"-mvscale-max="+ llvm::Twine(VScaleMin)));
2221Args.MakeArgString(
"-mvscale-min="+ llvm::Twine(VScaleMin)));
2222}
else if(Val !=
"scalable") {
2224 D.Diag(diag::err_drv_unsupported_option_argument)
2225<< A->getSpelling() << Val;
2230voidClang::AddSparcTargetArgs(
constArgList &Args,
2231ArgStringList &CmdArgs)
const{
2237CmdArgs.push_back(
"-msoft-float");
2238CmdArgs.push_back(
"-mfloat-abi");
2239CmdArgs.push_back(
"soft");
2243CmdArgs.push_back(
"-mfloat-abi");
2244CmdArgs.push_back(
"hard");
2247 if(
constArg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
2248StringRef Name = A->getValue();
2249std::string TuneCPU;
2250 if(Name ==
"native")
2251TuneCPU = std::string(llvm::sys::getHostCPUName());
2253TuneCPU = std::string(Name);
2255CmdArgs.push_back(
"-tune-cpu");
2256CmdArgs.push_back(Args.MakeArgString(TuneCPU));
2260voidClang::AddSystemZTargetArgs(
constArgList &Args,
2261ArgStringList &CmdArgs)
const{
2262 if(
constArg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
2263CmdArgs.push_back(
"-tune-cpu");
2264 if(strcmp(A->getValue(),
"native") == 0)
2265CmdArgs.push_back(Args.MakeArgString(llvm::sys::getHostCPUName()));
2267CmdArgs.push_back(A->getValue());
2271Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain,
false);
2272 boolHasPackedStack = Args.hasFlag(options::OPT_mpacked_stack,
2273options::OPT_mno_packed_stack,
false);
2277 if(HasBackchain && HasPackedStack && !HasSoftFloat) {
2279 D.Diag(diag::err_drv_unsupported_opt)
2280<<
"-mpacked-stack -mbackchain -mhard-float";
2283CmdArgs.push_back(
"-mbackchain");
2285CmdArgs.push_back(
"-mpacked-stack");
2288CmdArgs.push_back(
"-msoft-float");
2289CmdArgs.push_back(
"-mfloat-abi");
2290CmdArgs.push_back(
"soft");
2294voidClang::AddX86TargetArgs(
constArgList &Args,
2295ArgStringList &CmdArgs)
const{
2299 if(!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone,
true) ||
2300Args.hasArg(options::OPT_mkernel) ||
2301Args.hasArg(options::OPT_fapple_kext))
2302CmdArgs.push_back(
"-disable-red-zone");
2304 if(!Args.hasFlag(options::OPT_mtls_direct_seg_refs,
2305options::OPT_mno_tls_direct_seg_refs,
true))
2306CmdArgs.push_back(
"-mno-tls-direct-seg-refs");
2310 boolNoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2311Args.hasArg(options::OPT_fapple_kext));
2312 if(Arg *A = Args.getLastArg(
2313options::OPT_msoft_float, options::OPT_mno_soft_float,
2314options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
2315 constOption &O = A->getOption();
2316NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2317O.matches(options::OPT_msoft_float));
2319 if(NoImplicitFloat)
2320CmdArgs.push_back(
"-no-implicit-float");
2322 if(Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2323StringRef
Value= A->getValue();
2325CmdArgs.push_back(
"-mllvm");
2326CmdArgs.push_back(Args.MakeArgString(
"-x86-asm-syntax="+
Value));
2327CmdArgs.push_back(Args.MakeArgString(
"-inline-asm="+
Value));
2329 D.Diag(diag::err_drv_unsupported_option_argument)
2330<< A->getSpelling() <<
Value;
2332}
else if(
D.IsCLMode()) {
2333CmdArgs.push_back(
"-mllvm");
2334CmdArgs.push_back(
"-x86-asm-syntax=intel");
2337 if(Arg *A = Args.getLastArg(options::OPT_mskip_rax_setup,
2338options::OPT_mno_skip_rax_setup))
2339 if(A->getOption().matches(options::OPT_mskip_rax_setup))
2340CmdArgs.push_back(Args.MakeArgString(
"-mskip-rax-setup"));
2343 if(Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu,
false)) {
2344CmdArgs.push_back(
"-mfloat-abi");
2345CmdArgs.push_back(
"soft");
2346CmdArgs.push_back(
"-mstack-alignment=4");
2352std::string TuneCPU;
2353 if(!Args.hasArg(clang::driver::options::OPT_march_EQ) &&
2355TuneCPU =
"generic";
2358 if(
constArg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
2359StringRef Name = A->getValue();
2361 if(Name ==
"native") {
2362Name = llvm::sys::getHostCPUName();
2364TuneCPU = std::string(Name);
2366TuneCPU = std::string(Name);
2369 if(!TuneCPU.empty()) {
2370CmdArgs.push_back(
"-tune-cpu");
2371CmdArgs.push_back(Args.MakeArgString(TuneCPU));
2375voidClang::AddHexagonTargetArgs(
constArgList &Args,
2376ArgStringList &CmdArgs)
const{
2377CmdArgs.push_back(
"-mqdsp6-compat");
2378CmdArgs.push_back(
"-Wreturn-type");
2381CmdArgs.push_back(
"-mllvm");
2383Args.MakeArgString(
"-hexagon-small-data-threshold="+ Twine(*G)));
2386 if(!Args.hasArg(options::OPT_fno_short_enums))
2387CmdArgs.push_back(
"-fshort-enums");
2388 if(Args.getLastArg(options::OPT_mieee_rnd_near)) {
2389CmdArgs.push_back(
"-mllvm");
2390CmdArgs.push_back(
"-enable-hexagon-ieee-rnd-near");
2392CmdArgs.push_back(
"-mllvm");
2393CmdArgs.push_back(
"-machine-sink-split=0");
2396voidClang::AddLanaiTargetArgs(
constArgList &Args,
2397ArgStringList &CmdArgs)
const{
2398 if(Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2399StringRef CPUName = A->getValue();
2401CmdArgs.push_back(
"-target-cpu");
2402CmdArgs.push_back(Args.MakeArgString(CPUName));
2404 if(Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2405StringRef
Value= A->getValue();
2409 if(
Value.getAsInteger(10, Mregparm)) {
2410 if(Mregparm != 4) {
2412diag::err_drv_unsupported_option_argument)
2413<< A->getSpelling() <<
Value;
2419voidClang::AddWebAssemblyTargetArgs(
constArgList &Args,
2420ArgStringList &CmdArgs)
const{
2422 if(!Args.hasArg(options::OPT_fvisibility_EQ,
2423options::OPT_fvisibility_ms_compat))
2424CmdArgs.push_back(
"-fvisibility=hidden");
2427voidClang::AddVETargetArgs(
constArgList &Args, ArgStringList &CmdArgs)
const{
2429CmdArgs.push_back(
"-mfloat-abi");
2430CmdArgs.push_back(
"hard");
2435 const InputInfo&Input,
constArgList &Args)
const{
2437 if(
C.getArgs().hasArg(options::OPT__HASH_HASH_HASH))
2440 usingllvm::yaml::escape;
2443 if(!CompilationDatabase) {
2445 auto File= std::make_unique<llvm::raw_fd_ostream>(
2447llvm::sys::fs::OF_TextWithCRLF | llvm::sys::fs::OF_Append);
2449 D.Diag(clang::diag::err_drv_compilationdatabase) <<
Filename 2453CompilationDatabase = std::move(
File);
2455 auto&CDB = *CompilationDatabase;
2456 autoCWD =
D.getVFS().getCurrentWorkingDirectory();
2459CDB <<
"{ \"directory\": \""<< escape(*CWD) <<
"\"";
2460CDB <<
", \"file\": \""<< escape(Input.
getFilename()) <<
"\"";
2462CDB <<
", \"output\": \""<< escape(Output.
getFilename()) <<
"\"";
2463CDB <<
", \"arguments\": [\""<< escape(
D.ClangExecutable) <<
"\"";
2467CDB <<
", \""<< escape(Buf) <<
"\"";
2468 if(!
D.SysRoot.empty() && !Args.hasArg(options::OPT__sysroot_EQ)) {
2469Buf =
"--sysroot=";
2471CDB <<
", \""<< escape(Buf) <<
"\"";
2473CDB <<
", \""<< escape(Input.
getFilename()) <<
"\"";
2475CDB <<
", \"-o\", \""<< escape(Output.
getFilename()) <<
"\"";
2476 for(
auto&A: Args) {
2477 auto&O = A->getOption();
2479 if(O.getID() == options::OPT_x)
2482 if(O.getGroup().isValid() && O.getGroup().getID() == options::OPT_M_Group)
2484 if(O.getID() == options::OPT_gen_cdb_fragment_path)
2487 if(O.getKind() == Option::InputClass)
2490 if(O.getID() == options::OPT_o)
2494A->render(Args, ASL);
2495 for(
auto&it: ASL)
2496CDB <<
", \""<< escape(it) <<
"\"";
2500CDB <<
", \""<< escape(Buf) <<
"\"]},\n";
2503voidClang::DumpCompilationDatabaseFragmentToDir(
2505 const InputInfo&Input,
constllvm::opt::ArgList &Args)
const{
2507 if(
C.getArgs().hasArg(options::OPT__HASH_HASH_HASH))
2510 if(CompilationDatabase)
2511DumpCompilationDatabase(
C,
"",
Target, Output, Input, Args);
2514 const auto&
Driver=
C.getDriver();
2516 autoErr = llvm::sys::fs::create_directory(
Path,
true);
2518 Driver.
Diag(diag::err_drv_compilationdatabase) << Dir << Err.message();
2522llvm::sys::path::append(
2524Twine(llvm::sys::path::filename(Input.
getFilename())) +
".%%%%.json");
2527Err = llvm::sys::fs::createUniqueFile(
Path, FD, TempPath,
2528llvm::sys::fs::OF_Text);
2530 Driver.
Diag(diag::err_drv_compilationdatabase) <<
Path<< Err.message();
2533CompilationDatabase =
2534std::make_unique<llvm::raw_fd_ostream>(FD,
true);
2535DumpCompilationDatabase(
C,
"",
Target, Output, Input, Args);
2545CmdArgs.push_back(
"-mllvm");
2546CmdArgs.push_back(Args.MakeArgString(
"-arm-implicit-it="+
Value));
2550 constArgList &Args,
2551ArgStringList &CmdArgs,
2561Args.addOptInFlag(CmdArgs, options::OPT_mrelax_all,
2562options::OPT_mno_relax_all);
2566 boolDefaultIncrementalLinkerCompatible =
2567 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2568 if(Args.hasFlag(options::OPT_mincremental_linker_compatible,
2569options::OPT_mno_incremental_linker_compatible,
2570DefaultIncrementalLinkerCompatible))
2571CmdArgs.push_back(
"-mincremental-linker-compatible");
2573Args.AddLastArg(CmdArgs, options::OPT_femit_dwarf_unwind_EQ);
2575Args.addOptInFlag(CmdArgs, options::OPT_femit_compact_unwind_non_canonical,
2576options::OPT_fno_emit_compact_unwind_non_canonical);
2586 boolTakeNextArg =
false;
2588 constllvm::Triple &Triple =
C.getDefaultToolChain().getTriple();
2589 boolIsELF = Triple.isOSBinFormatELF();
2590 boolCrel =
false, ExperimentalCrel =
false;
2591 boolImplicitMapSyms =
false;
2592 boolUseRelaxRelocations =
C.getDefaultToolChain().useRelaxRelocations();
2593 boolUseNoExecStack =
false;
2595 const char*MipsTargetFeature =
nullptr;
2596StringRef ImplicitIt;
2597 for(
constArg *A :
2598Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler,
2599options::OPT_mimplicit_it_EQ)) {
2602 if(A->getOption().getID() == options::OPT_mimplicit_it_EQ) {
2603 switch(
C.getDefaultToolChain().getArch()) {
2604 casellvm::Triple::arm:
2605 casellvm::Triple::armeb:
2606 casellvm::Triple::thumb:
2607 casellvm::Triple::thumbeb:
2609ImplicitIt = A->getValue();
2611 D.Diag(diag::err_drv_unsupported_option_argument)
2612<< A->getSpelling() << ImplicitIt;
2619 for(StringRef
Value: A->getValues()) {
2621CmdArgs.push_back(
Value.data());
2622TakeNextArg =
false;
2626 if(
C.getDefaultToolChain().getTriple().isOSBinFormatCOFF() &&
2627 Value==
"-mbig-obj")
2631 autocheckArg = [&](
boolValidTarget,
2632std::initializer_list<const char *>
Set) {
2634 D.Diag(diag::err_drv_unsupported_opt_for_target)
2635<< (Twine(
"-Wa,") +
Equal.first +
"=").str()
2636<< Triple.getTriple();
2637}
else if(!llvm::is_contained(
Set,
Equal.second)) {
2638 D.Diag(diag::err_drv_unsupported_option_argument)
2639<< (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
2642 switch(
C.getDefaultToolChain().getArch()) {
2645 casellvm::Triple::x86:
2646 casellvm::Triple::x86_64:
2647 if(
Equal.first ==
"-mrelax-relocations"||
2648 Equal.first ==
"--mrelax-relocations") {
2649UseRelaxRelocations =
Equal.second ==
"yes";
2650checkArg(IsELF, {
"yes",
"no"});
2653 if(
Value==
"-msse2avx") {
2654CmdArgs.push_back(
"-msse2avx");
2658 casellvm::Triple::wasm32:
2659 casellvm::Triple::wasm64:
2660 if(
Value==
"--no-type-check") {
2661CmdArgs.push_back(
"-mno-type-check");
2665 casellvm::Triple::thumb:
2666 casellvm::Triple::thumbeb:
2667 casellvm::Triple::arm:
2668 casellvm::Triple::armeb:
2669 if(
Equal.first ==
"-mimplicit-it") {
2671ImplicitIt =
Equal.second;
2672checkArg(
true, {
"always",
"never",
"arm",
"thumb"});
2675 if(
Value==
"-mthumb")
2680 casellvm::Triple::aarch64:
2681 casellvm::Triple::aarch64_be:
2682 casellvm::Triple::aarch64_32:
2683 if(
Equal.first ==
"-mmapsyms") {
2684ImplicitMapSyms =
Equal.second ==
"implicit";
2685checkArg(IsELF, {
"default",
"implicit"});
2689 casellvm::Triple::mips:
2690 casellvm::Triple::mipsel:
2691 casellvm::Triple::mips64:
2692 casellvm::Triple::mips64el:
2693 if(
Value==
"--trap") {
2694CmdArgs.push_back(
"-target-feature");
2695CmdArgs.push_back(
"+use-tcc-in-div");
2698 if(
Value==
"--break") {
2699CmdArgs.push_back(
"-target-feature");
2700CmdArgs.push_back(
"-use-tcc-in-div");
2703 if(
Value.starts_with(
"-msoft-float")) {
2704CmdArgs.push_back(
"-target-feature");
2705CmdArgs.push_back(
"+soft-float");
2708 if(
Value.starts_with(
"-mhard-float")) {
2709CmdArgs.push_back(
"-target-feature");
2710CmdArgs.push_back(
"-soft-float");
2713 if(
Value==
"-mmsa") {
2717 if(
Value==
"-mno-msa") {
2721MipsTargetFeature = llvm::StringSwitch<const char *>(
Value)
2722.Case(
"-mips1",
"+mips1")
2723.Case(
"-mips2",
"+mips2")
2724.Case(
"-mips3",
"+mips3")
2725.Case(
"-mips4",
"+mips4")
2726.Case(
"-mips5",
"+mips5")
2727.Case(
"-mips32",
"+mips32")
2728.Case(
"-mips32r2",
"+mips32r2")
2729.Case(
"-mips32r3",
"+mips32r3")
2730.Case(
"-mips32r5",
"+mips32r5")
2731.Case(
"-mips32r6",
"+mips32r6")
2732.Case(
"-mips64",
"+mips64")
2733.Case(
"-mips64r2",
"+mips64r2")
2734.Case(
"-mips64r3",
"+mips64r3")
2735.Case(
"-mips64r5",
"+mips64r5")
2736.Case(
"-mips64r6",
"+mips64r6")
2737.Default(
nullptr);
2738 if(MipsTargetFeature)
2743 if(
Value==
"-force_cpusubtype_ALL") {
2745}
else if(
Value==
"-L") {
2746CmdArgs.push_back(
"-msave-temp-labels");
2747}
else if(
Value==
"--fatal-warnings") {
2748CmdArgs.push_back(
"-massembler-fatal-warnings");
2749}
else if(
Value==
"--no-warn"||
Value==
"-W") {
2750CmdArgs.push_back(
"-massembler-no-warn");
2751}
else if(
Value==
"--noexecstack") {
2752UseNoExecStack =
true;
2753}
else if(
Value.starts_with(
"-compress-debug-sections") ||
2754 Value.starts_with(
"--compress-debug-sections") ||
2755 Value==
"-nocompress-debug-sections"||
2756 Value==
"--nocompress-debug-sections") {
2757CmdArgs.push_back(
Value.data());
2758}
else if(
Value==
"--crel") {
2760}
else if(
Value==
"--no-crel") {
2762}
else if(
Value==
"--allow-experimental-crel") {
2763ExperimentalCrel =
true;
2764}
else if(
Value.starts_with(
"-I")) {
2765CmdArgs.push_back(
Value.data());
2768 if(
Value==
"-I")
2769TakeNextArg =
true;
2770}
else if(
Value.starts_with(
"-gdwarf-")) {
2773 if(DwarfVersion == 0) {
2774CmdArgs.push_back(
Value.data());
2777llvm::codegenoptions::DebugInfoConstructor,
2778DwarfVersion, llvm::DebuggerKind::Default);
2780}
else if(
Value.starts_with(
"-mcpu") ||
Value.starts_with(
"-mfpu") ||
2781 Value.starts_with(
"-mhwdiv") ||
Value.starts_with(
"-march")) {
2783}
else if(
Value==
"-defsym"||
Value==
"--defsym") {
2784 if(A->getNumValues() != 2) {
2785 D.Diag(diag::err_drv_defsym_invalid_format) <<
Value;
2788 const char*S = A->getValue(1);
2789 autoPair = StringRef(S).split(
'=');
2790 autoSym = Pair.first;
2791 autoSVal = Pair.second;
2793 if(Sym.empty() || SVal.empty()) {
2794 D.Diag(diag::err_drv_defsym_invalid_format) << S;
2798 if(SVal.getAsInteger(0, IVal)) {
2799 D.Diag(diag::err_drv_defsym_invalid_symval) << SVal;
2802CmdArgs.push_back(
"--defsym");
2803TakeNextArg =
true;
2804}
else if(
Value==
"-fdebug-compilation-dir") {
2805CmdArgs.push_back(
"-fdebug-compilation-dir");
2806TakeNextArg =
true;
2807}
else if(
Value.consume_front(
"-fdebug-compilation-dir=")) {
2811CmdArgs.push_back(
"-fdebug-compilation-dir");
2812CmdArgs.push_back(
Value.data());
2813}
else if(
Value==
"--version") {
2814 D.PrintVersion(
C, llvm::outs());
2816 D.Diag(diag::err_drv_unsupported_option_argument)
2817<< A->getSpelling() <<
Value;
2821 if(ImplicitIt.size())
2824 if(!ExperimentalCrel)
2825 D.Diag(diag::err_drv_experimental_crel);
2826 if(Triple.isOSBinFormatELF() && !Triple.isMIPS()) {
2827CmdArgs.push_back(
"--crel");
2829 D.Diag(diag::err_drv_unsupported_opt_for_target)
2830<<
"-Wa,--crel"<<
D.getTargetTriple();
2833 if(ImplicitMapSyms)
2834CmdArgs.push_back(
"-mmapsyms=implicit");
2836CmdArgs.push_back(
"-mmsa");
2837 if(!UseRelaxRelocations)
2838CmdArgs.push_back(
"-mrelax-relocations=no");
2840CmdArgs.push_back(
"-mnoexecstack");
2841 if(MipsTargetFeature !=
nullptr) {
2842CmdArgs.push_back(
"-target-feature");
2843CmdArgs.push_back(MipsTargetFeature);
2847 if(
C.getDriver().embedBitcodeEnabled() ||
2848 C.getDriver().embedBitcodeMarkerOnly())
2849Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
2851 if(
const char*AsSecureLogFile = getenv(
"AS_SECURE_LOG_FILE")) {
2852CmdArgs.push_back(
"-as-secure-log-file");
2853CmdArgs.push_back(Args.MakeArgString(AsSecureLogFile));
2884 if(str1 != str2 && !str2.empty() && !str1.empty()) {
2885 D.Diag(clang::diag::warn_drv_overriding_option) << str1 << str2;
2892 if(!ComplexRangeStr.empty())
2893 return "-complex-range="+ ComplexRangeStr;
2894 returnComplexRangeStr;
2898 boolOFastEnabled,
constArgList &Args,
2899ArgStringList &CmdArgs,
2902 constexprstd::array VecLibImpliesNoMathErrno{llvm::StringLiteral(
"ArmPL"),
2903llvm::StringLiteral(
"SLEEF")};
2904 boolNoMathErrnoWasImpliedByVecLib =
false;
2905 constArg *VecLibArg =
nullptr;
2907 constArg *ArgThatEnabledMathErrnoAfterVecLib =
nullptr;
2914 boolHonorINFs =
true;
2915 boolHonorNaNs =
true;
2916 boolApproxFunc =
false;
2919 boolAssociativeMath =
false;
2920 boolReciprocalMath =
false;
2921 boolSignedZeros =
true;
2922 boolTrappingMath =
false;
2923 boolTrappingMathPresent =
false;
2925 boolRoundingFPMath =
false;
2927StringRef FPModel =
"";
2929StringRef FPExceptionBehavior =
"";
2931StringRef FPEvalMethod =
"";
2932llvm::DenormalMode DenormalFPMath =
2934llvm::DenormalMode DenormalFP32Math =
2939StringRef FPContract;
2940StringRef LastSeenFfpContractOption;
2941StringRef LastFpContractOverrideOption;
2942 boolSeenUnsafeMathModeOption =
false;
2946 boolStrictFPModel =
false;
2947StringRef Float16ExcessPrecision =
"";
2948StringRef BFloat16ExcessPrecision =
"";
2950std::string ComplexRangeStr =
"";
2951std::string GccRangeComplexOption =
"";
2956 if(
Range!= NewRange)
2958!GccRangeComplexOption.empty()
2959? GccRangeComplexOption
2966 autoapplyFastMath = [&](
boolAggressive) {
2977AssociativeMath =
true;
2978ReciprocalMath =
true;
2980SignedZeros =
false;
2981TrappingMath =
false;
2982RoundingFPMath =
false;
2983FPExceptionBehavior =
"";
2984FPContract =
"fast";
2985SeenUnsafeMathModeOption =
true;
2989 autorestoreFPContractState = [&]() {
2999 if(LastSeenFfpContractOption !=
"")
3000FPContract = LastSeenFfpContractOption;
3001 else if(SeenUnsafeMathModeOption)
3006LastFpContractOverrideOption =
"";
3009 if(
constArg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3010CmdArgs.push_back(
"-mlimit-float-precision");
3011CmdArgs.push_back(A->getValue());
3014 for(
constArg *A : Args) {
3015 autoCheckMathErrnoForVecLib =
3016llvm::make_scope_exit([&, MathErrnoBeforeArg = MathErrno] {
3017 if(NoMathErrnoWasImpliedByVecLib && !MathErrnoBeforeArg && MathErrno)
3018ArgThatEnabledMathErrnoAfterVecLib = A;
3021 switch(A->getOption().getID()) {
3023 default:
continue;
3025 caseoptions::OPT_fcx_limited_range:
3026 if(GccRangeComplexOption.empty()) {
3029 "-fcx-limited-range");
3031 if(GccRangeComplexOption !=
"-fno-cx-limited-range")
3034GccRangeComplexOption =
"-fcx-limited-range";
3037 caseoptions::OPT_fno_cx_limited_range:
3038 if(GccRangeComplexOption.empty()) {
3040 "-fno-cx-limited-range");
3042 if(GccRangeComplexOption !=
"-fcx-limited-range"&&
3043GccRangeComplexOption !=
"-fno-cx-fortran-rules")
3045 "-fno-cx-limited-range");
3047GccRangeComplexOption =
"-fno-cx-limited-range";
3050 caseoptions::OPT_fcx_fortran_rules:
3051 if(GccRangeComplexOption.empty())
3053 "-fcx-fortran-rules");
3056GccRangeComplexOption =
"-fcx-fortran-rules";
3059 caseoptions::OPT_fno_cx_fortran_rules:
3060 if(GccRangeComplexOption.empty()) {
3062 "-fno-cx-fortran-rules");
3064 if(GccRangeComplexOption !=
"-fno-cx-limited-range")
3066 "-fno-cx-fortran-rules");
3068GccRangeComplexOption =
"-fno-cx-fortran-rules";
3071 caseoptions::OPT_fcomplex_arithmetic_EQ: {
3073StringRef Val = A->getValue();
3076 else if(Val ==
"improved")
3078 else if(Val ==
"promoted")
3080 else if(Val ==
"basic")
3083 D.Diag(diag::err_drv_unsupported_option_argument)
3084<< A->getSpelling() << Val;
3087 if(!GccRangeComplexOption.empty()) {
3088 if(GccRangeComplexOption !=
"-fcx-limited-range") {
3089 if(GccRangeComplexOption !=
"-fcx-fortran-rules") {
3106 caseoptions::OPT_ffp_model_EQ: {
3110ApproxFunc =
false;
3113AssociativeMath =
false;
3114ReciprocalMath =
false;
3115SignedZeros =
true;
3117StringRef Val = A->getValue();
3118 if(OFastEnabled && Val !=
"aggressive") {
3120 D.Diag(clang::diag::warn_drv_overriding_option)
3121<< Args.MakeArgString(
"-ffp-model="+ Val) <<
"-Ofast";
3124StrictFPModel =
false;
3125 if(!FPModel.empty() && FPModel != Val)
3126 D.Diag(clang::diag::warn_drv_overriding_option)
3127<< Args.MakeArgString(
"-ffp-model="+ FPModel)
3128<< Args.MakeArgString(
"-ffp-model="+ Val);
3129 if(Val ==
"fast") {
3131applyFastMath(
false);
3133LastFpContractOverrideOption =
"-ffp-model=fast";
3134}
else if(Val ==
"aggressive") {
3136applyFastMath(
true);
3138LastFpContractOverrideOption =
"-ffp-model=aggressive";
3139}
else if(Val ==
"precise") {
3142LastFpContractOverrideOption =
"-ffp-model=precise";
3144}
else if(Val ==
"strict") {
3145StrictFPModel =
true;
3146FPExceptionBehavior =
"strict";
3148FPContract =
"off";
3149LastFpContractOverrideOption =
"-ffp-model=strict";
3150TrappingMath =
true;
3151RoundingFPMath =
true;
3154 D.Diag(diag::err_drv_unsupported_option_argument)
3155<< A->getSpelling() << Val;
3160 caseoptions::OPT_fhonor_infinities: HonorINFs =
true;
break;
3161 caseoptions::OPT_fno_honor_infinities: HonorINFs =
false;
break;
3162 caseoptions::OPT_fhonor_nans: HonorNaNs =
true;
break;
3163 caseoptions::OPT_fno_honor_nans: HonorNaNs =
false;
break;
3164 caseoptions::OPT_fapprox_func: ApproxFunc =
true;
break;
3165 caseoptions::OPT_fno_approx_func: ApproxFunc =
false;
break;
3166 caseoptions::OPT_fmath_errno: MathErrno =
true;
break;
3167 caseoptions::OPT_fno_math_errno: MathErrno =
false;
break;
3168 caseoptions::OPT_fassociative_math: AssociativeMath =
true;
break;
3169 caseoptions::OPT_fno_associative_math: AssociativeMath =
false;
break;
3170 caseoptions::OPT_freciprocal_math: ReciprocalMath =
true;
break;
3171 caseoptions::OPT_fno_reciprocal_math: ReciprocalMath =
false;
break;
3172 caseoptions::OPT_fsigned_zeros: SignedZeros =
true;
break;
3173 caseoptions::OPT_fno_signed_zeros: SignedZeros =
false;
break;
3174 caseoptions::OPT_ftrapping_math:
3175 if(!TrappingMathPresent && !FPExceptionBehavior.empty() &&
3176FPExceptionBehavior !=
"strict")
3178 D.Diag(clang::diag::warn_drv_overriding_option)
3179<< Args.MakeArgString(
"-ffp-exception-behavior="+
3180FPExceptionBehavior)
3181<<
"-ftrapping-math";
3182TrappingMath =
true;
3183TrappingMathPresent =
true;
3184FPExceptionBehavior =
"strict";
3186 caseoptions::OPT_fveclib:
3188NoMathErrnoWasImpliedByVecLib =
3189llvm::is_contained(VecLibImpliesNoMathErrno, A->getValue());
3190 if(NoMathErrnoWasImpliedByVecLib)
3193 caseoptions::OPT_fno_trapping_math:
3194 if(!TrappingMathPresent && !FPExceptionBehavior.empty() &&
3195FPExceptionBehavior !=
"ignore")
3197 D.Diag(clang::diag::warn_drv_overriding_option)
3198<< Args.MakeArgString(
"-ffp-exception-behavior="+
3199FPExceptionBehavior)
3200<<
"-fno-trapping-math";
3201TrappingMath =
false;
3202TrappingMathPresent =
true;
3203FPExceptionBehavior =
"ignore";
3206 caseoptions::OPT_frounding_math:
3207RoundingFPMath =
true;
3210 caseoptions::OPT_fno_rounding_math:
3211RoundingFPMath =
false;
3214 caseoptions::OPT_fdenormal_fp_math_EQ:
3215DenormalFPMath = llvm::parseDenormalFPAttribute(A->getValue());
3216DenormalFP32Math = DenormalFPMath;
3217 if(!DenormalFPMath.isValid()) {
3218 D.Diag(diag::err_drv_invalid_value)
3219<< A->getAsString(Args) << A->getValue();
3223 caseoptions::OPT_fdenormal_fp_math_f32_EQ:
3224DenormalFP32Math = llvm::parseDenormalFPAttribute(A->getValue());
3225 if(!DenormalFP32Math.isValid()) {
3226 D.Diag(diag::err_drv_invalid_value)
3227<< A->getAsString(Args) << A->getValue();
3232 caseoptions::OPT_ffp_contract: {
3233StringRef Val = A->getValue();
3234 if(Val ==
"fast"|| Val ==
"on"|| Val ==
"off"||
3235Val ==
"fast-honor-pragmas") {
3236 if(Val != FPContract && LastFpContractOverrideOption !=
"") {
3237 D.Diag(clang::diag::warn_drv_overriding_option)
3238<< LastFpContractOverrideOption
3239<< Args.MakeArgString(
"-ffp-contract="+ Val);
3243LastSeenFfpContractOption = Val;
3244LastFpContractOverrideOption =
"";
3246 D.Diag(diag::err_drv_unsupported_option_argument)
3247<< A->getSpelling() << Val;
3252 caseoptions::OPT_ffp_exception_behavior_EQ: {
3253StringRef Val = A->getValue();
3254 if(!TrappingMathPresent && !FPExceptionBehavior.empty() &&
3255FPExceptionBehavior != Val)
3257 D.Diag(clang::diag::warn_drv_overriding_option)
3258<< Args.MakeArgString(
"-ffp-exception-behavior="+
3259FPExceptionBehavior)
3260<< Args.MakeArgString(
"-ffp-exception-behavior="+ Val);
3261TrappingMath = TrappingMathPresent =
false;
3262 if(Val ==
"ignore"|| Val ==
"maytrap")
3263FPExceptionBehavior = Val;
3264 else if(Val ==
"strict") {
3265FPExceptionBehavior = Val;
3266TrappingMath = TrappingMathPresent =
true;
3268 D.Diag(diag::err_drv_unsupported_option_argument)
3269<< A->getSpelling() << Val;
3274 caseoptions::OPT_ffp_eval_method_EQ: {
3275StringRef Val = A->getValue();
3276 if(Val ==
"double"|| Val ==
"extended"|| Val ==
"source")
3279 D.Diag(diag::err_drv_unsupported_option_argument)
3280<< A->getSpelling() << Val;
3284 caseoptions::OPT_fexcess_precision_EQ: {
3285StringRef Val = A->getValue();
3286 constllvm::Triple::ArchType Arch = TC.
getArch();
3287 if(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
3288 if(Val ==
"standard"|| Val ==
"fast")
3289Float16ExcessPrecision = Val;
3293 else if(Val ==
"16")
3294Float16ExcessPrecision =
"none";
3296 D.Diag(diag::err_drv_unsupported_option_argument)
3297<< A->getSpelling() << Val;
3299 if(!(Val ==
"standard"|| Val ==
"fast"))
3300 D.Diag(diag::err_drv_unsupported_option_argument)
3301<< A->getSpelling() << Val;
3303BFloat16ExcessPrecision = Float16ExcessPrecision;
3306 caseoptions::OPT_ffinite_math_only:
3310 caseoptions::OPT_fno_finite_math_only:
3315 caseoptions::OPT_funsafe_math_optimizations:
3316AssociativeMath =
true;
3317ReciprocalMath =
true;
3318SignedZeros =
false;
3320TrappingMath =
false;
3321FPExceptionBehavior =
"";
3322FPContract =
"fast";
3323LastFpContractOverrideOption =
"-funsafe-math-optimizations";
3324SeenUnsafeMathModeOption =
true;
3326 caseoptions::OPT_fno_unsafe_math_optimizations:
3327AssociativeMath =
false;
3328ReciprocalMath =
false;
3329SignedZeros =
true;
3330ApproxFunc =
false;
3331restoreFPContractState();
3334 caseoptions::OPT_Ofast:
3339 caseoptions::OPT_ffast_math:
3340applyFastMath(
true);
3341 if(A->getOption().getID() == options::OPT_Ofast)
3342LastFpContractOverrideOption =
"-Ofast";
3344LastFpContractOverrideOption =
"-ffast-math";
3346 caseoptions::OPT_fno_fast_math:
3353AssociativeMath =
false;
3354ReciprocalMath =
false;
3355ApproxFunc =
false;
3356SignedZeros =
true;
3357restoreFPContractState();
3358LastFpContractOverrideOption =
"";
3368 if(StrictFPModel) {
3371 if(HonorINFs && HonorNaNs && !AssociativeMath && !ReciprocalMath &&
3372SignedZeros && TrappingMath && RoundingFPMath && !ApproxFunc &&
3373FPContract ==
"off")
3377StrictFPModel =
false;
3382 autoRHS = (A->getNumValues() == 0)
3384: Args.MakeArgString(A->getSpelling() + A->getValue());
3385 if(A->getSpelling() !=
"-ffp-contract=") {
3386 if(RHS !=
"-ffp-model=strict")
3387 D.Diag(clang::diag::warn_drv_overriding_option)
3388<<
"-ffp-model=strict"<< RHS;
3398CmdArgs.push_back(
"-menable-no-infs");
3401CmdArgs.push_back(
"-menable-no-nans");
3404CmdArgs.push_back(
"-fapprox-func");
3407CmdArgs.push_back(
"-fmath-errno");
3408 if(NoMathErrnoWasImpliedByVecLib)
3409 D.Diag(clang::diag::warn_drv_math_errno_enabled_after_veclib)
3410<< ArgThatEnabledMathErrnoAfterVecLib->getAsString(Args)
3411<< VecLibArg->getAsString(Args);
3414 if(AssociativeMath && ReciprocalMath && !SignedZeros && ApproxFunc &&
3416CmdArgs.push_back(
"-funsafe-math-optimizations");
3419CmdArgs.push_back(
"-fno-signed-zeros");
3421 if(AssociativeMath && !SignedZeros && !TrappingMath)
3422CmdArgs.push_back(
"-mreassociate");
3425CmdArgs.push_back(
"-freciprocal-math");
3429assert(FPExceptionBehavior ==
"strict");
3433 if(DenormalFPMath != llvm::DenormalMode::getIEEE()) {
3435llvm::raw_svector_ostream ArgStr(DenormFlag);
3436ArgStr <<
"-fdenormal-fp-math="<< DenormalFPMath;
3437CmdArgs.push_back(Args.MakeArgString(ArgStr.str()));
3441 if(DenormalFP32Math != DenormalFPMath) {
3443llvm::raw_svector_ostream ArgStr(DenormFlag);
3444ArgStr <<
"-fdenormal-fp-math-f32="<< DenormalFP32Math;
3445CmdArgs.push_back(Args.MakeArgString(ArgStr.str()));
3448 if(!FPContract.empty())
3449CmdArgs.push_back(Args.MakeArgString(
"-ffp-contract="+ FPContract));
3452CmdArgs.push_back(Args.MakeArgString(
"-frounding-math"));
3454CmdArgs.push_back(Args.MakeArgString(
"-fno-rounding-math"));
3456 if(!FPExceptionBehavior.empty())
3457CmdArgs.push_back(Args.MakeArgString(
"-ffp-exception-behavior="+
3458FPExceptionBehavior));
3460 if(!FPEvalMethod.empty())
3461CmdArgs.push_back(Args.MakeArgString(
"-ffp-eval-method="+ FPEvalMethod));
3463 if(!Float16ExcessPrecision.empty())
3464CmdArgs.push_back(Args.MakeArgString(
"-ffloat16-excess-precision="+
3465Float16ExcessPrecision));
3466 if(!BFloat16ExcessPrecision.empty())
3467CmdArgs.push_back(Args.MakeArgString(
"-fbfloat16-excess-precision="+
3468BFloat16ExcessPrecision));
3475 if(!HonorINFs && !HonorNaNs && !MathErrno && AssociativeMath && ApproxFunc &&
3476ReciprocalMath && !SignedZeros && !TrappingMath && !RoundingFPMath)
3477CmdArgs.push_back(
"-ffast-math");
3483 boolshouldAddFiniteMathOnly =
false;
3484 if(!HonorINFs && !HonorNaNs) {
3485shouldAddFiniteMathOnly =
true;
3487 boolInfValues =
true;
3488 boolNanValues =
true;
3489 for(
const auto*Arg : Args.filtered(options::OPT_Xclang)) {
3490StringRef ArgValue = Arg->getValue();
3491 if(ArgValue ==
"-menable-no-nans")
3493 else if(ArgValue ==
"-menable-no-infs")
3496 if(!NanValues && !InfValues)
3497shouldAddFiniteMathOnly =
true;
3499 if(shouldAddFiniteMathOnly) {
3500CmdArgs.push_back(
"-ffinite-math-only");
3502 if(
constArg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3503CmdArgs.push_back(
"-mfpmath");
3504CmdArgs.push_back(A->getValue());
3508 if(Args.hasFlag(options::OPT_fno_strict_float_cast_overflow,
3509options::OPT_fstrict_float_cast_overflow,
false))
3510CmdArgs.push_back(
"-fno-strict-float-cast-overflow");
3514 if(!ComplexRangeStr.empty()) {
3515CmdArgs.push_back(Args.MakeArgString(ComplexRangeStr));
3516 if(Args.hasArg(options::OPT_fcomplex_arithmetic_EQ))
3517CmdArgs.push_back(Args.MakeArgString(
"-fcomplex-arithmetic="+
3520 if(Args.hasArg(options::OPT_fcx_limited_range))
3521CmdArgs.push_back(
"-fcx-limited-range");
3522 if(Args.hasArg(options::OPT_fcx_fortran_rules))
3523CmdArgs.push_back(
"-fcx-fortran-rules");
3524 if(Args.hasArg(options::OPT_fno_cx_limited_range))
3525CmdArgs.push_back(
"-fno-cx-limited-range");
3526 if(Args.hasArg(options::OPT_fno_cx_fortran_rules))
3527CmdArgs.push_back(
"-fno-cx-fortran-rules");
3531 constllvm::Triple &Triple,
3534 if(!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
3535CmdArgs.push_back(
"-analyzer-checker=core");
3536CmdArgs.push_back(
"-analyzer-checker=apiModeling");
3538 if(!Triple.isWindowsMSVCEnvironment()) {
3539CmdArgs.push_back(
"-analyzer-checker=unix");
3542CmdArgs.push_back(
"-analyzer-checker=unix.API");
3543CmdArgs.push_back(
"-analyzer-checker=unix.Malloc");
3544CmdArgs.push_back(
"-analyzer-checker=unix.MallocSizeof");
3545CmdArgs.push_back(
"-analyzer-checker=unix.MismatchedDeallocator");
3546CmdArgs.push_back(
"-analyzer-checker=unix.cstring.BadSizeArg");
3547CmdArgs.push_back(
"-analyzer-checker=unix.cstring.NullArg");
3551 if(Triple.isPS()) {
3552CmdArgs.push_back(
"-analyzer-disable-checker=unix.API");
3553CmdArgs.push_back(
"-analyzer-disable-checker=unix.Vfork");
3556 if(Triple.isOSDarwin()) {
3557CmdArgs.push_back(
"-analyzer-checker=osx");
3559 "-analyzer-checker=security.insecureAPI.decodeValueOfObjCType");
3561 else if(Triple.isOSFuchsia())
3562CmdArgs.push_back(
"-analyzer-checker=fuchsia");
3564CmdArgs.push_back(
"-analyzer-checker=deadcode");
3567CmdArgs.push_back(
"-analyzer-checker=cplusplus");
3569 if(!Triple.isPS()) {
3570CmdArgs.push_back(
"-analyzer-checker=security.insecureAPI.UncheckedReturn");
3571CmdArgs.push_back(
"-analyzer-checker=security.insecureAPI.getpw");
3572CmdArgs.push_back(
"-analyzer-checker=security.insecureAPI.gets");
3573CmdArgs.push_back(
"-analyzer-checker=security.insecureAPI.mktemp");
3574CmdArgs.push_back(
"-analyzer-checker=security.insecureAPI.mkstemp");
3575CmdArgs.push_back(
"-analyzer-checker=security.insecureAPI.vfork");
3579CmdArgs.push_back(
"-analyzer-checker=nullability.NullPassedToNonnull");
3580CmdArgs.push_back(
"-analyzer-checker=nullability.NullReturnedFromNonnull");
3584CmdArgs.push_back(
"-analyzer-output");
3585 if(Arg *A = Args.getLastArg(options::OPT__analyzer_output))
3586CmdArgs.push_back(A->getValue());
3588CmdArgs.push_back(
"plist");
3593CmdArgs.push_back(
"-w");
3596Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
3603 if(std::isdigit(S[0]))
3606 returnllvm::all_of(S, [](
char C) {
returnstd::isalnum(
C) ||
C==
'_'; });
3610 constArgList &Args, ArgStringList &CmdArgs,
3611 boolKernelOrKext) {
3616 if(EffectiveTriple.isNVPTX())
3624 if(Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3625options::OPT_fstack_protector_all,
3626options::OPT_fstack_protector_strong,
3627options::OPT_fstack_protector)) {
3628 if(A->getOption().matches(options::OPT_fstack_protector))
3629StackProtectorLevel =
3631 else if(A->getOption().matches(options::OPT_fstack_protector_strong))
3633 else if(A->getOption().matches(options::OPT_fstack_protector_all))
3637 D.Diag(diag::warn_drv_unsupported_option_for_target)
3638<< A->getSpelling() << EffectiveTriple.getTriple();
3639StackProtectorLevel = DefaultStackProtectorLevel;
3642StackProtectorLevel = DefaultStackProtectorLevel;
3645 if(StackProtectorLevel) {
3646CmdArgs.push_back(
"-stack-protector");
3647CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
3651 for(
constArg *A : Args.filtered(options::OPT__param)) {
3652StringRef Str(A->getValue());
3653 if(Str.starts_with(
"ssp-buffer-size=")) {
3654 if(StackProtectorLevel) {
3655CmdArgs.push_back(
"-stack-protector-buffer-size");
3657CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
3663 conststd::string &TripleStr = EffectiveTriple.getTriple();
3664 if(Arg *A = Args.getLastArg(options::OPT_mstack_protector_guard_EQ)) {
3665StringRef
Value= A->getValue();
3666 if(!EffectiveTriple.isX86() && !EffectiveTriple.isAArch64() &&
3667!EffectiveTriple.isARM() && !EffectiveTriple.isThumb() &&
3668!EffectiveTriple.isRISCV() && !EffectiveTriple.isPPC())
3669 D.Diag(diag::err_drv_unsupported_opt_for_target)
3670<< A->getAsString(Args) << TripleStr;
3671 if((EffectiveTriple.isX86() || EffectiveTriple.isARM() ||
3672EffectiveTriple.isThumb()) &&
3674 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3675<< A->getOption().getName() <<
Value<<
"tls global";
3678 if((EffectiveTriple.isARM() || EffectiveTriple.isThumb()) &&
3680 if(!Args.hasArg(options::OPT_mstack_protector_guard_offset_EQ)) {
3681 D.Diag(diag::err_drv_ssp_missing_offset_argument)
3682<< A->getAsString(Args);
3687 D.Diag(diag::err_target_unsupported_tp_hard)
3688<< EffectiveTriple.getArchName();
3692 if(Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) {
3693StringRef
Value= A->getValue();
3694 if(
Value!=
"cp15") {
3695 D.Diag(diag::err_drv_argument_not_allowed_with)
3696<< A->getAsString(Args) <<
"-mstack-protector-guard=tls";
3700CmdArgs.push_back(
"-target-feature");
3701CmdArgs.push_back(
"+read-tp-tpidruro");
3703 if(EffectiveTriple.isAArch64() &&
Value!=
"sysreg"&&
Value!=
"global") {
3704 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3705<< A->getOption().getName() <<
Value<<
"sysreg global";
3708 if(EffectiveTriple.isRISCV() || EffectiveTriple.isPPC()) {
3710 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3711<< A->getOption().getName() <<
Value<<
"tls global";
3714 if(
Value==
"tls") {
3715 if(!Args.hasArg(options::OPT_mstack_protector_guard_offset_EQ)) {
3716 D.Diag(diag::err_drv_ssp_missing_offset_argument)
3717<< A->getAsString(Args);
3722A->render(Args, CmdArgs);
3725 if(Arg *A = Args.getLastArg(options::OPT_mstack_protector_guard_offset_EQ)) {
3726StringRef
Value= A->getValue();
3727 if(!EffectiveTriple.isX86() && !EffectiveTriple.isAArch64() &&
3728!EffectiveTriple.isARM() && !EffectiveTriple.isThumb() &&
3729!EffectiveTriple.isRISCV() && !EffectiveTriple.isPPC())
3730 D.Diag(diag::err_drv_unsupported_opt_for_target)
3731<< A->getAsString(Args) << TripleStr;
3733 if(
Value.getAsInteger(10, Offset)) {
3734 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() <<
Value;
3737 if((EffectiveTriple.isARM() || EffectiveTriple.isThumb()) &&
3738(Offset < 0 || Offset > 0xfffff)) {
3739 D.Diag(diag::err_drv_invalid_int_value)
3740<< A->getOption().getName() <<
Value;
3743A->render(Args, CmdArgs);
3746 if(Arg *A = Args.getLastArg(options::OPT_mstack_protector_guard_reg_EQ)) {
3747StringRef
Value= A->getValue();
3748 if(!EffectiveTriple.isX86() && !EffectiveTriple.isAArch64() &&
3749!EffectiveTriple.isRISCV() && !EffectiveTriple.isPPC())
3750 D.Diag(diag::err_drv_unsupported_opt_for_target)
3751<< A->getAsString(Args) << TripleStr;
3752 if(EffectiveTriple.isX86() && (
Value!=
"fs"&&
Value!=
"gs")) {
3753 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3754<< A->getOption().getName() <<
Value<<
"fs gs";
3757 if(EffectiveTriple.isAArch64() &&
Value!=
"sp_el0") {
3758 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() <<
Value;
3761 if(EffectiveTriple.isRISCV() &&
Value!=
"tp") {
3762 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3763<< A->getOption().getName() <<
Value<<
"tp";
3766 if(EffectiveTriple.isPPC64() &&
Value!=
"r13") {
3767 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3768<< A->getOption().getName() <<
Value<<
"r13";
3771 if(EffectiveTriple.isPPC32() &&
Value!=
"r2") {
3772 D.Diag(diag::err_drv_invalid_value_with_suggestion)
3773<< A->getOption().getName() <<
Value<<
"r2";
3776A->render(Args, CmdArgs);
3779 if(Arg *A = Args.getLastArg(options::OPT_mstack_protector_guard_symbol_EQ)) {
3780StringRef
Value= A->getValue();
3782 D.Diag(diag::err_drv_argument_only_allowed_with)
3783<< A->getOption().getName() <<
"legal symbol name";
3786A->render(Args, CmdArgs);
3791ArgStringList &CmdArgs) {
3794 if(!EffectiveTriple.isOSFreeBSD() && !EffectiveTriple.isOSLinux() &&
3795!EffectiveTriple.isOSFuchsia())
3798 if(!EffectiveTriple.isX86() && !EffectiveTriple.isSystemZ() &&
3799!EffectiveTriple.isPPC64() && !EffectiveTriple.isAArch64() &&
3800!EffectiveTriple.isRISCV())
3803Args.addOptInFlag(CmdArgs, options::OPT_fstack_clash_protection,
3804options::OPT_fno_stack_clash_protection);
3809 constArgList &Args,
3810ArgStringList &CmdArgs) {
3812StringRef TrivialAutoVarInit =
"";
3814 for(
constArg *A : Args) {
3815 switch(A->getOption().getID()) {
3818 caseoptions::OPT_ftrivial_auto_var_init: {
3820StringRef Val = A->getValue();
3821 if(Val ==
"uninitialized"|| Val ==
"zero"|| Val ==
"pattern")
3822TrivialAutoVarInit = Val;
3824 D.Diag(diag::err_drv_unsupported_option_argument)
3825<< A->getSpelling() << Val;
3831 if(TrivialAutoVarInit.empty())
3832 switch(DefaultTrivialAutoVarInit) {
3836TrivialAutoVarInit =
"pattern";
3839TrivialAutoVarInit =
"zero";
3843 if(!TrivialAutoVarInit.empty()) {
3845Args.MakeArgString(
"-ftrivial-auto-var-init="+ TrivialAutoVarInit));
3849Args.getLastArg(options::OPT_ftrivial_auto_var_init_stop_after)) {
3850 if(!Args.hasArg(options::OPT_ftrivial_auto_var_init) ||
3852Args.getLastArg(options::OPT_ftrivial_auto_var_init)->getValue()) ==
3854 D.Diag(diag::err_drv_trivial_auto_var_init_stop_after_missing_dependency);
3856StringRef Val = A->getValue();
3857 if(std::stoi(Val.str()) <= 0)
3858 D.Diag(diag::err_drv_trivial_auto_var_init_stop_after_invalid_value);
3860Args.MakeArgString(
"-ftrivial-auto-var-init-stop-after="+ Val));
3863 if(Arg *A = Args.getLastArg(options::OPT_ftrivial_auto_var_init_max_size)) {
3864 if(!Args.hasArg(options::OPT_ftrivial_auto_var_init) ||
3866Args.getLastArg(options::OPT_ftrivial_auto_var_init)->getValue()) ==
3868 D.Diag(diag::err_drv_trivial_auto_var_init_max_size_missing_dependency);
3870StringRef Val = A->getValue();
3871 if(std::stoi(Val.str()) <= 0)
3872 D.Diag(diag::err_drv_trivial_auto_var_init_max_size_invalid_value);
3874Args.MakeArgString(
"-ftrivial-auto-var-init-max-size="+ Val));
3882 const unsignedForwardedArguments[] = {
3883options::OPT_cl_opt_disable,
3884options::OPT_cl_strict_aliasing,
3885options::OPT_cl_single_precision_constant,
3886options::OPT_cl_finite_math_only,
3887options::OPT_cl_kernel_arg_info,
3888options::OPT_cl_unsafe_math_optimizations,
3889options::OPT_cl_fast_relaxed_math,
3890options::OPT_cl_mad_enable,
3891options::OPT_cl_no_signed_zeros,
3892options::OPT_cl_fp32_correctly_rounded_divide_sqrt,
3893options::OPT_cl_uniform_work_group_size
3896 if(Arg *A = Args.getLastArg(options::OPT_cl_std_EQ)) {
3897std::string CLStdStr = std::string(
"-cl-std=") + A->getValue();
3898CmdArgs.push_back(Args.MakeArgString(CLStdStr));
3899}
else if(Arg *A = Args.getLastArg(options::OPT_cl_ext_EQ)) {
3900std::string CLExtStr = std::string(
"-cl-ext=") + A->getValue();
3901CmdArgs.push_back(Args.MakeArgString(CLExtStr));
3904 if(Args.hasArg(options::OPT_cl_finite_math_only)) {
3905CmdArgs.push_back(
"-menable-no-infs");
3906CmdArgs.push_back(
"-menable-no-nans");
3909 for(
const auto&Arg : ForwardedArguments)
3910 if(
const auto*A = Args.getLastArg(Arg))
3911CmdArgs.push_back(Args.MakeArgString(A->getOption().getPrefixedName()));
3916!Args.hasArg(options::OPT_cl_no_stdinc)) {
3917CmdArgs.push_back(
"-finclude-default-header");
3918CmdArgs.push_back(
"-fdeclare-opencl-builtins");
3924 const unsignedForwardedArguments[] = {options::OPT_dxil_validator_version,
3928options::OPT_emit_llvm,
3929options::OPT_emit_obj,
3930options::OPT_disable_llvm_passes,
3931options::OPT_fnative_half_type,
3932options::OPT_hlsl_entrypoint};
3935 for(
const auto&Arg : ForwardedArguments)
3936 if(
const auto*A = Args.getLastArg(Arg))
3937A->renderAsInput(Args, CmdArgs);
3939 if(!Args.hasArg(options::OPT_dxc_no_stdinc) &&
3940!Args.hasArg(options::OPT_nostdinc))
3941CmdArgs.push_back(
"-finclude-default-header");
3945ArgStringList &CmdArgs,
types::IDInputType) {
3946 if(!Args.hasArg(options::OPT_fopenacc))
3949CmdArgs.push_back(
"-fopenacc");
3951 if(Arg *A = Args.getLastArg(options::OPT_openacc_macro_override)) {
3952StringRef
Value= A->getValue();
3954 if(!
Value.getAsInteger(10, Version))
3955A->renderAsInput(Args, CmdArgs);
3957 D.Diag(diag::err_drv_clang_unsupported) <<
Value;
3962 constArgList &Args, ArgStringList &CmdArgs) {
3965Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
3966!Args.hasArg(options::OPT_mkernel));
3968CmdArgs.push_back(
"-fno-builtin");
3971 if(Args.hasArg(options::OPT_ffreestanding))
3972UseBuiltins =
false;
3975 for(
constArg *A : Args.filtered(options::OPT_fno_builtin_)) {
3981A->render(Args, CmdArgs);
3986 if(
const char*Str = std::getenv(
"CLANG_MODULE_CACHE_PATH")) {
3989 return Path.getSingleStringRef() !=
"";
3991 if(llvm::sys::path::cache_directory(
Result)) {
3992llvm::sys::path::append(
Result,
"clang");
3993llvm::sys::path::append(
Result,
"ModuleCache");
4001 const char*BaseInput) {
4002 if(Arg *ModuleOutputEQ = Args.getLastArg(options::OPT_fmodule_output_EQ))
4003 returnStringRef(ModuleOutputEQ->getValue());
4006 if(Arg *FinalOutput = Args.getLastArg(options::OPT_o);
4007FinalOutput && Args.hasArg(options::OPT_c))
4008OutputPath = FinalOutput->getValue();
4010OutputPath = BaseInput;
4013llvm::sys::path::replace_extension(OutputPath, Extension);
4018 constArgList &Args,
const InputInfo&Input,
4019 const InputInfo&Output,
boolHaveStd20,
4020ArgStringList &CmdArgs) {
4022 boolHaveStdCXXModules = IsCXX && HaveStd20;
4023 boolHaveModules = HaveStdCXXModules;
4028 boolHaveClangModules =
false;
4029 if(Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules,
false)) {
4030 boolAllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4031options::OPT_fno_cxx_modules,
true);
4032 if(AllowedInCXX || !IsCXX) {
4033CmdArgs.push_back(
"-fmodules");
4034HaveClangModules =
true;
4038HaveModules |= HaveClangModules;
4042 if(Args.hasFlag(options::OPT_fimplicit_module_maps,
4043options::OPT_fno_implicit_module_maps, HaveClangModules))
4044CmdArgs.push_back(
"-fimplicit-module-maps");
4047Args.addOptInFlag(CmdArgs, options::OPT_fmodules_decluse,
4048options::OPT_fno_modules_decluse);
4052 if(Args.hasFlag(options::OPT_fmodules_strict_decluse,
4053options::OPT_fno_modules_strict_decluse,
false))
4054CmdArgs.push_back(
"-fmodules-strict-decluse");
4056Args.addOptOutFlag(CmdArgs, options::OPT_fmodulemap_allow_subdirectory_search,
4057options::OPT_fno_modulemap_allow_subdirectory_search);
4060 boolImplicitModules =
false;
4061 if(!Args.hasFlag(options::OPT_fimplicit_modules,
4062options::OPT_fno_implicit_modules, HaveClangModules)) {
4064CmdArgs.push_back(
"-fno-implicit-modules");
4065}
else if(HaveModules) {
4066ImplicitModules =
true;
4070 if(Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4071 Path= A->getValue();
4073 boolHasPath =
true;
4074 if(
C.isForDiagnostics()) {
4078llvm::sys::path::replace_extension(
Path,
".cache");
4079llvm::sys::path::append(
Path,
"modules");
4080}
else if(
Path.empty()) {
4088 const charArg[] =
"-fmodules-cache-path=";
4089 Path.insert(
Path.begin(), Arg, Arg + strlen(Arg));
4090CmdArgs.push_back(Args.MakeArgString(
Path));
4095 if(Args.hasFlag(options::OPT_fprebuilt_implicit_modules,
4096options::OPT_fno_prebuilt_implicit_modules,
false))
4097CmdArgs.push_back(
"-fprebuilt-implicit-modules");
4098 if(Args.hasFlag(options::OPT_fmodules_validate_input_files_content,
4099options::OPT_fno_modules_validate_input_files_content,
4101CmdArgs.push_back(
"-fvalidate-ast-input-files-content");
4106Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
4110Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
4114 if(Args.hasArg(options::OPT_fbuiltin_module_map)) {
4116llvm::sys::path::append(BuiltinModuleMap,
"include");
4117llvm::sys::path::append(BuiltinModuleMap,
"module.modulemap");
4118 if(llvm::sys::fs::exists(BuiltinModuleMap))
4120Args.MakeArgString(
"-fmodule-map-file="+ BuiltinModuleMap));
4127 if(HaveModules || Input.
getType() == clang::driver::types::TY_ModuleFile) {
4128Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4131 for(
constArg *A : Args.filtered(options::OPT_fprebuilt_module_path)) {
4132CmdArgs.push_back(Args.MakeArgString(
4133std::string(
"-fprebuilt-module-path=") + A->getValue()));
4137Args.ClaimAllArgs(options::OPT_fmodule_file);
4141 if(HaveClangModules &&
C.isForDiagnostics()) {
4143llvm::sys::path::replace_extension(VFSDir,
".cache");
4145 C.addTempFile(Args.MakeArgString(VFSDir));
4147llvm::sys::path::append(VFSDir,
"vfs");
4148CmdArgs.push_back(
"-module-dependency-dir");
4149CmdArgs.push_back(Args.MakeArgString(VFSDir));
4152 if(HaveClangModules)
4153Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
4156Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
4157Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4158Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
4160 if(HaveClangModules) {
4161Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4163 if(Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4164 if(Args.hasArg(options::OPT_fbuild_session_timestamp))
4165 D.Diag(diag::err_drv_argument_not_allowed_with)
4166<< A->getAsString(Args) <<
"-fbuild-session-timestamp";
4168llvm::sys::fs::file_status Status;
4169 if(llvm::sys::fs::status(A->getValue(), Status))
4170 D.Diag(diag::err_drv_no_such_file) << A->getValue();
4171CmdArgs.push_back(Args.MakeArgString(
4172 "-fbuild-session-timestamp="+
4173Twine((uint64_t)std::chrono::duration_cast<std::chrono::seconds>(
4174Status.getLastModificationTime().time_since_epoch())
4178 if(Args.getLastArg(
4179options::OPT_fmodules_validate_once_per_build_session)) {
4180 if(!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4181options::OPT_fbuild_session_file))
4182 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4184Args.AddLastArg(CmdArgs,
4185options::OPT_fmodules_validate_once_per_build_session);
4188 if(Args.hasFlag(options::OPT_fmodules_validate_system_headers,
4189options::OPT_fno_modules_validate_system_headers,
4191CmdArgs.push_back(
"-fmodules-validate-system-headers");
4193Args.AddLastArg(CmdArgs,
4194options::OPT_fmodules_disable_diagnostic_validation);
4196Args.ClaimAllArgs(options::OPT_fbuild_session_timestamp);
4197Args.ClaimAllArgs(options::OPT_fbuild_session_file);
4198Args.ClaimAllArgs(options::OPT_fmodules_validate_once_per_build_session);
4199Args.ClaimAllArgs(options::OPT_fmodules_validate_system_headers);
4200Args.ClaimAllArgs(options::OPT_fno_modules_validate_system_headers);
4201Args.ClaimAllArgs(options::OPT_fmodules_disable_diagnostic_validation);
4206CmdArgs.push_back(
"-fskip-odr-check-in-gmf");
4208 if(Args.hasArg(options::OPT_modules_reduced_bmi) &&
4209(Input.
getType() == driver::types::TY_CXXModule ||
4210Input.
getType() == driver::types::TY_PP_CXXModule)) {
4211CmdArgs.push_back(
"-fmodules-reduced-bmi");
4213 if(Args.hasArg(options::OPT_fmodule_output_EQ))
4214Args.AddLastArg(CmdArgs, options::OPT_fmodule_output_EQ);
4216CmdArgs.push_back(Args.MakeArgString(
4217 "-fmodule-output="+
4224Args.ClaimAllArgs(options::OPT_modules_reduced_bmi);
4232 if(Input.
getType() == driver::types::TY_CXXModule ||
4233Input.
getType() == driver::types::TY_PP_CXXModule ||
4234Input.
getType() == driver::types::TY_ModuleFile) {
4235Args.ClaimAllArgs(options::OPT_fmodule_output);
4236Args.ClaimAllArgs(options::OPT_fmodule_output_EQ);
4239 if(Args.hasArg(options::OPT_fmodules_embed_all_files))
4240CmdArgs.push_back(
"-fmodules-embed-all-files");
4246ArgStringList &CmdArgs) {
4248 if(
constArg *A = Args.getLastArg(options::OPT_fsigned_char,
4249options::OPT_fno_signed_char,
4250options::OPT_funsigned_char,
4251options::OPT_fno_unsigned_char)) {
4252 if(A->getOption().matches(options::OPT_funsigned_char) ||
4253A->getOption().matches(options::OPT_fno_signed_char)) {
4254CmdArgs.push_back(
"-fno-signed-char");
4257CmdArgs.push_back(
"-fno-signed-char");
4261Args.AddLastArg(CmdArgs, options::OPT_fchar8__t, options::OPT_fno_char8__t);
4263 if(
constArg *A = Args.getLastArg(options::OPT_fshort_wchar,
4264options::OPT_fno_short_wchar)) {
4265 if(A->getOption().matches(options::OPT_fshort_wchar)) {
4266CmdArgs.push_back(
"-fwchar-type=short");
4267CmdArgs.push_back(
"-fno-signed-wchar");
4269 boolIsARM =
T.isARM() ||
T.isThumb() ||
T.isAArch64();
4270CmdArgs.push_back(
"-fwchar-type=int");
4271 if(
T.isOSzOS() ||
4272(IsARM && !(
T.isOSWindows() ||
T.isOSNetBSD() ||
T.isOSOpenBSD())))
4273CmdArgs.push_back(
"-fno-signed-wchar");
4275CmdArgs.push_back(
"-fsigned-wchar");
4277}
else if(
T.isOSzOS())
4278CmdArgs.push_back(
"-fno-signed-wchar");
4282 constllvm::Triple &
T,
constArgList &Args,
4284 const InputInfo&Input, ArgStringList &CmdArgs) {
4285 constllvm::Triple::ArchType Arch = TC.
getArch();
4291 if(!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4292options::OPT_fno_objc_legacy_dispatch,
4295CmdArgs.push_back(
"-fobjc-dispatch-method=mixed");
4297CmdArgs.push_back(
"-fobjc-dispatch-method=non-legacy");
4303 if(Arch == llvm::Triple::x86 &&
T.isMacOSX() &&
4305CmdArgs.push_back(
"-fobjc-subscripting-legacy-runtime");
4312CmdArgs.push_back(
"-fobjc-arc");
4319CmdArgs.push_back(
"-fobjc-arc-cxxlib=libc++");
4321CmdArgs.push_back(
"-fobjc-arc-cxxlib=libstdc++");
4326 if(Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4327options::OPT_fno_objc_arc_exceptions,
4329CmdArgs.push_back(
"-fobjc-arc-exceptions");
4334 if(Args.hasArg(options::OPT_fno_objc_arc)) {
4335Args.ClaimAllArgs(options::OPT_fobjc_arc_exceptions);
4336Args.ClaimAllArgs(options::OPT_fno_objc_arc_exceptions);
4342 auto*Arg = Args.getLastArg(
4343options::OPT_fobjc_convert_messages_to_runtime_calls,
4344options::OPT_fno_objc_convert_messages_to_runtime_calls);
4346Arg->getOption().matches(
4347options::OPT_fno_objc_convert_messages_to_runtime_calls))
4348CmdArgs.push_back(
"-fno-objc-convert-messages-to-runtime-calls");
4353 if(InferCovariantReturns)
4354CmdArgs.push_back(
"-fno-objc-infer-related-result-type");
4359Args.getLastArg(options::OPT_fobjc_weak, options::OPT_fno_objc_weak);
4363 if(WeakArg->getOption().matches(options::OPT_fobjc_weak))
4364 D.Diag(diag::err_objc_weak_unsupported);
4366WeakArg->render(Args, CmdArgs);
4370 if(Args.hasArg(options::OPT_fobjc_disable_direct_methods_for_testing))
4371CmdArgs.push_back(
"-fobjc-disable-direct-methods-for-testing");
4375ArgStringList &CmdArgs) {
4376 boolCaretDefault =
true;
4377 boolColumnDefault =
true;
4379 if(
constArg *A = Args.getLastArg(options::OPT__SLASH_diagnostics_classic,
4380options::OPT__SLASH_diagnostics_column,
4381options::OPT__SLASH_diagnostics_caret)) {
4382 switch(A->getOption().getID()) {
4383 caseoptions::OPT__SLASH_diagnostics_caret:
4384CaretDefault =
true;
4385ColumnDefault =
true;
4387 caseoptions::OPT__SLASH_diagnostics_column:
4388CaretDefault =
false;
4389ColumnDefault =
true;
4391 caseoptions::OPT__SLASH_diagnostics_classic:
4392CaretDefault =
false;
4393ColumnDefault =
false;
4399 if(!Args.hasFlag(options::OPT_fcaret_diagnostics,
4400options::OPT_fno_caret_diagnostics, CaretDefault))
4401CmdArgs.push_back(
"-fno-caret-diagnostics");
4403Args.addOptOutFlag(CmdArgs, options::OPT_fdiagnostics_fixit_info,
4404options::OPT_fno_diagnostics_fixit_info);
4405Args.addOptOutFlag(CmdArgs, options::OPT_fdiagnostics_show_option,
4406options::OPT_fno_diagnostics_show_option);
4409Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4410CmdArgs.push_back(
"-fdiagnostics-show-category");
4411CmdArgs.push_back(A->getValue());
4414Args.addOptInFlag(CmdArgs, options::OPT_fdiagnostics_show_hotness,
4415options::OPT_fno_diagnostics_show_hotness);
4418Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
4420std::string(
"-fdiagnostics-hotness-threshold=") + A->getValue();
4421CmdArgs.push_back(Args.MakeArgString(Opt));
4425Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {
4427std::string(
"-fdiagnostics-misexpect-tolerance=") + A->getValue();
4428CmdArgs.push_back(Args.MakeArgString(Opt));
4431 if(
constArg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4432CmdArgs.push_back(
"-fdiagnostics-format");
4433CmdArgs.push_back(A->getValue());
4434 if(StringRef(A->getValue()) ==
"sarif"||
4435StringRef(A->getValue()) ==
"SARIF")
4436 D.Diag(diag::warn_drv_sarif_format_unstable);
4439 if(
constArg *A = Args.getLastArg(
4440options::OPT_fdiagnostics_show_note_include_stack,
4441options::OPT_fno_diagnostics_show_note_include_stack)) {
4442 constOption &O = A->getOption();
4443 if(O.matches(options::OPT_fdiagnostics_show_note_include_stack))
4444CmdArgs.push_back(
"-fdiagnostics-show-note-include-stack");
4446CmdArgs.push_back(
"-fno-diagnostics-show-note-include-stack");
4451 if(Args.hasArg(options::OPT_fansi_escape_codes))
4452CmdArgs.push_back(
"-fansi-escape-codes");
4454Args.addOptOutFlag(CmdArgs, options::OPT_fshow_source_location,
4455options::OPT_fno_show_source_location);
4457Args.addOptOutFlag(CmdArgs, options::OPT_fdiagnostics_show_line_numbers,
4458options::OPT_fno_diagnostics_show_line_numbers);
4460 if(Args.hasArg(options::OPT_fdiagnostics_absolute_paths))
4461CmdArgs.push_back(
"-fdiagnostics-absolute-paths");
4463 if(!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
4465CmdArgs.push_back(
"-fno-show-column");
4467Args.addOptOutFlag(CmdArgs, options::OPT_fspell_checking,
4468options::OPT_fno_spell_checking);
4470Args.addLastArg(CmdArgs, options::OPT_warning_suppression_mappings_EQ);
4474 constArgList &Args, Arg *&Arg) {
4475Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
4476options::OPT_gno_split_dwarf);
4477 if(!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
4480 if(Arg->getOption().matches(options::OPT_gsplit_dwarf))
4483StringRef
Value= Arg->getValue();
4484 if(
Value==
"split")
4486 if(
Value==
"single")
4489 D.Diag(diag::err_drv_unsupported_option_argument)
4490<< Arg->getSpelling() << Arg->getValue();
4495 constArgList &Args, ArgStringList &CmdArgs,
4496 unsignedDwarfVersion) {
4497 auto*DwarfFormatArg =
4498Args.getLastArg(options::OPT_gdwarf64, options::OPT_gdwarf32);
4499 if(!DwarfFormatArg)
4502 if(DwarfFormatArg->getOption().matches(options::OPT_gdwarf64)) {
4503 if(DwarfVersion < 3)
4504 D.Diag(diag::err_drv_argument_only_allowed_with)
4505<< DwarfFormatArg->getAsString(Args) <<
"DWARFv3 or greater";
4506 else if(!
T.isArch64Bit())
4507 D.Diag(diag::err_drv_argument_only_allowed_with)
4508<< DwarfFormatArg->getAsString(Args) <<
"64 bit architecture";
4509 else if(!
T.isOSBinFormatELF())
4510 D.Diag(diag::err_drv_argument_only_allowed_with)
4511<< DwarfFormatArg->getAsString(Args) <<
"ELF platforms";
4514DwarfFormatArg->render(Args, CmdArgs);
4519 constArgList &Args,
boolIRInput, ArgStringList &CmdArgs,
4521llvm::codegenoptions::DebugInfoKind &DebugInfoKind,
4523 if(Args.hasFlag(options::OPT_fdebug_info_for_profiling,
4524options::OPT_fno_debug_info_for_profiling,
false) &&
4526Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args,
D, TC))
4527CmdArgs.push_back(
"-fdebug-info-for-profiling");
4540 boolSplitDWARFInlining =
4541Args.hasFlag(options::OPT_fsplit_dwarf_inlining,
4542options::OPT_fno_split_dwarf_inlining,
false);
4547 if(IRInput || Args.hasArg(options::OPT_g_Group)) {
4553SplitDWARFInlining =
false;
4556 if(
constArg *A = Args.getLastArg(options::OPT_g_Group)) {
4557DebugInfoKind = llvm::codegenoptions::DebugInfoConstructor;
4561A->getOption().matches(options::OPT_gN_Group)) {
4567 if(DebugInfoKind == llvm::codegenoptions::NoDebugInfo ||
4568DebugInfoKind == llvm::codegenoptions::DebugDirectivesOnly ||
4569(DebugInfoKind == llvm::codegenoptions::DebugLineTablesOnly &&
4570SplitDWARFInlining))
4576 boolHasDebuggerTuning =
false;
4578Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
4579HasDebuggerTuning =
true;
4581 if(A->getOption().matches(options::OPT_glldb))
4582DebuggerTuning = llvm::DebuggerKind::LLDB;
4583 else if(A->getOption().matches(options::OPT_gsce))
4584DebuggerTuning = llvm::DebuggerKind::SCE;
4585 else if(A->getOption().matches(options::OPT_gdbx))
4586DebuggerTuning = llvm::DebuggerKind::DBX;
4588DebuggerTuning = llvm::DebuggerKind::GDB;
4593 boolEmitDwarf =
false;
4597 boolEmitCodeView =
false;
4598 if(
constArg *A = Args.getLastArg(options::OPT_gcodeview))
4603 if(!EmitCodeView && !EmitDwarf &&
4604DebugInfoKind != llvm::codegenoptions::NoDebugInfo) {
4606 casellvm::codegenoptions::DIF_CodeView:
4607EmitCodeView =
true;
4609 casellvm::codegenoptions::DIF_DWARF:
4615 unsignedRequestedDWARFVersion = 0;
4616 unsignedEffectiveDWARFVersion = 0;
4621EffectiveDWARFVersion =
4624Args.ClaimAllArgs(options::OPT_fdebug_default_version);
4628 if(RequestedDWARFVersion == 0 &&
4629DebugInfoKind == llvm::codegenoptions::DebugDirectivesOnly)
4630DebugInfoKind = llvm::codegenoptions::NoDebugInfo;
4634 if(
constArg *A = Args.getLastArg(options::OPT_gstrict_dwarf))
4636 if(Args.hasFlag(options::OPT_gstrict_dwarf, options::OPT_gno_strict_dwarf,
4637DebuggerTuning == llvm::DebuggerKind::DBX))
4638CmdArgs.push_back(
"-gstrict-dwarf");
4641Args.ClaimAllArgs(options::OPT_g_flags_Group);
4649 if(
constArg *A = Args.getLastArg(options::OPT_gcolumn_info))
4651 if(!Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
4653(DebuggerTuning != llvm::DebuggerKind::SCE &&
4654DebuggerTuning != llvm::DebuggerKind::DBX)))
4655CmdArgs.push_back(
"-gno-column-info");
4658 if(Args.hasFlag(options::OPT_gmodules, options::OPT_gno_modules,
false)) {
4663 if(DebugInfoKind != llvm::codegenoptions::DebugLineTablesOnly &&
4664DebugInfoKind != llvm::codegenoptions::DebugDirectivesOnly) {
4665DebugInfoKind = llvm::codegenoptions::DebugInfoConstructor;
4666CmdArgs.push_back(
"-dwarf-ext-refs");
4667CmdArgs.push_back(
"-fmodule-format=obj");
4672 if(
T.isOSBinFormatELF() && SplitDWARFInlining)
4673CmdArgs.push_back(
"-fsplit-dwarf-inlining");
4680 boolNeedFullDebug = Args.hasFlag(
4681options::OPT_fstandalone_debug, options::OPT_fno_standalone_debug,
4682DebuggerTuning == llvm::DebuggerKind::LLDB ||
4684 if(
constArg *A = Args.getLastArg(options::OPT_fstandalone_debug))
4687 if(DebugInfoKind == llvm::codegenoptions::LimitedDebugInfo ||
4688DebugInfoKind == llvm::codegenoptions::DebugInfoConstructor) {
4689 if(Args.hasFlag(options::OPT_fno_eliminate_unused_debug_types,
4690options::OPT_feliminate_unused_debug_types,
false))
4691DebugInfoKind = llvm::codegenoptions::UnusedTypeInfo;
4692 else if(NeedFullDebug)
4693DebugInfoKind = llvm::codegenoptions::FullDebugInfo;
4696 if(Args.hasFlag(options::OPT_gembed_source, options::OPT_gno_embed_source,
4702 constArg *A = Args.getLastArg(options::OPT_gembed_source);
4703 if(RequestedDWARFVersion < 5)
4704 D.Diag(diag::err_drv_argument_only_allowed_with)
4705<< A->getAsString(Args) <<
"-gdwarf-5";
4706 else if(EffectiveDWARFVersion < 5)
4709 D.Diag(diag::warn_drv_dwarf_version_limited_by_target)
4711<< EffectiveDWARFVersion;
4713CmdArgs.push_back(
"-gembed-source");
4717CmdArgs.push_back(
"-gcodeview");
4719Args.addOptInFlag(CmdArgs, options::OPT_gcodeview_ghash,
4720options::OPT_gno_codeview_ghash);
4722Args.addOptOutFlag(CmdArgs, options::OPT_gcodeview_command_line,
4723options::OPT_gno_codeview_command_line);
4726Args.addOptOutFlag(CmdArgs, options::OPT_ginline_line_tables,
4727options::OPT_gno_inline_line_tables);
4731DebugInfoKind <= llvm::codegenoptions::DebugDirectivesOnly)
4732DebugInfoKind = llvm::codegenoptions::DebugLineTablesOnly;
4740 T.isOSAIX() && !HasDebuggerTuning
4741? llvm::DebuggerKind::Default
4745 if(Args.hasFlag(options::OPT_fdebug_macro, options::OPT_fno_debug_macro,
4749CmdArgs.push_back(
"-debug-info-macro");
4752 const auto*PubnamesArg =
4753Args.getLastArg(options::OPT_ggnu_pubnames, options::OPT_gno_gnu_pubnames,
4754options::OPT_gpubnames, options::OPT_gno_pubnames);
4757 const boolOptionSet =
4759(PubnamesArg->getOption().matches(options::OPT_gpubnames) ||
4760PubnamesArg->getOption().matches(options::OPT_ggnu_pubnames)));
4761 if((DebuggerTuning != llvm::DebuggerKind::LLDB || OptionSet) &&
4763(!PubnamesArg->getOption().matches(options::OPT_gno_gnu_pubnames) &&
4764!PubnamesArg->getOption().matches(options::OPT_gno_pubnames))))
4765CmdArgs.push_back(PubnamesArg && PubnamesArg->getOption().matches(
4766options::OPT_gpubnames)
4768:
"-ggnu-pubnames");
4770 const auto*SimpleTemplateNamesArg =
4771Args.getLastArg(options::OPT_gsimple_template_names,
4772options::OPT_gno_simple_template_names);
4773 boolForwardTemplateParams = DebuggerTuning == llvm::DebuggerKind::SCE;
4774 if(SimpleTemplateNamesArg &&
4776 const auto&Opt = SimpleTemplateNamesArg->getOption();
4777 if(Opt.matches(options::OPT_gsimple_template_names)) {
4778ForwardTemplateParams =
true;
4779CmdArgs.push_back(
"-gsimple-template-names=simple");
4784 boolUseDebugTemplateAlias =
4785DebuggerTuning == llvm::DebuggerKind::SCE && RequestedDWARFVersion >= 4;
4786 if(
const auto*DebugTemplateAlias = Args.getLastArg(
4787options::OPT_gtemplate_alias, options::OPT_gno_template_alias)) {
4791 const auto&Opt = DebugTemplateAlias->getOption();
4792UseDebugTemplateAlias = Opt.matches(options::OPT_gtemplate_alias);
4795 if(UseDebugTemplateAlias)
4796CmdArgs.push_back(
"-gtemplate-alias");
4798 if(
constArg *A = Args.getLastArg(options::OPT_gsrc_hash_EQ)) {
4799StringRef
v= A->getValue();
4800CmdArgs.push_back(Args.MakeArgString(
"-gsrc-hash="+
v));
4803Args.addOptInFlag(CmdArgs, options::OPT_fdebug_ranges_base_address,
4804options::OPT_fno_debug_ranges_base_address);
4808 if(
constArg *A = Args.getLastArg(options::OPT_gdwarf_aranges);
4810CmdArgs.push_back(
"-mllvm");
4811CmdArgs.push_back(
"-generate-arange-section");
4814Args.addOptInFlag(CmdArgs, options::OPT_fforce_dwarf_frame,
4815options::OPT_fno_force_dwarf_frame);
4817 boolEnableTypeUnits =
false;
4818 if(Args.hasFlag(options::OPT_fdebug_types_section,
4819options::OPT_fno_debug_types_section,
false)) {
4820 if(!(
T.isOSBinFormatELF() ||
T.isOSBinFormatWasm())) {
4821 D.Diag(diag::err_drv_unsupported_opt_for_target)
4822<< Args.getLastArg(options::OPT_fdebug_types_section)
4826Args.getLastArg(options::OPT_fdebug_types_section), Args,
D,
4828EnableTypeUnits =
true;
4829CmdArgs.push_back(
"-mllvm");
4830CmdArgs.push_back(
"-generate-type-units");
4835Args.getLastArg(options::OPT_gomit_unreferenced_methods,
4836options::OPT_gno_omit_unreferenced_methods))
4838 if(Args.hasFlag(options::OPT_gomit_unreferenced_methods,
4839options::OPT_gno_omit_unreferenced_methods,
false) &&
4840(DebugInfoKind == llvm::codegenoptions::DebugInfoConstructor ||
4841DebugInfoKind == llvm::codegenoptions::LimitedDebugInfo) &&
4843CmdArgs.push_back(
"-gomit-unreferenced-methods");
4849 if(!Args.hasFlag(options::OPT_fdwarf_directory_asm,
4850options::OPT_fno_dwarf_directory_asm,
4852CmdArgs.push_back(
"-fno-dwarf-directory-asm");
4856 if(ForwardTemplateParams)
4857CmdArgs.push_back(
"-debug-forward-template-params");
4861 if(DebuggerTuning == llvm::DebuggerKind::SCE)
4862CmdArgs.push_back(
"-dwarf-explicit-import");
4868 if(Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
4869 if(TC.
getTriple().isOSBinFormatELF() ||
4870TC.
getTriple().isWindowsMSVCEnvironment()) {
4871 if(DebugInfoKind >= llvm::codegenoptions::DebugInfoConstructor)
4872CmdArgs.push_back(
"-fjmc");
4873 else if(
D.IsCLMode())
4874 D.Diag(clang::diag::warn_drv_jmc_requires_debuginfo) <<
"/JMC" 4877 D.Diag(clang::diag::warn_drv_jmc_requires_debuginfo) <<
"-fjmc" 4880 D.Diag(clang::diag::warn_drv_fjmc_for_elf_only);
4885 const char*DebugCompilationDir =
4897ArgStringList &CmdArgs) {
4898 unsignedRTOptionID = options::OPT__SLASH_MT;
4900 if(Args.hasArg(options::OPT__SLASH_LDd))
4903RTOptionID = options::OPT__SLASH_MTd;
4905 if(Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
4906RTOptionID = A->getOption().getID();
4908 if(Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
4909RTOptionID = llvm::StringSwitch<unsigned>(A->getValue())
4910.Case(
"static", options::OPT__SLASH_MT)
4911.Case(
"static_dbg", options::OPT__SLASH_MTd)
4912.Case(
"dll", options::OPT__SLASH_MD)
4913.Case(
"dll_dbg", options::OPT__SLASH_MDd)
4914.Default(options::OPT__SLASH_MT);
4917StringRef FlagForCRT;
4918 switch(RTOptionID) {
4919 caseoptions::OPT__SLASH_MD:
4920 if(Args.hasArg(options::OPT__SLASH_LDd))
4921CmdArgs.push_back(
"-D_DEBUG");
4922CmdArgs.push_back(
"-D_MT");
4923CmdArgs.push_back(
"-D_DLL");
4924FlagForCRT =
"--dependent-lib=msvcrt";
4926 caseoptions::OPT__SLASH_MDd:
4927CmdArgs.push_back(
"-D_DEBUG");
4928CmdArgs.push_back(
"-D_MT");
4929CmdArgs.push_back(
"-D_DLL");
4930FlagForCRT =
"--dependent-lib=msvcrtd";
4932 caseoptions::OPT__SLASH_MT:
4933 if(Args.hasArg(options::OPT__SLASH_LDd))
4934CmdArgs.push_back(
"-D_DEBUG");
4935CmdArgs.push_back(
"-D_MT");
4936CmdArgs.push_back(
"-flto-visibility-public-std");
4937FlagForCRT =
"--dependent-lib=libcmt";
4939 caseoptions::OPT__SLASH_MTd:
4940CmdArgs.push_back(
"-D_DEBUG");
4941CmdArgs.push_back(
"-D_MT");
4942CmdArgs.push_back(
"-flto-visibility-public-std");
4943FlagForCRT =
"--dependent-lib=libcmtd";
4946llvm_unreachable(
"Unexpected option ID.");
4949 if(Args.hasArg(options::OPT_fms_omit_default_lib)) {
4950CmdArgs.push_back(
"-D_VC_NODEFAULTLIB");
4952CmdArgs.push_back(FlagForCRT.data());
4957CmdArgs.push_back(
"--dependent-lib=oldnames");
4963 if(TC.
getTriple().isWindowsArm64EC())
4964CmdArgs.push_back(
"--dependent-lib=softintrin");
4969 constArgList &Args,
const char*LinkingOutput)
const{
4971 constllvm::Triple &RawTriple = TC.
getTriple();
4973 conststd::string &TripleStr = Triple.getTriple();
4976Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
4978ArgStringList CmdArgs;
4980assert(Inputs.size() >= 1 &&
"Must have at least one input.");
4995 boolIsExtractAPI = isa<ExtractAPIJobAction>(JA);
4998 boolIsHostOffloadingAction =
5002Args.hasFlag(options::OPT_offload_new_driver,
5003options::OPT_no_offload_new_driver,
5007Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
false);
5009 autoLTOMode = IsDeviceOffloadAction ?
D.getOffloadLTOMode() :
D.getLTOMode();
5010 boolIsUsingLTO = LTOMode !=
LTOK_None;
5014 InputInfoExtractAPIPlaceholderInput(Inputs[0].getType(),
"extract-api",
5018IsExtractAPI ? ExtractAPIPlaceholderInput : Inputs[0];
5022 const InputInfo*CudaDeviceInput =
nullptr;
5023 const InputInfo*OpenMPDeviceInput =
nullptr;
5025 if(&I == &Input || I.
getType() == types::TY_Nothing) {
5027}
else if(IsExtractAPI) {
5028 autoExpectedInputType = ExtractAPIPlaceholderInput.
getType();
5029 if(I.getType() != ExpectedInputType) {
5030 D.Diag(diag::err_drv_extract_api_wrong_kind)
5034ExtractAPIInputs.push_back(I);
5035}
else if(IsHostOffloadingAction) {
5036HostOffloadingInputs.push_back(I);
5037}
else if((IsCuda || IsHIP) && !CudaDeviceInput) {
5038CudaDeviceInput = &I;
5039}
else if(IsOpenMPDevice && !OpenMPDeviceInput) {
5040OpenMPDeviceInput = &I;
5042llvm_unreachable(
"unexpectedly given multiple inputs");
5046 constllvm::Triple *AuxTriple =
5048 boolIsWindowsMSVC = RawTriple.isWindowsMSVCEnvironment();
5049 boolIsUEFI = RawTriple.isUEFI();
5050 boolIsIAMCU = RawTriple.isOSIAMCU();
5055 if(IsCuda || IsHIP || IsSYCL)
5056IsWindowsMSVC |= AuxTriple && AuxTriple->isWindowsMSVCEnvironment();
5060 D.Diag(diag::err_drv_clang_unsupported) <<
"C++ for IAMCU";
5065CmdArgs.push_back(
"-cc1");
5068CmdArgs.push_back(
"-triple");
5069CmdArgs.push_back(Args.MakeArgString(TripleStr));
5071 if(
constArg *MJ = Args.getLastArg(options::OPT_MJ)) {
5072DumpCompilationDatabase(
C, MJ->getValue(), TripleStr, Output, Input, Args);
5073Args.ClaimAllArgs(options::OPT_MJ);
5074}
else if(
constArg *GenCDBFragment =
5075Args.getLastArg(options::OPT_gen_cdb_fragment_path)) {
5076DumpCompilationDatabaseFragmentToDir(GenCDBFragment->getValue(),
C,
5077TripleStr, Output, Input, Args);
5078Args.ClaimAllArgs(options::OPT_gen_cdb_fragment_path);
5081 if(IsCuda || IsHIP) {
5084std::string NormalizedTriple;
5102assert(CTC &&
"Expected valid CUDA Toolchain.");
5104CmdArgs.push_back(Args.MakeArgString(
5105Twine(
"-target-sdk-version=") +
5113CmdArgs.push_back(
"-fcuda-allow-variadic-functions");
5116CmdArgs.push_back(
"-aux-triple");
5117CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
5122 getToolChain().getTriple().getVendor() == llvm::Triple::AMD))) {
5124 if(Args.getLastArg(options::OPT_mprintf_kind_EQ)) {
5125CmdArgs.push_back(Args.MakeArgString(
5127Args.getLastArgValue(options::OPT_mprintf_kind_EQ)));
5130Args.MakeArgString(
"-Werror=format-invalid-specifier"));
5136 if(
constArg *PF = Args.getLastArg(options::OPT_mprintf_kind_EQ))
5142llvm::Triple AuxT =
C.getDefaultToolChain().getTriple();
5143std::string NormalizedTriple = AuxT.normalize();
5144CmdArgs.push_back(
"-aux-triple");
5145CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
5148CmdArgs.push_back(
"-fsycl-is-device");
5151 if(!Args.getLastArg(options::OPT_O_Group))
5152CmdArgs.push_back(
"-O2");
5159CmdArgs.push_back(
"-fsycl-is-host");
5163Arg *SYCLStdArg = Args.getLastArg(options::OPT_sycl_std_EQ);
5165SYCLStdArg->render(Args, CmdArgs);
5168CmdArgs.push_back(
"-sycl-std=2020");
5172 if(Args.hasArg(options::OPT_fclangir))
5173CmdArgs.push_back(
"-fclangir");
5175 if(IsOpenMPDevice) {
5177std::string NormalizedTriple =
5181CmdArgs.push_back(
"-aux-triple");
5182CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
5185 if(Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
5186Triple.getArch() == llvm::Triple::thumb)) {
5187 unsignedOffset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5188 unsignedVersion = 0;
5190Triple.getArchName().substr(Offset).consumeInteger(10, Version);
5191 if(Failure || Version < 7)
5192 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
5202 if(Triple.isSPIR() || Triple.isSPIRV())
5203CmdArgs.push_back(
"-Wspir-compat");
5206RewriteKind rewriteKind = RK_None;
5208 boolUnifiedLTO =
false;
5210UnifiedLTO = Args.hasFlag(options::OPT_funified_lto,
5211options::OPT_fno_unified_lto, Triple.isPS());
5213CmdArgs.push_back(
"-funified-lto");
5223 if(!isa<AssembleJobAction>(JA)) {
5227Args.ClaimAllArgs(options::OPT_mrelax_all);
5228Args.ClaimAllArgs(options::OPT_mno_relax_all);
5229Args.ClaimAllArgs(options::OPT_mincremental_linker_compatible);
5230Args.ClaimAllArgs(options::OPT_mno_incremental_linker_compatible);
5231 switch(
C.getDefaultToolChain().getArch()) {
5232 casellvm::Triple::arm:
5233 casellvm::Triple::armeb:
5234 casellvm::Triple::thumb:
5235 casellvm::Triple::thumbeb:
5236Args.ClaimAllArgs(options::OPT_mimplicit_it_EQ);
5242Args.ClaimAllArgs(options::OPT_Wa_COMMA);
5243Args.ClaimAllArgs(options::OPT_Xassembler);
5244Args.ClaimAllArgs(options::OPT_femit_dwarf_unwind_EQ);
5247 if(isa<AnalyzeJobAction>(JA)) {
5248assert(JA.
getType() == types::TY_Plist &&
"Invalid output type.");
5249CmdArgs.push_back(
"-analyze");
5250}
else if(isa<PreprocessJobAction>(JA)) {
5251 if(Output.
getType() == types::TY_Dependencies)
5252CmdArgs.push_back(
"-Eonly");
5254CmdArgs.push_back(
"-E");
5255 if(Args.hasArg(options::OPT_rewrite_objc) &&
5256!Args.hasArg(options::OPT_g_Group))
5257CmdArgs.push_back(
"-P");
5258 else if(JA.
getType() == types::TY_PP_CXXHeaderUnit)
5259CmdArgs.push_back(
"-fdirectives-only");
5261}
else if(isa<AssembleJobAction>(JA)) {
5262CmdArgs.push_back(
"-emit-obj");
5267(void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
5268}
else if(isa<PrecompileJobAction>(JA)) {
5269 if(JA.
getType() == types::TY_Nothing)
5270CmdArgs.push_back(
"-fsyntax-only");
5271 else if(JA.
getType() == types::TY_ModuleFile)
5272CmdArgs.push_back(
"-emit-module-interface");
5273 else if(JA.
getType() == types::TY_HeaderUnit)
5274CmdArgs.push_back(
"-emit-header-unit");
5276CmdArgs.push_back(
"-emit-pch");
5277}
else if(isa<VerifyPCHJobAction>(JA)) {
5278CmdArgs.push_back(
"-verify-pch");
5279}
else if(isa<ExtractAPIJobAction>(JA)) {
5280assert(JA.
getType() == types::TY_API_INFO &&
5281 "Extract API actions must generate a API information.");
5282CmdArgs.push_back(
"-extract-api");
5284 if(Arg *PrettySGFArg = Args.getLastArg(options::OPT_emit_pretty_sgf))
5285PrettySGFArg->render(Args, CmdArgs);
5287Arg *SymbolGraphDirArg = Args.getLastArg(options::OPT_symbol_graph_dir_EQ);
5289 if(Arg *ProductNameArg = Args.getLastArg(options::OPT_product_name_EQ))
5290ProductNameArg->render(Args, CmdArgs);
5291 if(Arg *ExtractAPIIgnoresFileArg =
5292Args.getLastArg(options::OPT_extract_api_ignores_EQ))
5293ExtractAPIIgnoresFileArg->render(Args, CmdArgs);
5294 if(Arg *EmitExtensionSymbolGraphs =
5295Args.getLastArg(options::OPT_emit_extension_symbol_graphs)) {
5296 if(!SymbolGraphDirArg)
5297 D.Diag(diag::err_drv_missing_symbol_graph_dir);
5299EmitExtensionSymbolGraphs->render(Args, CmdArgs);
5301 if(SymbolGraphDirArg)
5302SymbolGraphDirArg->render(Args, CmdArgs);
5304assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
5305 "Invalid action for clang tool.");
5306 if(JA.
getType() == types::TY_Nothing) {
5307CmdArgs.push_back(
"-fsyntax-only");
5308}
else if(JA.
getType() == types::TY_LLVM_IR ||
5309JA.
getType() == types::TY_LTO_IR) {
5310CmdArgs.push_back(
"-emit-llvm");
5311}
else if(JA.
getType() == types::TY_LLVM_BC ||
5312JA.
getType() == types::TY_LTO_BC) {
5314 if(Triple.isAMDGCN() && IsOpenMPDevice && Args.hasArg(options::OPT_S) &&
5315Args.hasArg(options::OPT_emit_llvm)) {
5316CmdArgs.push_back(
"-emit-llvm");
5318CmdArgs.push_back(
"-emit-llvm-bc");
5320}
else if(JA.
getType() == types::TY_IFS ||
5321JA.
getType() == types::TY_IFS_CPP) {
5323Args.hasArg(options::OPT_interface_stub_version_EQ)
5324? Args.getLastArgValue(options::OPT_interface_stub_version_EQ)
5326CmdArgs.push_back(
"-emit-interface-stubs");
5328Args.MakeArgString(Twine(
"-interface-stub-version=") + ArgStr.str()));
5329}
else if(JA.
getType() == types::TY_PP_Asm) {
5330CmdArgs.push_back(
"-S");
5331}
else if(JA.
getType() == types::TY_AST) {
5332CmdArgs.push_back(
"-emit-pch");
5333}
else if(JA.
getType() == types::TY_ModuleFile) {
5334CmdArgs.push_back(
"-module-file-info");
5335}
else if(JA.
getType() == types::TY_RewrittenObjC) {
5336CmdArgs.push_back(
"-rewrite-objc");
5337rewriteKind = RK_NonFragile;
5338}
else if(JA.
getType() == types::TY_RewrittenLegacyObjC) {
5339CmdArgs.push_back(
"-rewrite-objc");
5340rewriteKind = RK_Fragile;
5341}
else if(JA.
getType() == types::TY_CIR) {
5342CmdArgs.push_back(
"-emit-cir");
5344assert(JA.
getType() == types::TY_PP_Asm &&
"Unexpected output type!");
5351 if(JA.
getType() == types::TY_LLVM_BC)
5352CmdArgs.push_back(
"-emit-llvm-uselists");
5356!Args.hasFlag(options::OPT_offload_new_driver,
5357options::OPT_no_offload_new_driver,
5359!Triple.isAMDGPU()) {
5360 D.Diag(diag::err_drv_unsupported_opt_for_target)
5361<< Args.getLastArg(options::OPT_foffload_lto,
5362options::OPT_foffload_lto_EQ)
5364<< Triple.getTriple();
5365}
else if(Triple.isNVPTX() && !IsRDCMode &&
5367 D.Diag(diag::err_drv_unsupported_opt_for_language_mode)
5368<< Args.getLastArg(options::OPT_foffload_lto,
5369options::OPT_foffload_lto_EQ)
5374CmdArgs.push_back(Args.MakeArgString(
5375Twine(
"-flto=") + (LTOMode ==
LTOK_Thin?
"thin":
"full")));
5378 if(!RawTriple.isPS4() ||
5379(
D.getLTOMode() ==
LTOK_Full) || !UnifiedLTO)
5380CmdArgs.push_back(
"-flto-unit");
5385Args.AddLastArg(CmdArgs, options::OPT_dumpdir);
5387 if(
constArg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
5389 D.Diag(diag::err_drv_arg_requires_bitcode_input) << A->getAsString(Args);
5390Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
5394Args.addOptInFlag(CmdArgs, options::OPT_mregnames,
5395options::OPT_mno_regnames);
5397 if(Args.getLastArg(options::OPT_fthin_link_bitcode_EQ))
5398Args.AddLastArg(CmdArgs, options::OPT_fthin_link_bitcode_EQ);
5400 if(Args.getLastArg(options::OPT_save_temps_EQ))
5401Args.AddLastArg(CmdArgs, options::OPT_save_temps_EQ);
5403 auto*MemProfArg = Args.getLastArg(options::OPT_fmemory_profile,
5404options::OPT_fmemory_profile_EQ,
5405options::OPT_fno_memory_profile);
5407!MemProfArg->getOption().matches(options::OPT_fno_memory_profile))
5408MemProfArg->render(Args, CmdArgs);
5410 if(
auto*MemProfUseArg =
5411Args.getLastArg(options::OPT_fmemory_profile_use_EQ)) {
5413 D.Diag(diag::err_drv_argument_not_allowed_with)
5414<< MemProfUseArg->getAsString(Args) << MemProfArg->getAsString(Args);
5415 if(
auto*PGOInstrArg = Args.getLastArg(options::OPT_fprofile_generate,
5416options::OPT_fprofile_generate_EQ))
5417 D.Diag(diag::err_drv_argument_not_allowed_with)
5418<< MemProfUseArg->getAsString(Args) << PGOInstrArg->getAsString(Args);
5419MemProfUseArg->render(Args, CmdArgs);
5424 if(
C.getDriver().embedBitcodeInObject() && !IsUsingLTO &&
5425(isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
5427Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
5429CmdArgs.push_back(
"-disable-llvm-passes");
5436 static const constexpr unsignedkBitcodeOptionIgnorelist[] = {
5437options::OPT_mkernel,
5438options::OPT_fapple_kext,
5439options::OPT_ffunction_sections,
5440options::OPT_fno_function_sections,
5441options::OPT_fdata_sections,
5442options::OPT_fno_data_sections,
5443options::OPT_fbasic_block_sections_EQ,
5444options::OPT_funique_internal_linkage_names,
5445options::OPT_fno_unique_internal_linkage_names,
5446options::OPT_funique_section_names,
5447options::OPT_fno_unique_section_names,
5448options::OPT_funique_basic_block_section_names,
5449options::OPT_fno_unique_basic_block_section_names,
5450options::OPT_mrestrict_it,
5451options::OPT_mno_restrict_it,
5452options::OPT_mstackrealign,
5453options::OPT_mno_stackrealign,
5454options::OPT_mstack_alignment,
5455options::OPT_mcmodel_EQ,
5456options::OPT_mlong_calls,
5457options::OPT_mno_long_calls,
5458options::OPT_ggnu_pubnames,
5459options::OPT_gdwarf_aranges,
5460options::OPT_fdebug_types_section,
5461options::OPT_fno_debug_types_section,
5462options::OPT_fdwarf_directory_asm,
5463options::OPT_fno_dwarf_directory_asm,
5464options::OPT_mrelax_all,
5465options::OPT_mno_relax_all,
5466options::OPT_ftrap_function_EQ,
5467options::OPT_ffixed_r9,
5468options::OPT_mfix_cortex_a53_835769,
5469options::OPT_mno_fix_cortex_a53_835769,
5470options::OPT_ffixed_x18,
5471options::OPT_mglobal_merge,
5472options::OPT_mno_global_merge,
5473options::OPT_mred_zone,
5474options::OPT_mno_red_zone,
5475options::OPT_Wa_COMMA,
5476options::OPT_Xassembler,
5479 for(
const auto&A : Args)
5480 if(llvm::is_contained(kBitcodeOptionIgnorelist, A->getOption().getID()))
5481 D.Diag(diag::err_drv_unsupported_embed_bitcode) << A->getSpelling();
5484Args.addOptOutFlag(CmdArgs, options::OPT_foptimize_sibling_calls,
5485options::OPT_fno_optimize_sibling_calls);
5493 casellvm::Triple::arm:
5494 casellvm::Triple::armeb:
5495 casellvm::Triple::thumbeb:
5496RenderARMABI(
D, Triple, Args, CmdArgs);
5498 casellvm::Triple::aarch64:
5499 casellvm::Triple::aarch64_32:
5500 casellvm::Triple::aarch64_be:
5501RenderAArch64ABI(Triple, Args, CmdArgs);
5506 if(
constArg *A = Args.getLastArg(options::OPT_O_Group)) {
5507 if(A->getOption().matches(options::OPT_O4)) {
5508CmdArgs.push_back(
"-O3");
5509 D.Diag(diag::warn_O4_is_O3);
5511A->render(Args, CmdArgs);
5516 if(Output.
getType() == types::TY_Dependencies) {
5519CmdArgs.push_back(
"-o");
5522assert(Output.
isNothing() &&
"Input output.");
5525 for(
const auto&II : Inputs) {
5527 if(II.isFilename())
5528CmdArgs.push_back(II.getFilename());
5530II.getInputArg().renderAsInput(Args, CmdArgs);
5533 C.addCommand(std::make_unique<Command>(
5535CmdArgs, Inputs, Output,
D.getPrependArg()));
5539 if(
C.getDriver().embedBitcodeMarkerOnly() && !IsUsingLTO)
5540CmdArgs.push_back(
"-fembed-bitcode=marker");
5545 if(!
C.isForDiagnostics())
5546CmdArgs.push_back(
"-disable-free");
5547CmdArgs.push_back(
"-clear-ast-before-backend");
5550 const boolIsAssertBuild =
false;
5552 const boolIsAssertBuild =
true;
5556 if(Args.hasFlag(options::OPT_fno_verify_intermediate_code,
5557options::OPT_fverify_intermediate_code, !IsAssertBuild)) {
5558CmdArgs.push_back(
"-disable-llvm-verifier");
5562 if(Args.hasFlag(options::OPT_fdiscard_value_names,
5563options::OPT_fno_discard_value_names, !IsAssertBuild)) {
5564 if(Args.hasArg(options::OPT_fdiscard_value_names) &&
5566return types::isLLVMIR(II.getType());
5568 D.Diag(diag::warn_ignoring_fdiscard_for_bitcode);
5570CmdArgs.push_back(
"-discard-value-names");
5575CmdArgs.push_back(
"-main-file-name");
5580 if(Args.hasArg(options::OPT_static))
5581CmdArgs.push_back(
"-static-define");
5583 if(Args.hasArg(options::OPT_municode))
5584CmdArgs.push_back(
"-DUNICODE");
5586 if(isa<AnalyzeJobAction>(JA))
5589 if(isa<AnalyzeJobAction>(JA) ||
5590(isa<PreprocessJobAction>(JA) && Args.hasArg(options::OPT__analyze)))
5591CmdArgs.push_back(
"-setup-static-analyzer");
5596 boolFoundAnalyzerConfig =
false;
5597 for(
auto*Arg : Args.filtered(options::OPT_Xclang))
5598 if(StringRef(Arg->getValue()) ==
"-analyzer-config") {
5599FoundAnalyzerConfig =
true;
5602 if(!FoundAnalyzerConfig)
5603 for(
auto*Arg : Args.filtered(options::OPT_Xanalyzer))
5604 if(StringRef(Arg->getValue()) ==
"-analyzer-config") {
5605FoundAnalyzerConfig =
true;
5608 if(FoundAnalyzerConfig)
5609CmdArgs.push_back(
"-analyzer-config-compatibility-mode=true");
5614assert(FunctionAlignment <= 31 &&
"function alignment will be truncated!");
5615 if(FunctionAlignment) {
5616CmdArgs.push_back(
"-function-alignment");
5617CmdArgs.push_back(Args.MakeArgString(std::to_string(FunctionAlignment)));
5622 if(
constArg *A = Args.getLastArg(options::OPT_falign_loops_EQ)) {
5624 if(StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value> 65536)
5626<< A->getAsString(Args) << A->getValue();
5628TC.
getDriver().
Diag(diag::err_drv_alignment_not_power_of_two)
5629<< A->getAsString(Args) << A->getValue();
5632CmdArgs.push_back(Args.MakeArgString(
"-falign-loops="+
5633Twine(std::min(
Value, 65536u))));
5636 if(Triple.isOSzOS()) {
5645 autofindMacroDefinition = [&](
conststd::string &Macro) {
5646 autoMacroDefs = Args.getAllArgValues(options::OPT_D);
5647 returnllvm::any_of(MacroDefs, [&](
conststd::string &M) {
5648 returnM == Macro || M.find(Macro +
'=') != std::string::npos;
5653 if(!findMacroDefinition(
"_UNIX03_WITHDRAWN"))
5654CmdArgs.push_back(
"-D_UNIX03_WITHDRAWN");
5656 if(!findMacroDefinition(
"_OPEN_DEFAULT"))
5657CmdArgs.push_back(
"-D_OPEN_DEFAULT");
5660 if(!findMacroDefinition(
"_XOPEN_SOURCE"))
5661CmdArgs.push_back(
"-D_XOPEN_SOURCE=600");
5665llvm::Reloc::Model RelocationModel;
5668std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(TC, Args);
5669Arg *LastPICDataRelArg =
5670Args.getLastArg(options::OPT_mno_pic_data_is_text_relative,
5671options::OPT_mpic_data_is_text_relative);
5672 boolNoPICDataIsTextRelative =
false;
5673 if(LastPICDataRelArg) {
5674 if(LastPICDataRelArg->getOption().matches(
5675options::OPT_mno_pic_data_is_text_relative)) {
5676NoPICDataIsTextRelative =
true;
5678 D.Diag(diag::err_drv_argument_only_allowed_with)
5679<<
"-mno-pic-data-is-text-relative" 5682 if(!Triple.isSystemZ())
5683 D.Diag(diag::err_drv_unsupported_opt_for_target)
5684<< (NoPICDataIsTextRelative ?
"-mno-pic-data-is-text-relative" 5685:
"-mpic-data-is-text-relative")
5689 boolIsROPI = RelocationModel == llvm::Reloc::ROPI ||
5690RelocationModel == llvm::Reloc::ROPI_RWPI;
5691 boolIsRWPI = RelocationModel == llvm::Reloc::RWPI ||
5692RelocationModel == llvm::Reloc::ROPI_RWPI;
5694 if(Args.hasArg(options::OPT_mcmse) &&
5695!Args.hasArg(options::OPT_fallow_unsupported)) {
5697 D.Diag(diag::err_cmse_pi_are_incompatible) << IsROPI;
5699 D.Diag(diag::err_cmse_pi_are_incompatible) << !IsRWPI;
5703!Args.hasArg(options::OPT_fallow_unsupported))
5704 D.Diag(diag::err_drv_ropi_incompatible_with_cxx);
5708CmdArgs.push_back(
"-mrelocation-model");
5709CmdArgs.push_back(RMName);
5712CmdArgs.push_back(
"-pic-level");
5713CmdArgs.push_back(PICLevel == 1 ?
"1":
"2");
5715CmdArgs.push_back(
"-pic-is-pie");
5716 if(NoPICDataIsTextRelative)
5717CmdArgs.push_back(
"-mcmodel=medium");
5720 if(RelocationModel == llvm::Reloc::ROPI ||
5721RelocationModel == llvm::Reloc::ROPI_RWPI)
5722CmdArgs.push_back(
"-fropi");
5723 if(RelocationModel == llvm::Reloc::RWPI ||
5724RelocationModel == llvm::Reloc::ROPI_RWPI)
5725CmdArgs.push_back(
"-frwpi");
5727 if(Arg *A = Args.getLastArg(options::OPT_meabi)) {
5728CmdArgs.push_back(
"-meabi");
5729CmdArgs.push_back(A->getValue());
5743 if(Triple.isOSBinFormatELF()) {
5744Arg *A = Args.getLastArg(options::OPT_fsemantic_interposition,
5745options::OPT_fno_semantic_interposition);
5746 if(RelocationModel != llvm::Reloc::Static && !IsPIE) {
5748 boolSupportsLocalAlias =
5749Triple.isAArch64() || Triple.isRISCV() || Triple.isX86();
5751CmdArgs.push_back(
"-fhalf-no-semantic-interposition");
5752 else if(A->getOption().matches(options::OPT_fsemantic_interposition))
5753A->render(Args, CmdArgs);
5754 else if(!SupportsLocalAlias)
5755CmdArgs.push_back(
"-fhalf-no-semantic-interposition");
5761 if(Arg *A = Args.getLastArg(options::OPT_mthread_model)) {
5763 D.Diag(diag::err_drv_invalid_thread_model_for_target)
5764<< A->getValue() << A->getAsString(Args);
5765Model = A->getValue();
5768 if(Model !=
"posix") {
5769CmdArgs.push_back(
"-mthread-model");
5770CmdArgs.push_back(Args.MakeArgString(Model));
5774 if(Arg *A = Args.getLastArg(options::OPT_fveclib)) {
5775StringRef Name = A->getValue();
5776 if(Name ==
"SVML") {
5777 if(Triple.getArch() != llvm::Triple::x86 &&
5778Triple.getArch() != llvm::Triple::x86_64)
5779 D.Diag(diag::err_drv_unsupported_opt_for_target)
5780<< Name << Triple.getArchName();
5781}
else if(Name ==
"LIBMVEC-X86") {
5782 if(Triple.getArch() != llvm::Triple::x86 &&
5783Triple.getArch() != llvm::Triple::x86_64)
5784 D.Diag(diag::err_drv_unsupported_opt_for_target)
5785<< Name << Triple.getArchName();
5786}
else if(Name ==
"SLEEF"|| Name ==
"ArmPL") {
5787 if(Triple.getArch() != llvm::Triple::aarch64 &&
5788Triple.getArch() != llvm::Triple::aarch64_be &&
5789Triple.getArch() != llvm::Triple::riscv64)
5790 D.Diag(diag::err_drv_unsupported_opt_for_target)
5791<< Name << Triple.getArchName();
5793A->render(Args, CmdArgs);
5796 if(Args.hasFlag(options::OPT_fmerge_all_constants,
5797options::OPT_fno_merge_all_constants,
false))
5798CmdArgs.push_back(
"-fmerge-all-constants");
5800Args.addOptOutFlag(CmdArgs, options::OPT_fdelete_null_pointer_checks,
5801options::OPT_fno_delete_null_pointer_checks);
5805 if(Arg *A = Args.getLastArg(options::OPT_mabi_EQ_quadword_atomics)) {
5806 if(!Triple.isOSAIX() || Triple.isPPC32())
5807 D.Diag(diag::err_drv_unsupported_opt_for_target)
5808<< A->getSpelling() << RawTriple.str();
5809CmdArgs.push_back(
"-mabi=quadword-atomics");
5812 if(Arg *A = Args.getLastArg(options::OPT_mlong_double_128)) {
5815 if(Triple.isOSAIX())
5816 D.Diag(diag::err_drv_unsupported_opt_for_target)
5817<< A->getSpelling() << RawTriple.str();
5820 if(Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
5821StringRef
V= A->getValue(), V1 =
V;
5823 if(V1.consumeInteger(10, Size) || !V1.empty())
5824 D.Diag(diag::err_drv_invalid_argument_to_option)
5825<<
V<< A->getOption().getName();
5827CmdArgs.push_back(Args.MakeArgString(
"-fwarn-stack-size="+
V));
5830Args.addOptOutFlag(CmdArgs, options::OPT_fjump_tables,
5831options::OPT_fno_jump_tables);
5832Args.addOptInFlag(CmdArgs, options::OPT_fprofile_sample_accurate,
5833options::OPT_fno_profile_sample_accurate);
5834Args.addOptOutFlag(CmdArgs, options::OPT_fpreserve_as_comments,
5835options::OPT_fno_preserve_as_comments);
5837 if(Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
5838CmdArgs.push_back(
"-mregparm");
5839CmdArgs.push_back(A->getValue());
5842 if(Arg *A = Args.getLastArg(options::OPT_maix_struct_return,
5843options::OPT_msvr4_struct_return)) {
5845 D.Diag(diag::err_drv_unsupported_opt_for_target)
5846<< A->getSpelling() << RawTriple.str();
5847}
else if(A->getOption().matches(options::OPT_maix_struct_return)) {
5848CmdArgs.push_back(
"-maix-struct-return");
5850assert(A->getOption().matches(options::OPT_msvr4_struct_return));
5851CmdArgs.push_back(
"-msvr4-struct-return");
5855 if(Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
5856options::OPT_freg_struct_return)) {
5857 if(TC.
getArch() != llvm::Triple::x86) {
5858 D.Diag(diag::err_drv_unsupported_opt_for_target)
5859<< A->getSpelling() << RawTriple.str();
5860}
else if(A->getOption().matches(options::OPT_fpcc_struct_return)) {
5861CmdArgs.push_back(
"-fpcc-struct-return");
5863assert(A->getOption().matches(options::OPT_freg_struct_return));
5864CmdArgs.push_back(
"-freg-struct-return");
5868 if(Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd,
false)) {
5869 if(Triple.getArch() == llvm::Triple::m68k)
5870CmdArgs.push_back(
"-fdefault-calling-conv=rtdcall");
5872CmdArgs.push_back(
"-fdefault-calling-conv=stdcall");
5875 if(Args.hasArg(options::OPT_fenable_matrix)) {
5877CmdArgs.push_back(
"-fenable-matrix");
5878CmdArgs.push_back(
"-mllvm");
5879CmdArgs.push_back(
"-enable-matrix");
5884 const char*FPKeepKindStr =
nullptr;
5885 switch(FPKeepKind) {
5887FPKeepKindStr =
"-mframe-pointer=none";
5890FPKeepKindStr =
"-mframe-pointer=reserved";
5893FPKeepKindStr =
"-mframe-pointer=non-leaf";
5896FPKeepKindStr =
"-mframe-pointer=all";
5899assert(FPKeepKindStr &&
"unknown FramePointerKind");
5900CmdArgs.push_back(FPKeepKindStr);
5902Args.addOptOutFlag(CmdArgs, options::OPT_fzero_initialized_in_bss,
5903options::OPT_fno_zero_initialized_in_bss);
5907 D.Diag(diag::warn_drv_deprecated_arg_ofast);
5910OptSpecifier StrictAliasingAliasOption =
5911OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
5914 if(!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
5915options::OPT_fno_strict_aliasing, !IsWindowsMSVC))
5916CmdArgs.push_back(
"-relaxed-aliasing");
5917 if(Args.hasFlag(options::OPT_fno_pointer_tbaa, options::OPT_fpointer_tbaa,
5919CmdArgs.push_back(
"-no-pointer-tbaa");
5920 if(!Args.hasFlag(options::OPT_fstruct_path_tbaa,
5921options::OPT_fno_struct_path_tbaa,
true))
5922CmdArgs.push_back(
"-no-struct-path-tbaa");
5923Args.addOptInFlag(CmdArgs, options::OPT_fstrict_enums,
5924options::OPT_fno_strict_enums);
5925Args.addOptOutFlag(CmdArgs, options::OPT_fstrict_return,
5926options::OPT_fno_strict_return);
5927Args.addOptInFlag(CmdArgs, options::OPT_fallow_editor_placeholders,
5928options::OPT_fno_allow_editor_placeholders);
5929Args.addOptInFlag(CmdArgs, options::OPT_fstrict_vtable_pointers,
5930options::OPT_fno_strict_vtable_pointers);
5931Args.addOptInFlag(CmdArgs, options::OPT_fforce_emit_vtables,
5932options::OPT_fno_force_emit_vtables);
5933Args.addOptOutFlag(CmdArgs, options::OPT_foptimize_sibling_calls,
5934options::OPT_fno_optimize_sibling_calls);
5935Args.addOptOutFlag(CmdArgs, options::OPT_fescaping_block_tail_calls,
5936options::OPT_fno_escaping_block_tail_calls);
5938Args.AddLastArg(CmdArgs, options::OPT_ffine_grained_bitfield_accesses,
5939options::OPT_fno_fine_grained_bitfield_accesses);
5941Args.AddLastArg(CmdArgs, options::OPT_fexperimental_relative_cxx_abi_vtables,
5942options::OPT_fno_experimental_relative_cxx_abi_vtables);
5944Args.AddLastArg(CmdArgs, options::OPT_fexperimental_omit_vtable_rtti,
5945options::OPT_fno_experimental_omit_vtable_rtti);
5947Args.AddLastArg(CmdArgs, options::OPT_fdisable_block_signature_string,
5948options::OPT_fno_disable_block_signature_string);
5951Args.addOptInFlag(CmdArgs, options::OPT_fsplit_stack,
5952options::OPT_fno_split_stack);
5955 if(Args.hasFlag(options::OPT_fprotect_parens,
5956options::OPT_fno_protect_parens,
false))
5957CmdArgs.push_back(
"-fprotect-parens");
5961 if(Arg *A = Args.getLastArg(options::OPT_fextend_args_EQ)) {
5962 constllvm::Triple::ArchType Arch = TC.
getArch();
5963 if(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5964StringRef
V= A->getValue();
5966CmdArgs.push_back(
"-fextend-arguments=64");
5967 else if(
V!=
"32")
5968 D.Diag(diag::err_drv_invalid_argument_to_option)
5969<< A->getValue() << A->getOption().getName();
5971 D.Diag(diag::err_drv_unsupported_opt_for_target)
5972<< A->getOption().getName() << TripleStr;
5975 if(Arg *A = Args.getLastArg(options::OPT_mdouble_EQ)) {
5976 if(TC.
getArch() == llvm::Triple::avr)
5977A->render(Args, CmdArgs);
5979 D.Diag(diag::err_drv_unsupported_opt_for_target)
5980<< A->getAsString(Args) << TripleStr;
5983 if(Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
5985A->render(Args, CmdArgs);
5987(A->getOption().getID() != options::OPT_mlong_double_80))
5988A->render(Args, CmdArgs);
5990 D.Diag(diag::err_drv_unsupported_opt_for_target)
5991<< A->getAsString(Args) << TripleStr;
5997 if(!Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
5998IsIntegratedAssemblerDefault))
5999CmdArgs.push_back(
"-fno-verbose-asm");
6003 if(Arg *A = Args.getLastArg(options::OPT_fbinutils_version_EQ)) {
6004StringRef
V= A->getValue();
6007A->render(Args, CmdArgs);
6008 else if(!
V.consumeInteger(10,
Num) &&
Num> 0 &&
6009(
V.empty() || (
V.consume_front(
".") &&
6010!
V.consumeInteger(10,
Num) &&
V.empty())))
6011A->render(Args, CmdArgs);
6013 D.Diag(diag::err_drv_invalid_argument_to_option)
6014<< A->getValue() << A->getOption().getName();
6020CmdArgs.push_back(
"-no-integrated-as");
6022 if(Args.hasArg(options::OPT_fdebug_pass_structure)) {
6023CmdArgs.push_back(
"-mdebug-pass");
6024CmdArgs.push_back(
"Structure");
6026 if(Args.hasArg(options::OPT_fdebug_pass_arguments)) {
6027CmdArgs.push_back(
"-mdebug-pass");
6028CmdArgs.push_back(
"Arguments");
6034 if(!RawTriple.isOSDarwin() && !RawTriple.isNVPTX())
6035CmdArgs.push_back(
"-mconstructor-aliases");
6039 if(KernelOrKext && RawTriple.isOSDarwin())
6040CmdArgs.push_back(
"-fforbid-guard-variables");
6042 if(Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
6043Triple.isWindowsGNUEnvironment())) {
6044CmdArgs.push_back(
"-mms-bitfields");
6047 if(Triple.isWindowsGNUEnvironment()) {
6048Args.addOptOutFlag(CmdArgs, options::OPT_fauto_import,
6049options::OPT_fno_auto_import);
6052 if(Args.hasFlag(options::OPT_fms_volatile, options::OPT_fno_ms_volatile,
6053Triple.isX86() && IsWindowsMSVC))
6054CmdArgs.push_back(
"-fms-volatile");
6059 if(Arg *A = Args.getLastArg(options::OPT_fdirect_access_external_data,
6060options::OPT_fno_direct_access_external_data)) {
6061 if(A->getOption().matches(options::OPT_fdirect_access_external_data) !=
6063A->render(Args, CmdArgs);
6064}
else if(PICLevel == 0 && Triple.isLoongArch()) {
6067CmdArgs.push_back(
"-fno-direct-access-external-data");
6070 if(Triple.isOSBinFormatELF() && (Triple.isAArch64() || Triple.isX86()))
6071Args.addOptOutFlag(CmdArgs, options::OPT_fplt, options::OPT_fno_plt);
6077Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted,
false) ||
6080CmdArgs.push_back(
"-ffreestanding");
6082Args.AddLastArg(CmdArgs, options::OPT_fno_knr_functions);
6089 boolIsAsyncUnwindTablesDefault =
6091 boolIsSyncUnwindTablesDefault =
6094 boolAsyncUnwindTables = Args.hasFlag(
6095options::OPT_fasynchronous_unwind_tables,
6096options::OPT_fno_asynchronous_unwind_tables,
6097(IsAsyncUnwindTablesDefault || SanitizeArgs.needsUnwindTables()) &&
6100Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
6101IsSyncUnwindTablesDefault && !Freestanding);
6102 if(AsyncUnwindTables)
6103CmdArgs.push_back(
"-funwind-tables=2");
6104 else if(UnwindTables)
6105CmdArgs.push_back(
"-funwind-tables=1");
6109 if(!Args.getLastArg(options::OPT_gpu_use_aux_triple_only) &&
6110(IsCudaDevice || IsHIPDevice || IsSYCLDevice)) {
6111 constArgList &HostArgs =
6113std::string HostCPU =
6115 if(!HostCPU.empty()) {
6116CmdArgs.push_back(
"-aux-target-cpu");
6117CmdArgs.push_back(Args.MakeArgString(HostCPU));
6125 addMCModel(
D, Args, Triple, RelocationModel, CmdArgs);
6127 if(Arg *A = Args.getLastArg(options::OPT_mtls_size_EQ)) {
6128StringRef
Value= A->getValue();
6129 unsignedTLSSize = 0;
6130 Value.getAsInteger(10, TLSSize);
6131 if(!Triple.isAArch64() || !Triple.isOSBinFormatELF())
6132 D.Diag(diag::err_drv_unsupported_opt_for_target)
6133<< A->getOption().getName() << TripleStr;
6134 if(TLSSize != 12 && TLSSize != 24 && TLSSize != 32 && TLSSize != 48)
6135 D.Diag(diag::err_drv_invalid_int_value)
6136<< A->getOption().getName() <<
Value;
6137Args.AddLastArg(CmdArgs, options::OPT_mtls_size_EQ);
6141CmdArgs.push_back(
"-enable-tlsdesc");
6144std::string CPU =
getCPUName(
D, Args, Triple,
false);
6146CmdArgs.push_back(
"-target-cpu");
6147CmdArgs.push_back(Args.MakeArgString(CPU));
6150RenderTargetOptions(Triple, Args, KernelOrKext, CmdArgs);
6155AddClangCLArgs(Args, InputType, CmdArgs);
6157llvm::codegenoptions::DebugInfoKind DebugInfoKind =
6158llvm::codegenoptions::NoDebugInfo;
6161CmdArgs, Output, DebugInfoKind, DwarfFission);
6168TC.
getTriple().isOSBinFormatCOFF()) &&
6169(isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
6170isa<BackendJobAction>(JA));
6172 const char*SplitDWARFOut =
SplitDebugName(JA, Args, Input, Output);
6173CmdArgs.push_back(
"-split-dwarf-file");
6174CmdArgs.push_back(SplitDWARFOut);
6176CmdArgs.push_back(
"-split-dwarf-output");
6177CmdArgs.push_back(SplitDWARFOut);
6182 if(Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6183CmdArgs.push_back(
"-target-linker-version");
6184CmdArgs.push_back(A->getValue());
6189 if(!Args.hasArg(options::OPT_fallow_unsupported)) {
6191 if(
types::isCXX(InputType) && RawTriple.isOSDarwin() &&
6192TC.
getArch() == llvm::Triple::x86) {
6193 if((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
6194(Unsupported = Args.getLastArg(options::OPT_mkernel)))
6195 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
6196<< Unsupported->getOption().getName();
6199 if((Unsupported = Args.getLastArg(options::OPT_faltivec)))
6200 D.Diag(diag::err_drv_clang_unsupported_opt_faltivec)
6201<< Unsupported->getOption().getName()
6202<<
"please use -maltivec and include altivec.h explicitly";
6203 if((Unsupported = Args.getLastArg(options::OPT_fno_altivec)))
6204 D.Diag(diag::err_drv_clang_unsupported_opt_faltivec)
6205<< Unsupported->getOption().getName() <<
"please use -mno-altivec";
6208Args.AddAllArgs(CmdArgs, options::OPT_v);
6210 if(Args.getLastArg(options::OPT_H)) {
6211CmdArgs.push_back(
"-H");
6212CmdArgs.push_back(
"-sys-header-deps");
6214Args.AddAllArgs(CmdArgs, options::OPT_fshow_skipped_includes);
6216 if(
D.CCPrintHeadersFormat && !
D.CCGenDiagnostics) {
6217CmdArgs.push_back(
"-header-include-file");
6218CmdArgs.push_back(!
D.CCPrintHeadersFilename.empty()
6219?
D.CCPrintHeadersFilename.c_str()
6221CmdArgs.push_back(
"-sys-header-deps");
6222CmdArgs.push_back(Args.MakeArgString(
6223 "-header-include-format="+
6226Args.MakeArgString(
"-header-include-filtering="+
6228 D.CCPrintHeadersFiltering))));
6230Args.AddLastArg(CmdArgs, options::OPT_P);
6231Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
6233 if(
D.CCLogDiagnostics && !
D.CCGenDiagnostics) {
6234CmdArgs.push_back(
"-diagnostic-log-file");
6235CmdArgs.push_back(!
D.CCLogDiagnosticsFilename.empty()
6236?
D.CCLogDiagnosticsFilename.c_str()
6242 if(
D.CCGenDiagnostics)
6243CmdArgs.push_back(
"-disable-pragma-debug-crash");
6247 if(Args.hasArg(options::OPT_fcrash_diagnostics_dir)) {
6248StringRef Dir = Args.getLastArgValue(options::OPT_fcrash_diagnostics_dir);
6249CmdArgs.push_back(
"-mllvm");
6250CmdArgs.push_back(Args.MakeArgString(
"-crash-diagnostics-dir="+ Dir));
6255 if(Args.hasFlag(options::OPT_ffunction_sections,
6256options::OPT_fno_function_sections, UseSeparateSections)) {
6257CmdArgs.push_back(
"-ffunction-sections");
6260 if(Arg *A = Args.getLastArg(options::OPT_fbasic_block_address_map,
6261options::OPT_fno_basic_block_address_map)) {
6262 if((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF()) {
6263 if(A->getOption().matches(options::OPT_fbasic_block_address_map))
6264A->render(Args, CmdArgs);
6266 D.Diag(diag::err_drv_unsupported_opt_for_target)
6267<< A->getAsString(Args) << TripleStr;
6271 if(Arg *A = Args.getLastArg(options::OPT_fbasic_block_sections_EQ)) {
6272StringRef Val = A->getValue();
6273 if(Val ==
"labels") {
6274 D.Diag(diag::warn_drv_deprecated_arg)
6275<< A->getAsString(Args) <<
true 6276<<
"-fbasic-block-address-map";
6277CmdArgs.push_back(
"-fbasic-block-address-map");
6278}
else if(Triple.isX86() && Triple.isOSBinFormatELF()) {
6279 if(Val !=
"all"&& Val !=
"none"&& !Val.starts_with(
"list="))
6280 D.Diag(diag::err_drv_invalid_value)
6281<< A->getAsString(Args) << A->getValue();
6283A->render(Args, CmdArgs);
6284}
else if(Triple.isAArch64() && Triple.isOSBinFormatELF()) {
6287 if(Val !=
"labels"&& Val !=
"none"&& !Val.starts_with(
"list="))
6288 D.Diag(diag::err_drv_invalid_value)
6289<< A->getAsString(Args) << A->getValue();
6291A->render(Args, CmdArgs);
6292}
else if(Triple.isNVPTX()) {
6295}
else if(Val !=
"none") {
6298 D.Diag(diag::err_drv_unsupported_opt_for_target)
6299<< A->getAsString(Args) << TripleStr;
6303 boolHasDefaultDataSections = Triple.isOSBinFormatXCOFF();
6304 if(Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
6305UseSeparateSections || HasDefaultDataSections)) {
6306CmdArgs.push_back(
"-fdata-sections");
6309Args.addOptOutFlag(CmdArgs, options::OPT_funique_section_names,
6310options::OPT_fno_unique_section_names);
6311Args.addOptInFlag(CmdArgs, options::OPT_fseparate_named_sections,
6312options::OPT_fno_separate_named_sections);
6313Args.addOptInFlag(CmdArgs, options::OPT_funique_internal_linkage_names,
6314options::OPT_fno_unique_internal_linkage_names);
6315Args.addOptInFlag(CmdArgs, options::OPT_funique_basic_block_section_names,
6316options::OPT_fno_unique_basic_block_section_names);
6318 if(Arg *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
6319options::OPT_fno_split_machine_functions)) {
6320 if(!A->getOption().matches(options::OPT_fno_split_machine_functions)) {
6322 if((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
6323A->render(Args, CmdArgs);
6325 D.Diag(diag::err_drv_unsupported_opt_for_target)
6326<< A->getAsString(Args) << TripleStr;
6330Args.AddLastArg(CmdArgs, options::OPT_finstrument_functions,
6331options::OPT_finstrument_functions_after_inlining,
6332options::OPT_finstrument_function_entry_bare);
6333Args.AddLastArg(CmdArgs, options::OPT_fconvergent_functions,
6334options::OPT_fno_convergent_functions);
6339 if(!Triple.isNVPTX() && !Triple.isAMDGCN())
6342Args.AddLastArg(CmdArgs, options::OPT_fclang_abi_compat_EQ);
6345Args.hasArg(options::OPT_fsample_profile_use_profi)) {
6346CmdArgs.push_back(
"-mllvm");
6347CmdArgs.push_back(
"-sample-profile-use-profi");
6351 if(RawTriple.isPS() &&
6352!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6358 if(Args.hasArg(options::OPT_nostdinc)) {
6359CmdArgs.push_back(
"-nostdsysteminc");
6360CmdArgs.push_back(
"-nobuiltininc");
6362 if(Args.hasArg(options::OPT_nostdlibinc))
6363CmdArgs.push_back(
"-nostdsysteminc");
6364Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
6365Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
6369CmdArgs.push_back(
"-resource-dir");
6370CmdArgs.push_back(
D.ResourceDir.c_str());
6372Args.AddLastArg(CmdArgs, options::OPT_working_directory);
6379AddPreprocessingOptions(
C, JA,
D, Args, CmdArgs, Output, Inputs);
6385Args.ClaimAllArgs(options::OPT_D);
6388 if(Arg *A = Args.getLastArg(options::OPT_O_Group)) {
6389 if(A->getOption().matches(options::OPT_O4)) {
6390CmdArgs.push_back(
"-O3");
6391 D.Diag(diag::warn_O4_is_O3);
6393A->render(Args, CmdArgs);
6398 for(
constArg *A :
6399Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
6400 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
6404 for(
constArg *A :
6405Args.filtered(options::OPT_clang_ignored_legacy_options_Group)) {
6406 D.Diag(diag::warn_ignored_clang_option) << A->getAsString(Args);
6412Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
6414 for(
constArg *A :
6415Args.filtered(options::OPT_W_Group, options::OPT__SLASH_wd)) {
6417 if(A->getOption().getID() == options::OPT__SLASH_wd) {
6418 unsignedWarningNumber;
6419 if(StringRef(A->getValue()).getAsInteger(10, WarningNumber)) {
6420 D.Diag(diag::err_drv_invalid_int_value)
6421<< A->getAsString(Args) << A->getValue();
6426CmdArgs.push_back(Args.MakeArgString(
6431A->render(Args, CmdArgs);
6434Args.AddAllArgs(CmdArgs, options::OPT_Wsystem_headers_in_module_EQ);
6436 if(Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic,
false))
6437CmdArgs.push_back(
"-pedantic");
6438Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
6439Args.AddLastArg(CmdArgs, options::OPT_w);
6441Args.addOptInFlag(CmdArgs, options::OPT_ffixed_point,
6442options::OPT_fno_fixed_point);
6444 if(Arg *A = Args.getLastArg(options::OPT_fcxx_abi_EQ))
6445A->render(Args, CmdArgs);
6447Args.AddLastArg(CmdArgs, options::OPT_fexperimental_relative_cxx_abi_vtables,
6448options::OPT_fno_experimental_relative_cxx_abi_vtables);
6450Args.AddLastArg(CmdArgs, options::OPT_fexperimental_omit_vtable_rtti,
6451options::OPT_fno_experimental_omit_vtable_rtti);
6453 if(Arg *A = Args.getLastArg(options::OPT_ffuchsia_api_level_EQ))
6454A->render(Args, CmdArgs);
6461 boolImplyVCPPCVer =
false;
6462 boolImplyVCPPCXXVer =
false;
6463 constArg *
Std= Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi);
6465 if(
Std->getOption().matches(options::OPT_ansi))
6467CmdArgs.push_back(
"-std=c++98");
6469CmdArgs.push_back(
"-std=c89");
6471 Std->render(Args, CmdArgs);
6474 if(Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
6475options::OPT_ftrigraphs,
6476options::OPT_fno_trigraphs))
6478A->render(Args, CmdArgs);
6487 if(!Args.hasArg(options::OPT__SLASH_std)) {
6488Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
"-std=",
6491ImplyVCPPCVer =
true;
6493 else if(IsWindowsMSVC)
6494ImplyVCPPCXXVer =
true;
6496Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
6497options::OPT_fno_trigraphs);
6513Args.getLastArg(options::OPT_Wwrite_strings,
6514options::OPT_Wno_write_strings, options::OPT_w);
6516WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
6517CmdArgs.push_back(
"-fconst-strings");
6524Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
6526CmdArgs.push_back(
"-fdeprecated-macro");
6530 if(Arg *
Asm= Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
6531 if(
Asm->getOption().matches(options::OPT_fasm))
6532CmdArgs.push_back(
"-fgnu-keywords");
6534CmdArgs.push_back(
"-fno-gnu-keywords");
6538CmdArgs.push_back(
"-fno-autolink");
6540Args.AddLastArg(CmdArgs, options::OPT_ftemplate_depth_EQ);
6541Args.AddLastArg(CmdArgs, options::OPT_foperator_arrow_depth_EQ);
6542Args.AddLastArg(CmdArgs, options::OPT_fconstexpr_depth_EQ);
6543Args.AddLastArg(CmdArgs, options::OPT_fconstexpr_steps_EQ);
6545Args.AddLastArg(CmdArgs, options::OPT_fexperimental_library);
6547 if(Args.hasArg(options::OPT_fexperimental_new_constant_interpreter))
6548CmdArgs.push_back(
"-fexperimental-new-constant-interpreter");
6550 if(Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
6551CmdArgs.push_back(
"-fbracket-depth");
6552CmdArgs.push_back(A->getValue());
6555 if(Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
6556options::OPT_Wlarge_by_value_copy_def)) {
6557 if(A->getNumValues()) {
6558StringRef
bytes= A->getValue();
6559CmdArgs.push_back(Args.MakeArgString(
"-Wlarge-by-value-copy="+
bytes));
6561CmdArgs.push_back(
"-Wlarge-by-value-copy=64");
6564 if(Args.hasArg(options::OPT_relocatable_pch))
6565CmdArgs.push_back(
"-relocatable-pch");
6567 if(
constArg *A = Args.getLastArg(options::OPT_fcf_runtime_abi_EQ)) {
6568 static const char*kCFABIs[] = {
6569 "standalone",
"objc",
"swift",
"swift-5.0",
"swift-4.2",
"swift-4.1",
6572 if(!llvm::is_contained(kCFABIs, StringRef(A->getValue())))
6573 D.Diag(diag::err_drv_invalid_cf_runtime_abi) << A->getValue();
6575A->render(Args, CmdArgs);
6578 if(Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
6579CmdArgs.push_back(
"-fconstant-string-class");
6580CmdArgs.push_back(A->getValue());
6583 if(Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
6584CmdArgs.push_back(
"-ftabstop");
6585CmdArgs.push_back(A->getValue());
6588Args.addOptInFlag(CmdArgs, options::OPT_fstack_size_section,
6589options::OPT_fno_stack_size_section);
6591 if(Args.hasArg(options::OPT_fstack_usage)) {
6592CmdArgs.push_back(
"-stack-usage-file");
6594 if(Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
6596llvm::sys::path::replace_extension(OutputFilename,
"su");
6597CmdArgs.push_back(Args.MakeArgString(OutputFilename));
6603CmdArgs.push_back(
"-ferror-limit");
6604 if(Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
6605CmdArgs.push_back(A->getValue());
6607CmdArgs.push_back(
"19");
6609Args.AddLastArg(CmdArgs, options::OPT_fconstexpr_backtrace_limit_EQ);
6610Args.AddLastArg(CmdArgs, options::OPT_fmacro_backtrace_limit_EQ);
6611Args.AddLastArg(CmdArgs, options::OPT_ftemplate_backtrace_limit_EQ);
6612Args.AddLastArg(CmdArgs, options::OPT_fspell_checking_limit_EQ);
6613Args.AddLastArg(CmdArgs, options::OPT_fcaret_diagnostics_max_lines_EQ);
6616 unsignedMessageLength = 0;
6617 if(Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
6618StringRef
V(A->getValue());
6619 if(
V.getAsInteger(0, MessageLength))
6620 D.Diag(diag::err_drv_invalid_argument_to_option)
6621<<
V<< A->getOption().getName();
6625MessageLength = llvm::sys::Process::StandardErrColumns();
6627 if(MessageLength != 0)
6629Args.MakeArgString(
"-fmessage-length="+ Twine(MessageLength)));
6631 if(Arg *A = Args.getLastArg(options::OPT_frandomize_layout_seed_EQ))
6633Args.MakeArgString(
"-frandomize-layout-seed="+ Twine(A->getValue(0))));
6635 if(Arg *A = Args.getLastArg(options::OPT_frandomize_layout_seed_file_EQ))
6636CmdArgs.push_back(Args.MakeArgString(
"-frandomize-layout-seed-file="+
6637Twine(A->getValue(0))));
6640 if(
constArg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
6641options::OPT_fvisibility_ms_compat)) {
6642 if(A->getOption().matches(options::OPT_fvisibility_EQ)) {
6643A->render(Args, CmdArgs);
6645assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
6646CmdArgs.push_back(
"-fvisibility=hidden");
6647CmdArgs.push_back(
"-ftype-visibility=default");
6649}
else if(IsOpenMPDevice) {
6653CmdArgs.push_back(
"-fvisibility=protected");
6657 if(!RawTriple.isPS()) {
6659Args.getLastArg(options::OPT_fvisibility_from_dllstorageclass,
6660options::OPT_fno_visibility_from_dllstorageclass)) {
6661 if(A->getOption().matches(
6662options::OPT_fvisibility_from_dllstorageclass)) {
6663CmdArgs.push_back(
"-fvisibility-from-dllstorageclass");
6664Args.AddLastArg(CmdArgs, options::OPT_fvisibility_dllexport_EQ);
6665Args.AddLastArg(CmdArgs, options::OPT_fvisibility_nodllstorageclass_EQ);
6666Args.AddLastArg(CmdArgs, options::OPT_fvisibility_externs_dllimport_EQ);
6667Args.AddLastArg(CmdArgs,
6668options::OPT_fvisibility_externs_nodllstorageclass_EQ);
6673 if(Args.hasFlag(options::OPT_fvisibility_inlines_hidden,
6674options::OPT_fno_visibility_inlines_hidden,
false))
6675CmdArgs.push_back(
"-fvisibility-inlines-hidden");
6677Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden_static_local_var,
6678options::OPT_fno_visibility_inlines_hidden_static_local_var);
6683Args.getLastArg(options::OPT_fvisibility_global_new_delete_hidden)) {
6684 D.Diag(diag::warn_drv_deprecated_arg)
6685<< A->getAsString(Args) <<
true 6686<<
"-fvisibility-global-new-delete=force-hidden";
6690Args.getLastArg(options::OPT_fvisibility_global_new_delete_EQ,
6691options::OPT_fvisibility_global_new_delete_hidden)) {
6692 if(A->getOption().matches(options::OPT_fvisibility_global_new_delete_EQ)) {
6693A->render(Args, CmdArgs);
6695assert(A->getOption().matches(
6696options::OPT_fvisibility_global_new_delete_hidden));
6697CmdArgs.push_back(
"-fvisibility-global-new-delete=force-hidden");
6701Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
6703 if(Args.hasFlag(options::OPT_fnew_infallible,
6704options::OPT_fno_new_infallible,
false))
6705CmdArgs.push_back(
"-fnew-infallible");
6707 if(Args.hasFlag(options::OPT_fno_operator_names,
6708options::OPT_foperator_names,
false))
6709CmdArgs.push_back(
"-fno-operator-names");
6712Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
6713Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
6714Args.AddLastArg(CmdArgs, options::OPT_fdigraphs, options::OPT_fno_digraphs);
6715Args.AddLastArg(CmdArgs, options::OPT_fzero_call_used_regs_EQ);
6716Args.AddLastArg(CmdArgs, options::OPT_fraw_string_literals,
6717options::OPT_fno_raw_string_literals);
6719 if(Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
6720Triple.hasDefaultEmulatedTLS()))
6721CmdArgs.push_back(
"-femulated-tls");
6723Args.addOptInFlag(CmdArgs, options::OPT_fcheck_new,
6724options::OPT_fno_check_new);
6726 if(Arg *A = Args.getLastArg(options::OPT_fzero_call_used_regs_EQ)) {
6730 if(!Triple.isX86() && !Triple.isAArch64())
6731 D.Diag(diag::err_drv_unsupported_opt_for_target)
6732<< A->getAsString(Args) << TripleStr;
6736 if(!isa<PreprocessJobAction>(JA) || Output.
getType() != types::TY_PP_Asm)
6737Args.AddLastArg(CmdArgs, options::OPT_fzvector);
6739Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
6740Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
6744 if(Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6745options::OPT_fno_openmp,
false) &&
6746!Args.hasFlag(options::OPT_foffload_via_llvm,
6747options::OPT_fno_offload_via_llvm,
false) &&
6750 switch(
D.getOpenMPRuntime(Args)) {
6754CmdArgs.push_back(
"-fopenmp");
6759 if(!Args.hasFlag(options::OPT_fopenmp_use_tls,
6760options::OPT_fnoopenmp_use_tls,
true))
6761CmdArgs.push_back(
"-fnoopenmp-use-tls");
6762Args.AddLastArg(CmdArgs, options::OPT_fopenmp_simd,
6763options::OPT_fno_openmp_simd);
6764Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_enable_irbuilder);
6765Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
6766 if(!Args.hasFlag(options::OPT_fopenmp_extensions,
6767options::OPT_fno_openmp_extensions,
true))
6768CmdArgs.push_back(
"-fno-openmp-extensions");
6769Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_cuda_number_of_sm_EQ);
6770Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_cuda_blocks_per_sm_EQ);
6771Args.AddAllArgs(CmdArgs,
6772options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ);
6773 if(Args.hasFlag(options::OPT_fopenmp_optimistic_collapse,
6774options::OPT_fno_openmp_optimistic_collapse,
6776CmdArgs.push_back(
"-fopenmp-optimistic-collapse");
6780 if(Args.hasFlag(options::OPT_fopenmp_cuda_mode,
6781options::OPT_fno_openmp_cuda_mode,
false))
6782CmdArgs.push_back(
"-fopenmp-cuda-mode");
6785Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_target_debug_EQ);
6786 if(Args.hasFlag(options::OPT_fopenmp_target_debug,
6787options::OPT_fno_openmp_target_debug,
false))
6788CmdArgs.push_back(
"-fopenmp-target-debug");
6792 if(Args.hasFlag(options::OPT_fopenmp_assume_teams_oversubscription,
6793options::OPT_fno_openmp_assume_teams_oversubscription,
6795CmdArgs.push_back(
"-fopenmp-assume-teams-oversubscription");
6796 if(Args.hasFlag(options::OPT_fopenmp_assume_threads_oversubscription,
6797options::OPT_fno_openmp_assume_threads_oversubscription,
6799CmdArgs.push_back(
"-fopenmp-assume-threads-oversubscription");
6800 if(Args.hasArg(options::OPT_fopenmp_assume_no_thread_state))
6801CmdArgs.push_back(
"-fopenmp-assume-no-thread-state");
6802 if(Args.hasArg(options::OPT_fopenmp_assume_no_nested_parallelism))
6803CmdArgs.push_back(
"-fopenmp-assume-no-nested-parallelism");
6804 if(Args.hasArg(options::OPT_fopenmp_offload_mandatory))
6805CmdArgs.push_back(
"-fopenmp-offload-mandatory");
6806 if(Args.hasArg(options::OPT_fopenmp_force_usm))
6807CmdArgs.push_back(
"-fopenmp-force-usm");
6819Args.AddLastArg(CmdArgs, options::OPT_fopenmp_simd,
6820options::OPT_fno_openmp_simd);
6821Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
6822Args.addOptOutFlag(CmdArgs, options::OPT_fopenmp_extensions,
6823options::OPT_fno_openmp_extensions);
6828 if(Args.hasFlag(options::OPT_foffload_via_llvm,
6829options::OPT_fno_offload_via_llvm,
false)) {
6830CmdArgs.append({
"--offload-new-driver",
"-foffload-via-llvm"});
6831}
else if(Args.hasFlag(options::OPT_offload_new_driver,
6832options::OPT_no_offload_new_driver,
6834CmdArgs.push_back(
"--offload-new-driver");
6838XRay.
addArgs(TC, Args, CmdArgs, InputType);
6841Args.getAllArgValues(options::OPT_fprofile_list_EQ)) {
6843CmdArgs.push_back(Args.MakeArgString(
"-fprofile-list="+
Filename));
6845 D.Diag(clang::diag::err_drv_no_such_file) <<
Filename;
6848 if(Arg *A = Args.getLastArg(options::OPT_fpatchable_function_entry_EQ)) {
6849StringRef S0 = A->getValue(), S = S0;
6850 unsignedSize, Offset = 0;
6851 if(!Triple.isAArch64() && !Triple.isLoongArch() && !Triple.isRISCV() &&
6853!(!Triple.isOSAIX() && (Triple.getArch() == llvm::Triple::ppc ||
6854Triple.getArch() == llvm::Triple::ppc64)))
6855 D.Diag(diag::err_drv_unsupported_opt_for_target)
6856<< A->getAsString(Args) << TripleStr;
6857 else if(S.consumeInteger(10, Size) ||
6858(!S.empty() && (!S.consume_front(
",") ||
6859S.consumeInteger(10, Offset) || !S.empty())))
6860 D.Diag(diag::err_drv_invalid_argument_to_option)
6861<< S0 << A->getOption().getName();
6862 else if(Size < Offset)
6863 D.Diag(diag::err_drv_unsupported_fpatchable_function_entry_argument);
6865CmdArgs.push_back(Args.MakeArgString(A->getSpelling() + Twine(Size)));
6866CmdArgs.push_back(Args.MakeArgString(
6867 "-fpatchable-function-entry-offset="+ Twine(Offset)));
6871Args.AddLastArg(CmdArgs, options::OPT_fms_hotpatch);
6874Args.AddLastArg(CmdArgs, options::OPT_pg);
6876llvm::Triple::ArchType Arch = TC.
getArch();
6877 if(Arg *A = Args.getLastArg(options::OPT_mfentry)) {
6878 if(Arch == llvm::Triple::systemz || TC.
getTriple().isX86())
6879A->render(Args, CmdArgs);
6881 D.Diag(diag::err_drv_unsupported_opt_for_target)
6882<< A->getAsString(Args) << TripleStr;
6884 if(Arg *A = Args.getLastArg(options::OPT_mnop_mcount)) {
6885 if(Arch == llvm::Triple::systemz)
6886A->render(Args, CmdArgs);
6888 D.Diag(diag::err_drv_unsupported_opt_for_target)
6889<< A->getAsString(Args) << TripleStr;
6891 if(Arg *A = Args.getLastArg(options::OPT_mrecord_mcount)) {
6892 if(Arch == llvm::Triple::systemz)
6893A->render(Args, CmdArgs);
6895 D.Diag(diag::err_drv_unsupported_opt_for_target)
6896<< A->getAsString(Args) << TripleStr;
6900 if(Arg *A = Args.getLastArgNoClaim(options::OPT_pg)) {
6902 D.Diag(diag::err_drv_unsupported_opt_for_target)
6903<< A->getAsString(Args) << TripleStr;
6906 if(Arg *A = Args.getLastArgNoClaim(options::OPT_p)) {
6908 D.Diag(diag::err_drv_unsupported_opt_for_target)
6909<< A->getAsString(Args) << TripleStr;
6912 if(Arg *A = Args.getLastArgNoClaim(options::OPT_p, options::OPT_pg)) {
6913 if(A->getOption().matches(options::OPT_p)) {
6915 if(TC.
getTriple().isOSAIX() && !Args.hasArgNoClaim(options::OPT_pg))
6916CmdArgs.push_back(
"-pg");
6922 for(
constArg *A : Args.filtered(options::OPT_b, options::OPT_K,
6923options::OPT_mxcoff_build_id_EQ)) {
6924 D.Diag(diag::err_drv_unsupported_opt_for_target)
6925<< A->getSpelling() << TripleStr;
6929 if(Args.getLastArg(options::OPT_fapple_kext) ||
6930(Args.hasArg(options::OPT_mkernel) &&
types::isCXX(InputType)))
6931CmdArgs.push_back(
"-fapple-kext");
6933Args.AddLastArg(CmdArgs, options::OPT_altivec_src_compat);
6934Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions_EQ);
6935Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
6936Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
6937Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
6938Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
6939Args.AddLastArg(CmdArgs, options::OPT_ftime_report_EQ);
6940Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
6941Args.AddLastArg(CmdArgs, options::OPT_malign_double);
6942Args.AddLastArg(CmdArgs, options::OPT_fno_temp_file);
6944 if(
const char*Name =
C.getTimeTraceFile(&JA)) {
6945CmdArgs.push_back(Args.MakeArgString(
"-ftime-trace="+ Twine(Name)));
6946Args.AddLastArg(CmdArgs, options::OPT_ftime_trace_granularity_EQ);
6947Args.AddLastArg(CmdArgs, options::OPT_ftime_trace_verbose);
6950 if(Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
6951CmdArgs.push_back(
"-ftrapv-handler");
6952CmdArgs.push_back(A->getValue());
6955Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
6961Args.AddLastArg(CmdArgs, options::OPT_ffinite_loops,
6962options::OPT_fno_finite_loops);
6964Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
6965Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
6966options::OPT_fno_unroll_loops);
6968Args.AddLastArg(CmdArgs, options::OPT_fstrict_flex_arrays_EQ);
6970Args.AddLastArg(CmdArgs, options::OPT_pthread);
6972Args.addOptInFlag(CmdArgs, options::OPT_mspeculative_load_hardening,
6973options::OPT_mno_speculative_load_hardening);
6979Args.AddLastArg(CmdArgs, options::OPT_fswift_async_fp_EQ);
6981Args.addOptInFlag(CmdArgs, options::OPT_mstackrealign,
6982options::OPT_mno_stackrealign);
6984 if(Args.hasArg(options::OPT_mstack_alignment)) {
6985StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
6986CmdArgs.push_back(Args.MakeArgString(
"-mstack-alignment="+ alignment));
6989 if(Args.hasArg(options::OPT_mstack_probe_size)) {
6990StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
6993CmdArgs.push_back(Args.MakeArgString(
"-mstack-probe-size="+ Size));
6995CmdArgs.push_back(
"-mstack-probe-size=0");
6998Args.addOptOutFlag(CmdArgs, options::OPT_mstack_arg_probe,
6999options::OPT_mno_stack_arg_probe);
7001 if(Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
7002options::OPT_mno_restrict_it)) {
7003 if(A->getOption().matches(options::OPT_mrestrict_it)) {
7004CmdArgs.push_back(
"-mllvm");
7005CmdArgs.push_back(
"-arm-restrict-it");
7007CmdArgs.push_back(
"-mllvm");
7008CmdArgs.push_back(
"-arm-default-it");
7022 if(Args.hasFlag(options::OPT_fhip_new_launch_api,
7023options::OPT_fno_hip_new_launch_api,
true))
7024CmdArgs.push_back(
"-fhip-new-launch-api");
7025Args.addOptInFlag(CmdArgs, options::OPT_fgpu_allow_device_init,
7026options::OPT_fno_gpu_allow_device_init);
7027Args.AddLastArg(CmdArgs, options::OPT_hipstdpar);
7028Args.AddLastArg(CmdArgs, options::OPT_hipstdpar_interpose_alloc);
7029Args.addOptInFlag(CmdArgs, options::OPT_fhip_kernel_arg_name,
7030options::OPT_fno_hip_kernel_arg_name);
7033 if(IsCuda || IsHIP) {
7035CmdArgs.push_back(
"-fgpu-rdc");
7036Args.addOptInFlag(CmdArgs, options::OPT_fgpu_defer_diag,
7037options::OPT_fno_gpu_defer_diag);
7038 if(Args.hasFlag(options::OPT_fgpu_exclude_wrong_side_overloads,
7039options::OPT_fno_gpu_exclude_wrong_side_overloads,
7041CmdArgs.push_back(
"-fgpu-exclude-wrong-side-overloads");
7042CmdArgs.push_back(
"-fgpu-defer-diag");
7047 if(Args.hasArg(options::OPT_nogpulib))
7048CmdArgs.push_back(
"-nogpulib");
7050 if(Arg *A = Args.getLastArg(options::OPT_fcf_protection_EQ)) {
7052Args.MakeArgString(Twine(
"-fcf-protection=") + A->getValue()));
7054 if(Arg *SA = Args.getLastArg(options::OPT_mcf_branch_label_scheme_EQ))
7055CmdArgs.push_back(Args.MakeArgString(Twine(
"-mcf-branch-label-scheme=") +
7059 if(Arg *A = Args.getLastArg(options::OPT_mfunction_return_EQ))
7061Args.MakeArgString(Twine(
"-mfunction-return=") + A->getValue()));
7063Args.AddLastArg(CmdArgs, options::OPT_mindirect_branch_cs_prefix);
7068 if(!(IsCudaDevice || IsHIPDevice)) {
7070 auto*PGOArg = Args.getLastArg(
7071options::OPT_fprofile_generate, options::OPT_fprofile_generate_EQ,
7072options::OPT_fcs_profile_generate,
7073options::OPT_fcs_profile_generate_EQ, options::OPT_fprofile_use,
7074options::OPT_fprofile_use_EQ);
7076 D.Diag(diag::err_drv_argument_not_allowed_with)
7077<<
"SampleUse with PGO options";
7079StringRef fname = A->getValue();
7080 if(!llvm::sys::fs::exists(fname))
7081 D.Diag(diag::err_drv_no_such_file) << fname;
7083A->render(Args, CmdArgs);
7085Args.AddLastArg(CmdArgs, options::OPT_fprofile_remapping_file_EQ);
7087 if(Args.hasFlag(options::OPT_fpseudo_probe_for_profiling,
7088options::OPT_fno_pseudo_probe_for_profiling,
false)) {
7089CmdArgs.push_back(
"-fpseudo-probe-for-profiling");
7092 if(Args.hasFlag(options::OPT_funique_internal_linkage_names,
7093options::OPT_fno_unique_internal_linkage_names,
true))
7094CmdArgs.push_back(
"-funique-internal-linkage-names");
7099Args.addOptOutFlag(CmdArgs, options::OPT_fassume_sane_operator_new,
7100options::OPT_fno_assume_sane_operator_new);
7102 if(Args.hasFlag(options::OPT_fapinotes, options::OPT_fno_apinotes,
false))
7103CmdArgs.push_back(
"-fapinotes");
7104 if(Args.hasFlag(options::OPT_fapinotes_modules,
7105options::OPT_fno_apinotes_modules,
false))
7106CmdArgs.push_back(
"-fapinotes-modules");
7107Args.AddLastArg(CmdArgs, options::OPT_fapinotes_swift_version);
7110 if(Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
7112(Args.hasArg(options::OPT_fgnu_runtime) &&
7113Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
7114!Args.hasArg(options::OPT_fno_blocks))) {
7115CmdArgs.push_back(
"-fblocks");
7118CmdArgs.push_back(
"-fblocks-runtime-optional");
7123CmdArgs.push_back(
"-fencode-extended-block-signature");
7125 if(Args.hasFlag(options::OPT_fcoro_aligned_allocation,
7126options::OPT_fno_coro_aligned_allocation,
false) &&
7128CmdArgs.push_back(
"-fcoro-aligned-allocation");
7130Args.AddLastArg(CmdArgs, options::OPT_fdouble_square_bracket_attributes,
7131options::OPT_fno_double_square_bracket_attributes);
7133Args.addOptOutFlag(CmdArgs, options::OPT_faccess_control,
7134options::OPT_fno_access_control);
7135Args.addOptOutFlag(CmdArgs, options::OPT_felide_constructors,
7136options::OPT_fno_elide_constructors);
7142CmdArgs.push_back(
"-fno-rtti");
7145 if(Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
7146TC.
getArch() == llvm::Triple::hexagon || Triple.isOSzOS()))
7147CmdArgs.push_back(
"-fshort-enums");
7153options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
7154!RawTriple.isOSAIX() && !RawTriple.isOSWindows() &&
7155((RawTriple.getVendor() != llvm::Triple::MipsTechnologies) ||
7156RawTriple.hasEnvironment())) ||
7158CmdArgs.push_back(
"-fno-use-cxa-atexit");
7160 if(Args.hasFlag(options::OPT_fregister_global_dtors_with_atexit,
7161options::OPT_fno_register_global_dtors_with_atexit,
7162RawTriple.isOSDarwin() && !KernelOrKext))
7163CmdArgs.push_back(
"-fregister-global-dtors-with-atexit");
7165Args.addOptInFlag(CmdArgs, options::OPT_fuse_line_directives,
7166options::OPT_fno_use_line_directives);
7169 if(Args.hasFlag(options::OPT_fminimize_whitespace,
7170options::OPT_fno_minimize_whitespace,
false)) {
7171 types::IDInputType = Inputs[0].getType();
7172 if(!isDerivedFromC(InputType))
7173 D.Diag(diag::err_drv_opt_unsupported_input_type)
7175CmdArgs.push_back(
"-fminimize-whitespace");
7179 if(Args.hasFlag(options::OPT_fkeep_system_includes,
7180options::OPT_fno_keep_system_includes,
false)) {
7181 types::IDInputType = Inputs[0].getType();
7182 if(!isDerivedFromC(InputType))
7183 D.Diag(diag::err_drv_opt_unsupported_input_type)
7185CmdArgs.push_back(
"-fkeep-system-includes");
7189 if(Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
7190IsWindowsMSVC || IsUEFI))
7191CmdArgs.push_back(
"-fms-extensions");
7194 boolIsMSVCCompat = Args.hasFlag(
7195options::OPT_fms_compatibility, options::OPT_fno_ms_compatibility,
7196(IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
7197options::OPT_fno_ms_extensions,
true)));
7199CmdArgs.push_back(
"-fms-compatibility");
7201Args.hasArg(options::OPT_fms_define_stdc))
7202CmdArgs.push_back(
"-fms-define-stdc");
7205 if(Triple.isWindowsMSVCEnvironment() && !
D.IsCLMode() &&
7206Args.hasArg(options::OPT_fms_runtime_lib_EQ))
7210VersionTuple GNUCVer;
7211 if(Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
7214StringRef Val = A->getValue();
7215Val = Val.empty() ?
"0": Val;
7216 bool Invalid= GNUCVer.tryParse(Val);
7217 unsignedMinor = GNUCVer.getMinor().value_or(0);
7218 unsignedPatch = GNUCVer.getSubminor().value_or(0);
7219 if(
Invalid|| GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
7220 D.Diag(diag::err_drv_invalid_value)
7221<< A->getAsString(Args) << A->getValue();
7223}
else if(!IsMSVCCompat) {
7225GNUCVer = VersionTuple(4, 2, 1);
7227 if(!GNUCVer.empty()) {
7229Args.MakeArgString(
"-fgnuc-version="+ GNUCVer.getAsString()));
7235Args.MakeArgString(
"-fms-compatibility-version="+ MSVT.getAsString()));
7237 boolIsMSVC2015Compatible = MSVT.getMajor() >= 19;
7238 if(ImplyVCPPCVer) {
7239StringRef LanguageStandard;
7240 if(
constArg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) {
7242LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue())
7243.Case(
"c11",
"-std=c11")
7244.Case(
"c17",
"-std=c17")
7246 if(LanguageStandard.empty())
7247 D.Diag(clang::diag::warn_drv_unused_argument)
7248<< StdArg->getAsString(Args);
7250CmdArgs.push_back(LanguageStandard.data());
7252 if(ImplyVCPPCXXVer) {
7253StringRef LanguageStandard;
7254 if(
constArg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) {
7256LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue())
7257.Case(
"c++14",
"-std=c++14")
7258.Case(
"c++17",
"-std=c++17")
7259.Case(
"c++20",
"-std=c++20")
7261.Case(
"c++23preview",
"-std=c++23")
7262.Case(
"c++latest",
"-std=c++26")
7264 if(LanguageStandard.empty())
7265 D.Diag(clang::diag::warn_drv_unused_argument)
7266<< StdArg->getAsString(Args);
7269 if(LanguageStandard.empty()) {
7270 if(IsMSVC2015Compatible)
7271LanguageStandard =
"-std=c++14";
7273LanguageStandard =
"-std=c++11";
7276CmdArgs.push_back(LanguageStandard.data());
7279Args.addOptInFlag(CmdArgs, options::OPT_fborland_extensions,
7280options::OPT_fno_borland_extensions);
7283 if(Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
7285CmdArgs.push_back(
"-fdeclspec");
7286 else if(Args.hasArg(options::OPT_fno_declspec))
7287CmdArgs.push_back(
"-fno-declspec");
7291 if(!Args.hasFlag(options::OPT_fthreadsafe_statics,
7292options::OPT_fno_threadsafe_statics,
7294(!IsWindowsMSVC || IsMSVC2015Compatible)))
7295CmdArgs.push_back(
"-fno-threadsafe-statics");
7297 if(!Args.hasFlag(options::OPT_fms_tls_guards, options::OPT_fno_ms_tls_guards,
7299CmdArgs.push_back(
"-fno-ms-tls-guards");
7302 if(!Args.hasFlag(options::OPT_fassumptions, options::OPT_fno_assumptions,
7304CmdArgs.push_back(
"-fno-assumptions");
7308Args.AddLastArg(CmdArgs, options::OPT_fgnu_keywords,
7309options::OPT_fno_gnu_keywords);
7311Args.addOptInFlag(CmdArgs, options::OPT_fgnu89_inline,
7312options::OPT_fno_gnu89_inline);
7314 constArg *InlineArg = Args.getLastArg(options::OPT_finline_functions,
7315options::OPT_finline_hint_functions,
7316options::OPT_fno_inline_functions);
7317 if(Arg *A = Args.getLastArg(options::OPT_finline, options::OPT_fno_inline)) {
7318 if(A->getOption().matches(options::OPT_fno_inline))
7319A->render(Args, CmdArgs);
7320}
else if(InlineArg) {
7321InlineArg->render(Args, CmdArgs);
7324Args.AddLastArg(CmdArgs, options::OPT_finline_max_stacksize_EQ);
7329(
Std->containsValue(
"c++2a") ||
Std->containsValue(
"gnu++2a") ||
7330 Std->containsValue(
"c++20") ||
Std->containsValue(
"gnu++20") ||
7331 Std->containsValue(
"c++2b") ||
Std->containsValue(
"gnu++2b") ||
7332 Std->containsValue(
"c++23") ||
Std->containsValue(
"gnu++23") ||
7333 Std->containsValue(
"c++2c") ||
Std->containsValue(
"gnu++2c") ||
7334 Std->containsValue(
"c++26") ||
Std->containsValue(
"gnu++26") ||
7335 Std->containsValue(
"c++latest") ||
Std->containsValue(
"gnu++latest"));
7350 if(Args.hasFlag(options::OPT_fdelayed_template_parsing,
7351options::OPT_fno_delayed_template_parsing,
7352IsWindowsMSVC && !HaveCxx20)) {
7354 D.Diag(clang::diag::warn_drv_delayed_template_parsing_after_cxx20);
7356CmdArgs.push_back(
"-fdelayed-template-parsing");
7359 if(Args.hasFlag(options::OPT_fpch_validate_input_files_content,
7360options::OPT_fno_pch_validate_input_files_content,
false))
7361CmdArgs.push_back(
"-fvalidate-ast-input-files-content");
7362 if(Args.hasFlag(options::OPT_fpch_instantiate_templates,
7363options::OPT_fno_pch_instantiate_templates,
false))
7364CmdArgs.push_back(
"-fpch-instantiate-templates");
7365 if(Args.hasFlag(options::OPT_fpch_codegen, options::OPT_fno_pch_codegen,
7367CmdArgs.push_back(
"-fmodules-codegen");
7368 if(Args.hasFlag(options::OPT_fpch_debuginfo, options::OPT_fno_pch_debuginfo,
7370CmdArgs.push_back(
"-fmodules-debuginfo");
7372 ObjCRuntimeRuntime = AddObjCRuntimeArgs(Args, Inputs, CmdArgs, rewriteKind);
7377Args.hasFlag(options::OPT_fobjc_encode_cxx_class_template_spec,
7378options::OPT_fno_objc_encode_cxx_class_template_spec,
7380CmdArgs.push_back(
"-fobjc-encode-cxx-class-template-spec");
7382 if(Args.hasFlag(options::OPT_fapplication_extension,
7383options::OPT_fno_application_extension,
false))
7384CmdArgs.push_back(
"-fapplication-extension");
7388 if(!
C.getDriver().IsCLMode())
7389EH =
addExceptionArgs(Args, InputType, TC, KernelOrKext, Runtime, CmdArgs);
7392Arg *A = Args.getLastArg(
7393options::OPT_fsjlj_exceptions, options::OPT_fseh_exceptions,
7394options::OPT_fdwarf_exceptions, options::OPT_fwasm_exceptions);
7396 constOption &Opt = A->getOption();
7397 if(Opt.matches(options::OPT_fsjlj_exceptions))
7398CmdArgs.push_back(
"-exception-model=sjlj");
7399 if(Opt.matches(options::OPT_fseh_exceptions))
7400CmdArgs.push_back(
"-exception-model=seh");
7401 if(Opt.matches(options::OPT_fdwarf_exceptions))
7402CmdArgs.push_back(
"-exception-model=dwarf");
7403 if(Opt.matches(options::OPT_fwasm_exceptions))
7404CmdArgs.push_back(
"-exception-model=wasm");
7409 casellvm::ExceptionHandling::DwarfCFI:
7410CmdArgs.push_back(
"-exception-model=dwarf");
7412 casellvm::ExceptionHandling::SjLj:
7413CmdArgs.push_back(
"-exception-model=sjlj");
7415 casellvm::ExceptionHandling::WinEH:
7416CmdArgs.push_back(
"-exception-model=seh");
7422Args.addOptOutFlag(CmdArgs, options::OPT_fassume_sane_operator_new,
7423options::OPT_fno_assume_sane_operator_new);
7426Args.addOptOutFlag(CmdArgs, options::OPT_fassume_unique_vtables,
7427options::OPT_fno_assume_unique_vtables);
7431Args.addLastArg(CmdArgs, options::OPT_fsized_deallocation,
7432options::OPT_fno_sized_deallocation);
7436 if(Arg *A = Args.getLastArg(options::OPT_faligned_allocation,
7437options::OPT_fno_aligned_allocation,
7438options::OPT_faligned_new_EQ)) {
7439 if(A->getOption().matches(options::OPT_fno_aligned_allocation))
7440CmdArgs.push_back(
"-fno-aligned-allocation");
7442CmdArgs.push_back(
"-faligned-allocation");
7447 if(Arg *A = Args.getLastArg(options::OPT_fnew_alignment_EQ,
7448options::OPT_faligned_new_EQ))
7450Args.MakeArgString(Twine(
"-fnew-alignment=") + A->getValue()));
7454 if(!Args.hasFlag(options::OPT_fconstant_cfstrings,
7455options::OPT_fno_constant_cfstrings,
true) ||
7456!Args.hasFlag(options::OPT_mconstant_cfstrings,
7457options::OPT_mno_constant_cfstrings,
true))
7458CmdArgs.push_back(
"-fno-constant-cfstrings");
7460Args.addOptInFlag(CmdArgs, options::OPT_fpascal_strings,
7461options::OPT_fno_pascal_strings);
7465 if(Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
7466std::string PackStructStr =
"-fpack-struct=";
7467PackStructStr += A->getValue();
7468CmdArgs.push_back(Args.MakeArgString(PackStructStr));
7469}
else if(Args.hasFlag(options::OPT_fpack_struct,
7470options::OPT_fno_pack_struct,
false)) {
7471CmdArgs.push_back(
"-fpack-struct=1");
7475 boolSkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
7476 if(Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
7477 if(!SkipMaxTypeAlign) {
7478std::string MaxTypeAlignStr =
"-fmax-type-align=";
7479MaxTypeAlignStr += A->getValue();
7480CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
7482}
else if(RawTriple.isOSDarwin()) {
7483 if(!SkipMaxTypeAlign) {
7484std::string MaxTypeAlignStr =
"-fmax-type-align=16";
7485CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
7489 if(!Args.hasFlag(options::OPT_Qy, options::OPT_Qn,
true))
7490CmdArgs.push_back(
"-Qn");
7493Args.addOptInFlag(CmdArgs, options::OPT_fcommon, options::OPT_fno_common);
7497 if(!Args.hasFlag(options::OPT_fsigned_bitfields,
7498options::OPT_funsigned_bitfields,
true))
7499 D.Diag(diag::warn_drv_clang_unsupported)
7500<< Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
7503 if(!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope,
true))
7504 D.Diag(diag::err_drv_clang_unsupported)
7505<< Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
7508 if(Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
7509StringRef value = inputCharset->getValue();
7510 if(!value.equals_insensitive(
"utf-8"))
7511 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
7516 if(Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7517StringRef value = execCharset->getValue();
7518 if(!value.equals_insensitive(
"utf-8"))
7519 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
7525Args.addOptInFlag(CmdArgs, options::OPT_fasm_blocks,
7526options::OPT_fno_asm_blocks);
7528Args.addOptOutFlag(CmdArgs, options::OPT_fgnu_inline_asm,
7529options::OPT_fno_gnu_inline_asm);
7535OptSpecifier VectorizeAliasOption =
7536EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
7537 if(Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
7538options::OPT_fno_vectorize, EnableVec))
7539CmdArgs.push_back(
"-vectorize-loops");
7543OptSpecifier SLPVectAliasOption =
7544EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
7545 if(Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
7546options::OPT_fno_slp_vectorize, EnableSLPVec))
7547CmdArgs.push_back(
"-vectorize-slp");
7551Args.AddLastArg(CmdArgs, options::OPT_fshow_overloads_EQ);
7552Args.AddLastArg(CmdArgs,
7553options::OPT_fsanitize_undefined_strip_path_components_EQ);
7557 if(Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
7558options::OPT_fno_dollars_in_identifiers)) {
7559 if(A->getOption().matches(options::OPT_fdollars_in_identifiers))
7560CmdArgs.push_back(
"-fdollars-in-identifiers");
7562CmdArgs.push_back(
"-fno-dollars-in-identifiers");
7565Args.addOptInFlag(CmdArgs, options::OPT_fapple_pragma_pack,
7566options::OPT_fno_apple_pragma_pack);
7572 boolRewriteImports = Args.hasFlag(options::OPT_frewrite_imports,
7573options::OPT_fno_rewrite_imports,
false);
7575CmdArgs.push_back(
"-frewrite-imports");
7577Args.addOptInFlag(CmdArgs, options::OPT_fdirectives_only,
7578options::OPT_fno_directives_only);
7584 if(Args.hasFlag(options::OPT_frewrite_includes,
7585options::OPT_fno_rewrite_includes,
false) ||
7586(
C.isForDiagnostics() && !HaveModules))
7587CmdArgs.push_back(
"-frewrite-includes");
7589 if(Args.hasFlag(options::OPT_fzos_extensions,
7590options::OPT_fno_zos_extensions,
false))
7591CmdArgs.push_back(
"-fzos-extensions");
7592 else if(Args.hasArg(options::OPT_fno_zos_extensions))
7593CmdArgs.push_back(
"-fno-zos-extensions");
7596 if(Arg *A = Args.getLastArg(options::OPT_traditional,
7597options::OPT_traditional_cpp)) {
7598 if(isa<PreprocessJobAction>(JA))
7599CmdArgs.push_back(
"-traditional-cpp");
7601 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
7604Args.AddLastArg(CmdArgs, options::OPT_dM);
7605Args.AddLastArg(CmdArgs, options::OPT_dD);
7606Args.AddLastArg(CmdArgs, options::OPT_dI);
7608Args.AddLastArg(CmdArgs, options::OPT_fmax_tokens_EQ);
7611 if(Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
7612CmdArgs.push_back(
"-serialize-diagnostic-file");
7613CmdArgs.push_back(Args.MakeArgString(A->getValue()));
7616 if(Args.hasArg(options::OPT_fretain_comments_from_system_headers))
7617CmdArgs.push_back(
"-fretain-comments-from-system-headers");
7619Args.AddLastArg(CmdArgs, options::OPT_fextend_variable_liveness_EQ);
7622Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
7624Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
7627 for(
constArg *A : Args.filtered(options::OPT_fplugin_EQ)) {
7628CmdArgs.push_back(
"-load");
7629CmdArgs.push_back(A->getValue());
7641 for(
constArg *A : Args.filtered(options::OPT_fplugin_arg)) {
7642 autoArgValue = StringRef(A->getValue());
7643 autoFirstDashIndex = ArgValue.find(
'-');
7644StringRef PluginName = ArgValue.substr(0, FirstDashIndex);
7645StringRef Arg = ArgValue.substr(FirstDashIndex + 1);
7648 if(FirstDashIndex == StringRef::npos || Arg.empty()) {
7649 if(PluginName.empty()) {
7650 D.Diag(diag::warn_drv_missing_plugin_name) << A->getAsString(Args);
7652 D.Diag(diag::warn_drv_missing_plugin_arg)
7653<< PluginName << A->getAsString(Args);
7658CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-arg-") + PluginName));
7659CmdArgs.push_back(Args.MakeArgString(Arg));
7663 for(
constArg *A : Args.filtered(options::OPT_fpass_plugin_EQ)) {
7665Args.MakeArgString(Twine(
"-fpass-plugin=") + A->getValue()));
7670 for(
constArg *A : Args.filtered(options::OPT_vfsoverlay)) {
7671CmdArgs.push_back(
"--vfsoverlay");
7672CmdArgs.push_back(A->getValue());
7676Args.addOptInFlag(CmdArgs, options::OPT_fsafe_buffer_usage_suggestions,
7677options::OPT_fno_safe_buffer_usage_suggestions);
7679Args.addOptInFlag(CmdArgs, options::OPT_fexperimental_late_parse_attributes,
7680options::OPT_fno_experimental_late_parse_attributes);
7684 if(!StatsFile.empty()) {
7685CmdArgs.push_back(Args.MakeArgString(Twine(
"-stats-file=") + StatsFile));
7686 if(
D.CCPrintInternalStats)
7687CmdArgs.push_back(
"-stats-file-append");
7692 for(
autoArg : Args.filtered(options::OPT_Xclang)) {
7696 if(
C.getDriver().isSaveTempsEnabled() &&
7697!isa<PreprocessJobAction>(JA)) {
7698 if(StringRef(Arg->getValue()) ==
"-finclude-default-header")
7701CmdArgs.push_back(Arg->getValue());
7703 for(
constArg *A : Args.filtered(options::OPT_mllvm)) {
7709 if(StringRef(A->getValue(0)) ==
"-disable-llvm-optzns") {
7710CmdArgs.push_back(
"-disable-llvm-optzns");
7712A->render(Args, CmdArgs);
7718SanitizeArgs.addArgs(TC, Args, CmdArgs, InputType);
7728 if((
C.getDriver().isSaveTempsEnabled() ||
7730!(
C.getDriver().embedBitcodeInObject() && !IsUsingLTO) &&
7731isa<CompileJobAction>(JA))
7732CmdArgs.push_back(
"-disable-llvm-passes");
7734Args.AddAllArgs(CmdArgs, options::OPT_undef);
7736 const char*Exec =
D.getClangProgramPath();
7743 autoGRecordSwitches =
false;
7744 autoFRecordSwitches =
false;
7748CmdArgs.push_back(
"-dwarf-debug-flags");
7749CmdArgs.push_back(FlagsArgString);
7751 if(FRecordSwitches) {
7752CmdArgs.push_back(
"-record-command-line");
7753CmdArgs.push_back(FlagsArgString);
7760 if((IsCuda || IsHIP) && CudaDeviceInput) {
7761CmdArgs.push_back(
"-fcuda-include-gpubinary");
7762CmdArgs.push_back(CudaDeviceInput->
getFilename());
7763}
else if(!HostOffloadingInputs.empty()) {
7764 if((IsCuda || IsHIP) && !IsRDCMode) {
7765assert(HostOffloadingInputs.size() == 1 &&
"Only one input expected");
7766CmdArgs.push_back(
"-fcuda-include-gpubinary");
7767CmdArgs.push_back(HostOffloadingInputs.front().getFilename());
7769 for(
const InputInfoInput : HostOffloadingInputs)
7770CmdArgs.push_back(Args.MakeArgString(
"-fembed-offload-object="+
7776 if(Args.hasFlag(options::OPT_fcuda_short_ptr,
7777options::OPT_fno_cuda_short_ptr,
false))
7778CmdArgs.push_back(
"-fcuda-short-ptr");
7781 if(IsCuda || IsHIP) {
7783 const Action*SourceAction = &JA;
7785assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
7786SourceAction = SourceAction->
getInputs()[0];
7788 autoCUID = cast<InputAction>(SourceAction)->getId();
7790CmdArgs.push_back(Args.MakeArgString(Twine(
"-cuid=") + Twine(CUID)));
7794 boolUseApproxTranscendentals = Args.hasFlag(
7795options::OPT_ffast_math, options::OPT_fno_fast_math,
false);
7796 if(Args.hasFlag(options::OPT_fgpu_approx_transcendentals,
7797options::OPT_fno_gpu_approx_transcendentals,
7798UseApproxTranscendentals))
7799CmdArgs.push_back(
"-fgpu-approx-transcendentals");
7801Args.claimAllArgs(options::OPT_fgpu_approx_transcendentals,
7802options::OPT_fno_gpu_approx_transcendentals);
7806CmdArgs.push_back(
"-fcuda-allow-variadic-functions");
7807Args.AddLastArg(CmdArgs, options::OPT_fgpu_default_stream_EQ);
7810Args.AddAllArgs(CmdArgs,
7811options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ);
7813Args.AddLastArg(CmdArgs, options::OPT_foffload_uniform_block,
7814options::OPT_fno_offload_uniform_block);
7816Args.AddLastArg(CmdArgs, options::OPT_foffload_implicit_host_device_templates,
7817options::OPT_fno_offload_implicit_host_device_templates);
7819 if(IsCudaDevice || IsHIPDevice) {
7820StringRef InlineThresh =
7821Args.getLastArgValue(options::OPT_fgpu_inline_threshold_EQ);
7822 if(!InlineThresh.empty()) {
7823std::string ArgStr =
7824std::string(
"-inline-threshold=") + InlineThresh.str();
7825CmdArgs.append({
"-mllvm", Args.MakeArgStringRef(ArgStr)});
7830Args.addOptOutFlag(CmdArgs,
7831options::OPT_fhip_fp32_correctly_rounded_divide_sqrt,
7832options::OPT_fno_hip_fp32_correctly_rounded_divide_sqrt);
7839 if(IsOpenMPDevice) {
7840CmdArgs.push_back(
"-fopenmp-is-target-device");
7842 if(Args.hasArg(options::OPT_foffload_via_llvm))
7843CmdArgs.push_back(
"-fcuda-is-device");
7845 if(OpenMPDeviceInput) {
7846CmdArgs.push_back(
"-fopenmp-host-ir-file-path");
7847CmdArgs.push_back(Args.MakeArgString(OpenMPDeviceInput->
getFilename()));
7851 if(Triple.isAMDGPU()) {
7854Args.addOptInFlag(CmdArgs, options::OPT_munsafe_fp_atomics,
7855options::OPT_mno_unsafe_fp_atomics);
7856Args.addOptOutFlag(CmdArgs, options::OPT_mamdgpu_ieee,
7857options::OPT_mno_amdgpu_ieee);
7862 boolVirtualFunctionElimination =
7863Args.hasFlag(options::OPT_fvirtual_function_elimination,
7864options::OPT_fno_virtual_function_elimination,
false);
7865 if(VirtualFunctionElimination) {
7869 D.Diag(diag::err_drv_argument_only_allowed_with)
7870<<
"-fvirtual-function-elimination" 7873CmdArgs.push_back(
"-fvirtual-function-elimination");
7877 boolWholeProgramVTables = Args.hasFlag(
7878options::OPT_fwhole_program_vtables,
7879options::OPT_fno_whole_program_vtables, VirtualFunctionElimination);
7880 if(VirtualFunctionElimination && !WholeProgramVTables) {
7881 D.Diag(diag::err_drv_argument_not_allowed_with)
7882<<
"-fno-whole-program-vtables" 7883<<
"-fvirtual-function-elimination";
7886 if(WholeProgramVTables) {
7898IsDeviceOffloadAction ?
D.getLTOMode() :
D.getOffloadLTOMode();
7899 autoOtherIsUsingLTO = OtherLTOMode !=
LTOK_None;
7901 if((!IsUsingLTO && !OtherIsUsingLTO) ||
7902(IsPS4 && !UnifiedLTO && (
D.getLTOMode() !=
LTOK_Full)))
7903 D.Diag(diag::err_drv_argument_only_allowed_with)
7904<<
"-fwhole-program-vtables" 7905<< ((IsPS4 && !UnifiedLTO) ?
"-flto=full":
"-flto");
7909CmdArgs.push_back(
"-fwhole-program-vtables");
7912 boolDefaultsSplitLTOUnit =
7913((WholeProgramVTables || SanitizeArgs.needsLTO()) &&
7915(!Triple.isPS4() && UnifiedLTO);
7917Args.hasFlag(options::OPT_fsplit_lto_unit,
7918options::OPT_fno_split_lto_unit, DefaultsSplitLTOUnit);
7919 if(SanitizeArgs.needsLTO() && !SplitLTOUnit)
7920 D.Diag(diag::err_drv_argument_not_allowed_with) <<
"-fno-split-lto-unit" 7921<<
"-fsanitize=cfi";
7923CmdArgs.push_back(
"-fsplit-lto-unit");
7925 if(Arg *A = Args.getLastArg(options::OPT_ffat_lto_objects,
7926options::OPT_fno_fat_lto_objects)) {
7927 if(IsUsingLTO && A->getOption().matches(options::OPT_ffat_lto_objects)) {
7929 if(!Triple.isOSBinFormatELF()) {
7930 D.Diag(diag::err_drv_unsupported_opt_for_target)
7933CmdArgs.push_back(Args.MakeArgString(
7934Twine(
"-flto=") + (LTOMode ==
LTOK_Thin?
"thin":
"full")));
7935CmdArgs.push_back(
"-flto-unit");
7936CmdArgs.push_back(
"-ffat-lto-objects");
7937A->render(Args, CmdArgs);
7941 if(Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
7942options::OPT_fno_global_isel)) {
7943CmdArgs.push_back(
"-mllvm");
7944 if(A->getOption().matches(options::OPT_fglobal_isel)) {
7945CmdArgs.push_back(
"-global-isel=1");
7950 boolIsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
7951 boolIsOptLevelSupported =
false;
7953Arg *A = Args.getLastArg(options::OPT_O_Group);
7954 if(Triple.getArch() == llvm::Triple::aarch64) {
7955 if(!A || A->getOption().matches(options::OPT_O0))
7956IsOptLevelSupported =
true;
7958 if(!IsArchSupported || !IsOptLevelSupported) {
7959CmdArgs.push_back(
"-mllvm");
7960CmdArgs.push_back(
"-global-isel-abort=2");
7962 if(!IsArchSupported)
7963 D.Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
7965 D.Diag(diag::warn_drv_global_isel_incomplete_opt);
7968CmdArgs.push_back(
"-global-isel=0");
7973Args.getLastArg(options::OPT_forder_file_instrumentation)) {
7974 D.Diag(diag::warn_drv_deprecated_arg)
7975<< A->getAsString(Args) <<
true 7976<<
"-ftemporal-profile";
7977CmdArgs.push_back(
"-forder-file-instrumentation");
7982CmdArgs.push_back(
"-mllvm");
7983CmdArgs.push_back(
"-enable-order-file-instrumentation");
7987 if(Arg *A = Args.getLastArg(options::OPT_fforce_enable_int128,
7988options::OPT_fno_force_enable_int128)) {
7989 if(A->getOption().matches(options::OPT_fforce_enable_int128))
7990CmdArgs.push_back(
"-fforce-enable-int128");
7993Args.addOptInFlag(CmdArgs, options::OPT_fkeep_static_consts,
7994options::OPT_fno_keep_static_consts);
7995Args.addOptInFlag(CmdArgs, options::OPT_fkeep_persistent_storage_variables,
7996options::OPT_fno_keep_persistent_storage_variables);
7997Args.addOptInFlag(CmdArgs, options::OPT_fcomplete_member_pointers,
7998options::OPT_fno_complete_member_pointers);
7999 if(Arg *A = Args.getLastArg(options::OPT_cxx_static_destructors_EQ))
8000A->render(Args, CmdArgs);
8006 if(Triple.isAArch64() &&
8007(Args.hasArg(options::OPT_mno_fmv) ||
8008(Triple.isAndroid() && Triple.isAndroidVersionLT(23)) ||
8011CmdArgs.push_back(
"-target-feature");
8012CmdArgs.push_back(
"-fmv");
8015 if(Args.hasFlag(options::OPT_faddrsig, options::OPT_fno_addrsig,
8017TC.
getTriple().isOSBinFormatCOFF()) &&
8022CmdArgs.push_back(
"-faddrsig");
8024 if((Triple.isOSBinFormatELF() || Triple.isOSBinFormatMachO()) &&
8025(EH || UnwindTables || AsyncUnwindTables ||
8026DebugInfoKind != llvm::codegenoptions::NoDebugInfo))
8027CmdArgs.push_back(
"-D__GCC_HAVE_DWARF2_CFI_ASM=1");
8029 if(Arg *A = Args.getLastArg(options::OPT_fsymbol_partition_EQ)) {
8030std::string Str = A->getAsString(Args);
8031 if(!TC.
getTriple().isOSBinFormatELF())
8032 D.Diag(diag::err_drv_unsupported_opt_for_target)
8034CmdArgs.push_back(Args.MakeArgString(Str));
8039 if(Output.
getType() == types::TY_Dependencies) {
8042 if(Output.
getType() == clang::driver::types::TY_IFS_CPP ||
8043Output.
getType() == clang::driver::types::TY_IFS) {
8045llvm::sys::path::replace_extension(OutputFilename,
"ifs");
8046CmdArgs.push_back(
"-o");
8047CmdArgs.push_back(Args.MakeArgString(OutputFilename));
8049CmdArgs.push_back(
"-o");
8053assert(Output.
isNothing() &&
"Invalid output.");
8060FrontendInputs = ExtractAPIInputs;
8062FrontendInputs = {};
8064 for(
const InputInfo&Input : FrontendInputs) {
8068Input.
getInputArg().renderAsInput(Args, CmdArgs);
8071 if(
D.CC1Main && !
D.CCGenDiagnostics) {
8073 C.addCommand(std::make_unique<CC1Command>(
8075Output,
D.getPrependArg()));
8077 C.addCommand(std::make_unique<Command>(
8079Output,
D.getPrependArg()));
8083 if(Output.
getType() == types::TY_Object &&
8084Args.hasFlag(options::OPT__SLASH_showFilenames,
8085options::OPT__SLASH_showFilenames_,
false)) {
8086 C.getJobs().getJobs().back()->PrintInputFilenames =
true;
8089 if(Arg *A = Args.getLastArg(options::OPT_pg))
8091!Args.hasArg(options::OPT_mfentry))
8092 D.Diag(diag::err_drv_argument_not_allowed_with) <<
"-fomit-frame-pointer" 8093<< A->getAsString(Args);
8099Args.ClaimAllArgs(options::OPT_fpch_preprocess);
8103Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
8104Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
8107Args.ClaimAllArgs(options::OPT_emit_llvm);
8114:
Tool(
"clang",
"clang frontend", TC), HasBackend(HasIntegratedBackend) {}
8121ObjCRuntimeClang::AddObjCRuntimeArgs(
constArgList &args,
8123ArgStringList &cmdArgs,
8124RewriteKind rewriteKind)
const{
8127args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
8128options::OPT_fobjc_runtime_EQ);
8133runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
8135StringRef value = runtimeArg->getValue();
8141(runtime.
getVersion() >= VersionTuple(2, 0)))
8142 if(!
getToolChain().getTriple().isOSBinFormatELF() &&
8145diag::err_drv_gnustep_objc_runtime_incompatible_binary)
8149runtimeArg->render(args, cmdArgs);
8158 unsignedobjcABIVersion = 1;
8160 if(Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
8161StringRef value = abiArg->getValue();
8164 else if(value ==
"2")
8166 else if(value ==
"3")
8172 boolnonFragileABIIsDefault =
8173(rewriteKind == RK_NonFragile ||
8174(rewriteKind == RK_None &&
8176 if(args.hasFlag(options::OPT_fobjc_nonfragile_abi,
8177options::OPT_fno_objc_nonfragile_abi,
8178nonFragileABIIsDefault)) {
8180#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO 8181 unsignednonFragileABIVersion = 1;
8183 unsignednonFragileABIVersion = 2;
8187args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
8188StringRef value = abiArg->getValue();
8190nonFragileABIVersion = 1;
8191 else if(value ==
"2")
8192nonFragileABIVersion = 2;
8198objcABIVersion = 1 + nonFragileABIVersion;
8206 boolisNonFragile = objcABIVersion != 1;
8212 switch(rewriteKind) {
8225}
else if(runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
8237assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
8246 if(llvm::any_of(inputs, [](
const InputInfo&input) {
8250args.MakeArgString(
"-fobjc-runtime="+ runtime.
getAsString()));
8255 boolHaveDash = (I + 1 < EH.size() && EH[I + 1] ==
'-');
8262 boolSynch =
false;
8263 boolAsynch =
false;
8264 boolNoUnwindC =
false;
8276 boolisWindowsMSVC) {
8279std::vector<std::string> EHArgs =
8280Args.getAllArgValues(options::OPT__SLASH_EH);
8281 for(
const auto&EHVal : EHArgs) {
8282 for(
size_tI = 0,
E= EHVal.size(); I !=
E; ++I) {
8288 if(!isWindowsMSVC) {
8290 D.Diag(clang::diag::warn_drv_unused_argument) <<
"/EHa"<< EHVal;
8307 D.Diag(clang::diag::err_drv_invalid_value) <<
"/EH"<< EHVal;
8313 if(EHArgs.empty() &&
8314Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
8317EH.NoUnwindC =
true;
8320 if(Args.hasArg(options::OPT__SLASH_kernel)) {
8322EH.NoUnwindC =
false;
8329voidClang::AddClangCLArgs(
constArgList &Args,
types::IDInputType,
8330ArgStringList &CmdArgs)
const{
8335 if(Arg *ShowIncludes =
8336Args.getLastArg(options::OPT__SLASH_showIncludes,
8337options::OPT__SLASH_showIncludes_user)) {
8338CmdArgs.push_back(
"--show-includes");
8339 if(ShowIncludes->getOption().matches(options::OPT__SLASH_showIncludes))
8340CmdArgs.push_back(
"-sys-header-deps");
8344 if(Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8346CmdArgs.push_back(
"-fno-rtti-data");
8350 if(!isNVPTX && Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_,
8352CmdArgs.push_back(
"-stack-protector");
8360 if(!isNVPTX && (EH.Synch || EH.Asynch)) {
8362CmdArgs.push_back(
"-fcxx-exceptions");
8363CmdArgs.push_back(
"-fexceptions");
8365CmdArgs.push_back(
"-fasync-exceptions");
8367 if(
types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
8368CmdArgs.push_back(
"-fexternc-nounwind");
8371 if(Args.hasArg(options::OPT__SLASH_EP)) {
8372CmdArgs.push_back(
"-E");
8373CmdArgs.push_back(
"-P");
8376 if(Args.hasFlag(options::OPT__SLASH_Zc_dllexportInlines_,
8377options::OPT__SLASH_Zc_dllexportInlines,
8379CmdArgs.push_back(
"-fno-dllexport-inlines");
8382 if(Args.hasFlag(options::OPT__SLASH_Zc_wchar_t_,
8383options::OPT__SLASH_Zc_wchar_t,
false)) {
8384CmdArgs.push_back(
"-fno-wchar");
8387 if(Args.hasArg(options::OPT__SLASH_kernel)) {
8389std::vector<std::string> Values =
8390Args.getAllArgValues(options::OPT__SLASH_arch);
8391 if(!Values.empty()) {
8392llvm::SmallSet<std::string, 4> SupportedArches;
8393 if(Arch == llvm::Triple::x86)
8394SupportedArches.insert(
"IA32");
8396 for(
auto&
V: Values)
8397 if(!SupportedArches.contains(
V))
8398 D.Diag(diag::err_drv_argument_not_allowed_with)
8399<< std::string(
"/arch:").append(
V) <<
"/kernel";
8402CmdArgs.push_back(
"-fno-rtti");
8403 if(Args.hasFlag(options::OPT__SLASH_GR, options::OPT__SLASH_GR_,
false))
8404 D.Diag(diag::err_drv_argument_not_allowed_with) <<
"/GR" 8408Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
8409Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
8410 if(MostGeneralArg && BestCaseArg)
8411 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
8412<< MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
8414 if(MostGeneralArg) {
8415Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
8416Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
8417Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
8419Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
8420Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
8421 if(FirstConflict && SecondConflict && FirstConflict != SecondConflict)
8422 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
8423<< FirstConflict->getAsString(Args)
8424<< SecondConflict->getAsString(Args);
8427CmdArgs.push_back(
"-fms-memptr-rep=single");
8428 else if(MultipleArg)
8429CmdArgs.push_back(
"-fms-memptr-rep=multiple");
8431CmdArgs.push_back(
"-fms-memptr-rep=virtual");
8434 if(Args.hasArg(options::OPT_regcall4))
8435CmdArgs.push_back(
"-regcall4");
8439Args.getLastArg(options::OPT__SLASH_Gd, options::OPT__SLASH_Gr,
8440options::OPT__SLASH_Gz, options::OPT__SLASH_Gv,
8441options::OPT__SLASH_Gregcall)) {
8442 unsignedDCCOptId = CCArg->getOption().
getID();
8443 const char*DCCFlag =
nullptr;
8444 boolArchSupported = !isNVPTX;
8447 caseoptions::OPT__SLASH_Gd:
8448DCCFlag =
"-fdefault-calling-conv=cdecl";
8450 caseoptions::OPT__SLASH_Gr:
8451ArchSupported = Arch == llvm::Triple::x86;
8452DCCFlag =
"-fdefault-calling-conv=fastcall";
8454 caseoptions::OPT__SLASH_Gz:
8455ArchSupported = Arch == llvm::Triple::x86;
8456DCCFlag =
"-fdefault-calling-conv=stdcall";
8458 caseoptions::OPT__SLASH_Gv:
8459ArchSupported = Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64;
8460DCCFlag =
"-fdefault-calling-conv=vectorcall";
8462 caseoptions::OPT__SLASH_Gregcall:
8463ArchSupported = Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64;
8464DCCFlag =
"-fdefault-calling-conv=regcall";
8469 if(ArchSupported && DCCFlag)
8470CmdArgs.push_back(DCCFlag);
8473 if(Args.hasArg(options::OPT__SLASH_Gregcall4))
8474CmdArgs.push_back(
"-regcall4");
8476Args.AddLastArg(CmdArgs, options::OPT_vtordisp_mode_EQ);
8478 if(!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
8479CmdArgs.push_back(
"-fdiagnostics-format");
8480CmdArgs.push_back(
"msvc");
8483 if(Args.hasArg(options::OPT__SLASH_kernel))
8484CmdArgs.push_back(
"-fms-kernel");
8486 for(
constArg *A : Args.filtered(options::OPT__SLASH_guard)) {
8487StringRef GuardArgs = A->getValue();
8490 if(GuardArgs.equals_insensitive(
"cf")) {
8492CmdArgs.push_back(
"-cfguard");
8493}
else if(GuardArgs.equals_insensitive(
"cf,nochecks")) {
8495CmdArgs.push_back(
"-cfguard-no-checks");
8496}
else if(GuardArgs.equals_insensitive(
"ehcont")) {
8498CmdArgs.push_back(
"-ehcontguard");
8499}
else if(GuardArgs.equals_insensitive(
"cf-") ||
8500GuardArgs.equals_insensitive(
"ehcont-")) {
8503 D.Diag(diag::err_drv_invalid_value) << A->getSpelling() << GuardArgs;
8511 returnArgs.MakeArgString(llvm::sys::path::filename(Input.
getBaseInput()));
8518 if(
const char*End = strrchr(Str,
'.'))
8519 returnArgs.MakeArgString(std::string(Str, End));
8528 if(Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
8530llvm::sys::path::replace_extension(OutputFilename, llvm::Twine(
'd'));
8531 returnArgs.MakeArgString(OutputFilename);
8534 returnArgs.MakeArgString(Twine(
getBaseInputStem(Args, Inputs)) +
".d");
8540ArgStringList &CmdArgs)
const{
8546CmdArgs.push_back(
"-target-abi");
8547CmdArgs.push_back(ABIName.data());
8551ArgStringList &CmdArgs)
const{
8555 if(Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
8556StringRef
Value= A->getValue();
8558CmdArgs.push_back(
"-mllvm");
8559CmdArgs.push_back(Args.MakeArgString(
"-x86-asm-syntax="+
Value));
8562<< A->getSpelling() <<
Value;
8568ArgStringList &CmdArgs)
const{
8569CmdArgs.push_back(
"-target-abi");
8576ArgStringList &CmdArgs)
const{
8580CmdArgs.push_back(
"-target-abi");
8581CmdArgs.push_back(ABIName.data());
8583 if(Args.hasFlag(options::OPT_mdefault_build_attributes,
8584options::OPT_mno_default_build_attributes,
true)) {
8585CmdArgs.push_back(
"-mllvm");
8586CmdArgs.push_back(
"-riscv-add-build-attributes");
8592 constArgList &Args,
8593 const char*LinkingOutput)
const{
8594ArgStringList CmdArgs;
8596assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
8600 conststd::string &TripleStr = Triple.getTriple();
8604Args.ClaimAllArgs(options::OPT_w);
8606Args.ClaimAllArgs(options::OPT_emit_llvm);
8613CmdArgs.push_back(
"-cc1as");
8616CmdArgs.push_back(
"-triple");
8617CmdArgs.push_back(Args.MakeArgString(TripleStr));
8623CmdArgs.push_back(
"-filetype");
8624CmdArgs.push_back(
"obj");
8628CmdArgs.push_back(
"-main-file-name");
8632std::string CPU =
getCPUName(
D, Args, Triple,
true);
8634CmdArgs.push_back(
"-target-cpu");
8635CmdArgs.push_back(Args.MakeArgString(CPU));
8642(void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
8645Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
8648Args.AddAllArgs(CmdArgs, options::OPT_embed_dir_EQ);
8651 autoFindSource = [](
const Action*S) ->
const Action* {
8653assert(!S->getInputs().empty() &&
"unexpected root action!");
8654S = S->getInputs()[0];
8658 const Action*SourceAction = FindSource(&JA);
8662 boolWantDebug =
false;
8663Args.ClaimAllArgs(options::OPT_g_Group);
8664 if(Arg *A = Args.getLastArg(options::OPT_g_Group))
8665WantDebug = !A->getOption().matches(options::OPT_g0) &&
8666!A->getOption().matches(options::OPT_ggdb0);
8669 boolEmitDwarf =
false;
8673 boolEmitCodeView =
false;
8674 if(
constArg *A = Args.getLastArg(options::OPT_gcodeview))
8679 if(!EmitCodeView && !EmitDwarf && WantDebug) {
8681 casellvm::codegenoptions::DIF_CodeView:
8682EmitCodeView =
true;
8684 casellvm::codegenoptions::DIF_DWARF:
8694llvm::codegenoptions::DebugInfoKind DebugInfoKind =
8695llvm::codegenoptions::NoDebugInfo;
8698 const char*DebugCompilationDir =
8701 if(SourceAction->
getType() == types::TY_Asm ||
8702SourceAction->
getType() == types::TY_PP_Asm) {
8707DebugInfoKind = (WantDebug ? llvm::codegenoptions::DebugInfoConstructor
8708: llvm::codegenoptions::NoDebugInfo);
8715CmdArgs.push_back(
"-dwarf-debug-producer");
8719Args.AddAllArgs(CmdArgs, options::OPT_I);
8723llvm::DebuggerKind::Default);
8729llvm::Reloc::Model RelocationModel;
8732std::tie(RelocationModel, PICLevel, IsPIE) =
8737CmdArgs.push_back(
"-mrelocation-model");
8738CmdArgs.push_back(RMName);
8744ArgStringList OriginalArgs;
8745 for(
const auto&Arg : Args)
8746Arg->render(Args, OriginalArgs);
8751 for(
const char*OriginalArg : OriginalArgs) {
8755Flags += EscapedArg;
8757CmdArgs.push_back(
"-dwarf-debug-flags");
8758CmdArgs.push_back(Args.MakeArgString(Flags));
8768 casellvm::Triple::mips:
8769 casellvm::Triple::mipsel:
8770 casellvm::Triple::mips64:
8771 casellvm::Triple::mips64el:
8775 casellvm::Triple::x86:
8776 casellvm::Triple::x86_64:
8780 casellvm::Triple::arm:
8781 casellvm::Triple::armeb:
8782 casellvm::Triple::thumb:
8783 casellvm::Triple::thumbeb:
8786 if(Args.hasFlag(options::OPT_mdefault_build_attributes,
8787options::OPT_mno_default_build_attributes,
true)) {
8788CmdArgs.push_back(
"-mllvm");
8789CmdArgs.push_back(
"-arm-add-build-attributes");
8793 casellvm::Triple::aarch64:
8794 casellvm::Triple::aarch64_32:
8795 casellvm::Triple::aarch64_be:
8796 if(Args.hasArg(options::OPT_mmark_bti_property)) {
8797CmdArgs.push_back(
"-mllvm");
8798CmdArgs.push_back(
"-aarch64-mark-bti-property");
8802 casellvm::Triple::loongarch32:
8803 casellvm::Triple::loongarch64:
8807 casellvm::Triple::riscv32:
8808 casellvm::Triple::riscv64:
8812 casellvm::Triple::hexagon:
8813 if(Args.hasFlag(options::OPT_mdefault_build_attributes,
8814options::OPT_mno_default_build_attributes,
true)) {
8815CmdArgs.push_back(
"-mllvm");
8816CmdArgs.push_back(
"-hexagon-add-build-attributes");
8826Args.ClaimAllArgs(options::OPT_W_Group);
8831Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
8833 if(DebugInfoKind > llvm::codegenoptions::NoDebugInfo && Output.
isFilename())
8840 if(SourceAction != FindSource(&J.getSource()))
8842 auto&JArgs = J.getArguments();
8843 for(
unsignedI = 0; I < JArgs.size(); ++I) {
8844 if(StringRef(JArgs[I]).starts_with(
"-object-file-name=") &&
8846ArgStringList NewArgs(JArgs.begin(), JArgs.begin() + I);
8849NewArgs.append(JArgs.begin() + I + 1, JArgs.end());
8850J.replaceArguments(NewArgs);
8856assert(Output.
isFilename() &&
"Unexpected lipo output.");
8857CmdArgs.push_back(
"-o");
8863 T.isOSBinFormatELF()) {
8864CmdArgs.push_back(
"-split-dwarf-output");
8868 if(Triple.isAMDGPU())
8871assert(Input.
isFilename() &&
"Invalid input.");
8875 if(
D.CC1Main && !
D.CCGenDiagnostics) {
8877 C.addCommand(std::make_unique<CC1Command>(
8879Output,
D.getPrependArg()));
8881 C.addCommand(std::make_unique<Command>(
8883Output,
D.getPrependArg()));
8891 constllvm::opt::ArgList &TCArgs,
8892 const char*LinkingOutput)
const{
8894assert(isa<OffloadBundlingJobAction>(JA) &&
"Expecting bundling job!");
8904ArgStringList CmdArgs;
8907CmdArgs.push_back(TCArgs.MakeArgString(
8910assert(JA.
getInputs().size() == Inputs.size() &&
8911 "Not have inputs for all dependence actions??");
8915Triples +=
"-targets=";
8916 for(
unsignedI = 0; I < Inputs.size(); ++I) {
8925 if(
const auto*OA = dyn_cast<OffloadAction>(CurDep)) {
8927OA->doOnEachDependence([&](
Action*A,
const ToolChain*TC,
const char*) {
8928assert(CurTC ==
nullptr&&
"Expected one dependence!");
8935Triples += CurTC->
getTriple().normalize();
8944StringRef GPUArchName;
8947 for(
unsignedArgIndex = 0; ArgIndex < TCArgs.size(); ArgIndex++) {
8948 autoArchStr = StringRef(TCArgs.getArgString(ArgIndex));
8949 autoArch = ArchStr.starts_with_insensitive(
"-march=");
8951GPUArchName = ArchStr.substr(7);
8956Triples += GPUArchName.str();
8959CmdArgs.push_back(TCArgs.MakeArgString(Triples));
8963TCArgs.MakeArgString(Twine(
"-output=") + Output.
getFilename()));
8966 for(
unsignedI = 0; I < Inputs.size(); ++I) {
8972 if(
const auto*OA = dyn_cast<OffloadAction>(JA.
getInputs()[I])) {
8974OA->doOnEachDependence([&](
Action*,
const ToolChain*TC,
const char*) {
8975assert(CurTC ==
nullptr&&
"Expected one dependence!");
8978UB +=
C.addTempFile(
8983CmdArgs.push_back(TCArgs.MakeArgString(UB));
8987 C.addCommand(std::make_unique<Command>(
8990CmdArgs, std::nullopt, Output));
8995 const InputInfoList&Inputs,
constllvm::opt::ArgList &TCArgs,
8996 const char*LinkingOutput)
const{
8998 auto&UA = cast<OffloadUnbundlingJobAction>(JA);
9009ArgStringList CmdArgs;
9011assert(Inputs.size() == 1 &&
"Expecting to unbundle a single file!");
9015CmdArgs.push_back(TCArgs.MakeArgString(
9020Triples +=
"-targets=";
9021 autoDepInfo = UA.getDependentActionsInfo();
9022 for(
unsignedI = 0; I < DepInfo.size(); ++I) {
9026 auto&Dep = DepInfo[I];
9029Triples += Dep.DependentToolChain->getTriple().normalize();
9032!Dep.DependentBoundArch.empty()) {
9034Triples += Dep.DependentBoundArch;
9038StringRef GPUArchName;
9041 for(
unsignedArgIndex = 0; ArgIndex < TCArgs.size(); ArgIndex++) {
9042StringRef ArchStr = StringRef(TCArgs.getArgString(ArgIndex));
9043 autoArch = ArchStr.starts_with_insensitive(
"-march=");
9045GPUArchName = ArchStr.substr(7);
9050Triples += GPUArchName.str();
9054CmdArgs.push_back(TCArgs.MakeArgString(Triples));
9058TCArgs.MakeArgString(Twine(
"-input=") + Input.
getFilename()));
9061 for(
unsignedI = 0; I < Outputs.size(); ++I) {
9064UB += DepInfo[I].DependentToolChain->getInputFilename(Outputs[I]);
9065CmdArgs.push_back(TCArgs.MakeArgString(UB));
9067CmdArgs.push_back(
"-unbundle");
9068CmdArgs.push_back(
"-allow-missing-bundles");
9069 if(TCArgs.hasArg(options::OPT_v))
9070CmdArgs.push_back(
"-verbose");
9073 C.addCommand(std::make_unique<Command>(
9076CmdArgs, std::nullopt, Outputs));
9082 constllvm::opt::ArgList &Args,
9083 const char*LinkingOutput)
const{
9084ArgStringList CmdArgs;
9087assert(Output.
isFilename() &&
"Invalid output.");
9088CmdArgs.push_back(
"-o");
9092 for(
const InputInfo&Input : Inputs) {
9095 constArgList &TCArgs =
9101: TCArgs.getLastArgValue(options::OPT_march_EQ);
9105ArgStringList Features;
9109llvm::copy_if(Features, std::back_inserter(FeatureArgs),
9110[](StringRef Arg) {
return!Arg.starts_with(
"-target"); });
9115 "file="+
File.str(),
9117 "arch="+ Arch.str(),
9118 "kind="+ Kind.str(),
9122 for(StringRef Feature : FeatureArgs)
9123Parts.emplace_back(
"feature="+ Feature.str());
9125CmdArgs.push_back(Args.MakeArgString(
"--image="+ llvm::join(Parts,
",")));
9128 C.addCommand(std::make_unique<Command>(
9131CmdArgs, Inputs, Output));
9137 constArgList &Args,
9138 const char*LinkingOutput)
const{
9141ArgStringList CmdArgs;
9145 autoTCRange =
C.getOffloadToolChains(Kind);
9146 for(
auto&I : llvm::make_range(TCRange)) {
9150 if(CudaInstallation.
isValid())
9151CmdArgs.push_back(Args.MakeArgString(
9159 if(
constArg *A = Args.getLastArg(options::OPT_O_Group)) {
9161 if(A->getOption().matches(options::OPT_O4) ||
9162A->getOption().matches(options::OPT_Ofast))
9164 else if(A->getOption().matches(options::OPT_O)) {
9165OOpt = A->getValue();
9168 else if(OOpt ==
"s"|| OOpt ==
"z")
9170}
else if(A->getOption().matches(options::OPT_O0))
9173CmdArgs.push_back(Args.MakeArgString(Twine(
"--opt-level=O") + OOpt));
9177Args.MakeArgString(
"--host-triple="+ TheTriple.getTriple()));
9178 if(Args.hasArg(options::OPT_v))
9179CmdArgs.push_back(
"--wrapper-verbose");
9181 if(
constArg *A = Args.getLastArg(options::OPT_g_Group)) {
9182 if(!A->getOption().matches(options::OPT_g0))
9183CmdArgs.push_back(
"--device-debug");
9188 if(
constArg *A = Args.getLastArg(options::OPT_mcode_object_version_EQ)) {
9189CmdArgs.push_back(Args.MakeArgString(
"-mllvm"));
9190CmdArgs.push_back(Args.MakeArgString(
9191Twine(
"--amdhsa-code-object-version=") + A->getValue()));
9194 for(
const auto&A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
9195CmdArgs.push_back(Args.MakeArgString(
"--ptxas-arg="+ A));
9198 if(
constArg *A = Args.getLastArg(options::OPT_Rpass_EQ))
9199CmdArgs.push_back(Args.MakeArgString(Twine(
"--offload-opt=-pass-remarks=") +
9201 if(
constArg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
9202CmdArgs.push_back(Args.MakeArgString(
9203Twine(
"--offload-opt=-pass-remarks-missed=") + A->getValue()));
9204 if(
constArg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
9205CmdArgs.push_back(Args.MakeArgString(
9206Twine(
"--offload-opt=-pass-remarks-analysis=") + A->getValue()));
9208 if(Args.getLastArg(options::OPT_ftime_report))
9209CmdArgs.push_back(
"--device-compiler=-ftime-report");
9211 if(Args.getLastArg(options::OPT_save_temps_EQ))
9212CmdArgs.push_back(
"--save-temps");
9215Linker->
ConstructJob(
C, JA, Output, Inputs, Args, LinkingOutput);
9216 const auto&LinkCommand =
C.getJobs().getJobs().back();
9219 for(Arg *A : Args.filtered(options::OPT_Xoffload_linker)) {
9220StringRef Val = A->getValue(0);
9223Args.MakeArgString(Twine(
"--device-linker=") + A->getValue(1)));
9225CmdArgs.push_back(Args.MakeArgString(
9226 "--device-linker="+
9230Args.ClaimAllArgs(options::OPT_Xoffload_linker);
9233 if(Args.hasFlag(options::OPT_fopenmp_target_jit,
9234options::OPT_fno_openmp_target_jit,
false))
9235CmdArgs.push_back(
"--embed-bitcode");
9238 for(Arg *A : Args.filtered(options::OPT_mllvm)) {
9239CmdArgs.push_back(
"-mllvm");
9240CmdArgs.push_back(A->getValue());
9245 if(!Args.hasArg(options::OPT_nostdlib, options::OPT_r, options::OPT_nogpulib,
9246options::OPT_nodefaultlibs, options::OPT_nolibc,
9247options::OPT_nogpulibc)) {
9255CmdArgs.push_back(Args.MakeArgString(
9257CmdArgs.push_back(Args.MakeArgString(
9264Args.MakeArgString(
"--device-linker="+ TC.
getTripleString() +
"="+
9265 "-lclang_rt.builtins"));
9271 if(!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc,
true))
9272CmdArgs.push_back(
"--device-compiler=-nolibc");
9275CmdArgs.push_back(Args.MakeArgString(Twine(
"--linker-path=") +
9276LinkCommand->getExecutable()));
9277 for(
const char*LinkArg : LinkCommand->getArguments())
9278CmdArgs.push_back(LinkArg);
9283Args.MakeArgString(
getToolChain().GetProgramPath(
"clang-linker-wrapper"));
9287LinkCommand->replaceExecutable(Exec);
9288LinkCommand->replaceArguments(CmdArgs);
static StringRef bytes(const std::vector< T, Allocator > &v)
static std::string ComplexRangeKindToStr(LangOptions::ComplexRangeKind Range)
static void ParseMPreferVectorWidth(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs)
The -mprefer-vector-width option accepts either a positive integer or the string "none".
static void RenderDebugInfoCompressionArgs(const ArgList &Args, ArgStringList &CmdArgs, const Driver &D, const ToolChain &TC)
static bool checkDebugInfoOption(const Arg *A, const ArgList &Args, const Driver &D, const ToolChain &TC)
static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs, types::ID InputType)
static bool shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime, const llvm::Triple &Triple)
static void RenderCharacterOptions(const ArgList &Args, const llvm::Triple &T, ArgStringList &CmdArgs)
static std::string RenderComplexRangeOption(LangOptions::ComplexRangeKind Range)
static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind, unsigned DwarfVersion, llvm::DebuggerKind DebuggerTuning)
static void ProcessVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
static void renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T, const ArgList &Args, bool IRInput, ArgStringList &CmdArgs, const InputInfo &Output, llvm::codegenoptions::DebugInfoKind &DebugInfoKind, DwarfFissionKind &DwarfFission)
static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec)
Vectorize at all optimization levels greater than 1 except for -Oz.
static void RenderDiagnosticsOptions(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs)
static bool maybeHasClangPchSignature(const Driver &D, StringRef Path)
static bool addExceptionArgs(const ArgList &Args, types::ID InputType, const ToolChain &TC, bool KernelOrKext, const ObjCRuntime &objcRuntime, ArgStringList &CmdArgs)
Adds exception related arguments to the driver command arguments.
static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args)
void AddAAPCSVolatileBitfieldArgs(const ArgList &Args, ArgStringList &CmdArgs)
static bool isSignedCharDefault(const llvm::Triple &Triple)
static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args, bool isWindowsMSVC)
/EH controls whether to run destructor cleanups when exceptions are thrown.
static bool gchProbe(const Driver &D, StringRef Path)
static void RenderOpenACCOptions(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs, types::ID InputType)
static void EmitComplexRangeDiag(const Driver &D, std::string str1, std::string str2)
static bool CheckARMImplicitITArg(StringRef Value)
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static void handleAMDGPUCodeObjectVersionOptions(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs, bool IsCC1As=false)
static void addDashXForInput(const ArgList &Args, const InputInfo &Input, ArgStringList &CmdArgs)
Add -x lang to CmdArgs for Input.
static void ParseMRecip(const Driver &D, const ArgList &Args, ArgStringList &OutStrings)
The -mrecip flag requires processing of many optional parameters.
static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, types::ID InputType)
static void renderDwarfFormat(const Driver &D, const llvm::Triple &T, const ArgList &Args, ArgStringList &CmdArgs, unsigned DwarfVersion)
static void RenderObjCOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T, const ArgList &Args, ObjCRuntime &Runtime, bool InferCovariantReturns, const InputInfo &Input, ArgStringList &CmdArgs)
static void addCoveragePrefixMapArg(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs)
Add a CC1 and CC1AS option to specify the coverage file path prefix map.
static void AddARMImplicitITArgs(const ArgList &Args, ArgStringList &CmdArgs, StringRef Value)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void CollectArgsForIntegratedAssembler(Compilation &C, const ArgList &Args, ArgStringList &CmdArgs, const Driver &D)
static bool RenderModulesOptions(Compilation &C, const Driver &D, const ArgList &Args, const InputInfo &Input, const InputInfo &Output, bool HaveStd20, ArgStringList &CmdArgs)
static void forAllAssociatedToolChains(Compilation &C, const JobAction &JA, const ToolChain &RegularToolChain, llvm::function_ref< void(const ToolChain &)> Work)
Apply Work on the current tool chain RegularToolChain and any other offloading tool chain that is ass...
static bool isValidSymbolName(StringRef S)
static void addMacroPrefixMapArg(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs)
Add a CC1 and CC1AS option to specify the macro file path prefix map.
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static std::string ComplexArithmeticStr(LangOptions::ComplexRangeKind Range)
static void addDebugObjectName(const ArgList &Args, ArgStringList &CmdArgs, const char *DebugCompilationDir, const char *OutputFileName)
static bool getRefinementStep(StringRef In, const Driver &D, const Arg &A, size_t &Position)
This is a helper function for validating the optional refinement step parameter in reciprocal argumen...
static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, bool isAArch64)
static void RenderSSPOptions(const Driver &D, const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, bool KernelOrKext)
static void RenderBuiltinOptions(const ToolChain &TC, const llvm::Triple &T, const ArgList &Args, ArgStringList &CmdArgs)
static void RenderSCPOptions(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
static void RenderTrivialAutoVarInitOptions(const Driver &D, const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
static bool maybeConsumeDash(const std::string &EH, size_t &I)
static const char * addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs, const llvm::vfs::FileSystem &VFS)
Add a CC1 option to specify the debug compilation directory.
static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args)
static bool ShouldEnableAutolink(const ArgList &Args, const ToolChain &TC, const JobAction &JA)
static void addDebugPrefixMapArg(const Driver &D, const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
Add a CC1 and CC1AS option to specify the debug file path prefix map.
static void RenderAnalyzerOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input)
static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA)
static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C, const JobAction &JA, const InputInfo &Output, const ArgList &Args, SanitizerArgs &SanArgs, ArgStringList &CmdArgs)
static void handlePAuthABI(const ArgList &DriverArgs, ArgStringList &CC1Args)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Defines types useful for describing an Objective-C runtime.
Defines version macros and version-related utility functions for Clang.
static StringRef getWarningOptionForGroup(diag::Group)
Given a group ID, returns the flag that toggles the group.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
The basic abstraction for the target Objective-C runtime.
bool allowsWeak() const
Does this runtime allow the use of __weak?
bool isLegacyDispatchDefaultForArch(llvm::Triple::ArchType Arch)
The default dispatch mechanism to use for the specified architecture.
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
const VersionTuple & getVersion() const
bool tryParse(StringRef input)
Try to parse an Objective-C runtime specification from the given string.
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
std::string getAsString() const
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ GCC
'gcc' is the Objective-C runtime shipped with GCC, implementing a fragile Objective-C ABI
Scope - A scope is a transient data structure that is used while parsing the program.
Scope(Scope *Parent, unsigned ScopeFlags, DiagnosticsEngine &Diag)
Action - Represent an abstract compilation step to perform.
const char * getOffloadingArch() const
types::ID getType() const
const ToolChain * getOffloadingToolChain() const
static std::string GetOffloadingFileNamePrefix(OffloadKind Kind, StringRef NormalizedTriple, bool CreatePrefixForHost=false)
Return a string that can be used as prefix in order to generate unique files for each offloading kind...
ActionClass getKind() const
static StringRef GetOffloadKindName(OffloadKind Kind)
Return a string containing a offload kind name.
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
bool isDeviceOffloading(OffloadKind OKind) const
bool isOffloading(OffloadKind OKind) const
Command - An executable path/name and argument vector to execute.
Compilation - A set of tasks to perform for a single driver invocation.
A class to find a viable CUDA installation.
StringRef getInstallPath() const
Get the detected Cuda installation path.
bool isValid() const
Check whether we detected a valid Cuda install.
Distro - Helper class for detecting and classifying Linux distributions.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
static bool getDefaultModuleCachePath(SmallVectorImpl< char > &Result)
Compute the default -fmodule-cache-path.
const char * getClangProgramPath() const
Get the path to the main clang executable.
DiagnosticBuilder Diag(unsigned DiagID) const
bool isUsingOffloadLTO() const
Returns true if we are performing any kind of offload LTO.
llvm::vfs::FileSystem & getVFS() const
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
InputInfo - Wrapper for information about an input source.
const char * getBaseInput() const
const llvm::opt::Arg & getInputArg() const
const char * getFilename() const
const Action * getAction() const
The action for which this InputInfo was created. May be null.
types::ID getType() const
An offload action combines host or/and device actions according to the programming model implementati...
void addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, types::ID InputType) const
bool isHLSL(ID Id)
isHLSL - Is this an HLSL input.
bool isObjC(ID Id)
isObjC - Is this an "ObjC" input (Obj-C and Obj-C++ sources and headers).
ID getPreprocessedType(ID Id)
getPreprocessedType - Get the ID of the type for this input when it has been preprocessed,...
bool isLLVMIR(ID Id)
Is this LLVM IR.
const char * getTypeName(ID Id)
getTypeName - Return the name of the type for Id.
bool isOpenCL(ID Id)
isOpenCL - Is this an "OpenCL" input.
bool isSrcFile(ID Id)
isSrcFile - Is this a source file, i.e.
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
bool isCXX(ID Id)
isCXX - Is this a "C++" input (C++ and Obj-C++ sources and headers).
bool isOptimizationLevelFast(const llvm::opt::ArgList &Args)
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
The JSON file list parser is used to communicate input to InstallAPI.
std::optional< diag::Group > diagGroupFromCLWarningID(unsigned)
For cl.exe warning IDs that cleany map to clang diagnostic groups, returns the corresponding group.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
void quoteMakeTarget(StringRef Target, SmallVectorImpl< char > &Res)
Quote target names for inclusion in GNU Make dependency files.
const char * headerIncludeFormatKindToString(HeaderIncludeFormatKind K)
const char * headerIncludeFilteringKindToString(HeaderIncludeFilteringKind K)
@ Asm
Assembly: we accept this only so that we can preprocess it.
@ Result
The result type of a method or function.
const char * CudaVersionToString(CudaVersion V)
const FunctionProtoType * T
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4