14#include "clang/Config/config.h"
20#include "llvm/ADT/StringExtras.h"
21#include "llvm/Option/Arg.h"
22#include "llvm/Option/ArgList.h"
23#include "llvm/Support/ConvertUTF.h"
24#include "llvm/Support/ErrorHandling.h"
25#include "llvm/Support/FileSystem.h"
26#include "llvm/Support/MemoryBuffer.h"
27#include "llvm/Support/Path.h"
28#include "llvm/Support/Process.h"
29#include "llvm/Support/VirtualFileSystem.h"
30#include "llvm/TargetParser/Host.h"
34 #define WIN32_LEAN_AND_MEAN
48static bool canExecute(llvm::vfs::FileSystem &VFS, StringRef Path) {
49 auto Status = VFS.status(Path);
52 return (Status->getPermissions() & llvm::sys::fs::perms::all_exe) != 0;
63 MSVC.getSubDirectoryPath(llvm::SubDirectoryType::Bin));
64 llvm::sys::path::append(FilePath, Exe);
65 return std::string(
canExecute(TC.
getVFS(), FilePath) ? FilePath.str() : Exe);
72 const char *LinkingOutput)
const {
73 ArgStringList CmdArgs;
80 Args.MakeArgString(std::string(
"-out:") + Output.
getFilename()));
82 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
83 !
C.getDriver().IsCLMode() && !
C.getDriver().IsFlangMode()) {
84 CmdArgs.push_back(
"-defaultlib:libcmt");
85 CmdArgs.push_back(
"-defaultlib:oldnames");
93 if (
const Arg *A = Args.getLastArg(options::OPT__SLASH_diasdkdir,
94 options::OPT__SLASH_winsysroot)) {
99 if (A->getOption().getID() == options::OPT__SLASH_winsysroot)
100 llvm::sys::path::append(DIAPath,
"DIA SDK");
103 llvm::sys::path::append(DIAPath,
"lib",
104 llvm::archToLegacyVCArch(TC.getArch()));
105 CmdArgs.push_back(Args.MakeArgString(Twine(
"-libpath:") + DIAPath));
107 if (!llvm::sys::Process::GetEnv(
"LIB") ||
108 Args.getLastArg(options::OPT__SLASH_vctoolsdir,
109 options::OPT__SLASH_winsysroot)) {
110 CmdArgs.push_back(Args.MakeArgString(
112 TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib)));
113 CmdArgs.push_back(Args.MakeArgString(
115 TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib,
"atlmfc")));
117 if (!llvm::sys::Process::GetEnv(
"LIB") ||
118 Args.getLastArg(options::OPT__SLASH_winsdkdir,
119 options::OPT__SLASH_winsysroot)) {
120 if (TC.useUniversalCRT()) {
121 std::string UniversalCRTLibPath;
122 if (TC.getUniversalCRTLibraryPath(Args, UniversalCRTLibPath))
124 Args.MakeArgString(Twine(
"-libpath:") + UniversalCRTLibPath));
126 std::string WindowsSdkLibPath;
127 if (TC.getWindowsSDKLibraryPath(Args, WindowsSdkLibPath))
129 Args.MakeArgString(std::string(
"-libpath:") + WindowsSdkLibPath));
132 if (
C.getDriver().IsFlangMode()) {
139 CmdArgs.push_back(
"/subsystem:console");
144 for (
const auto &LibPath : TC.getLibraryPaths()) {
145 if (TC.getVFS().exists(LibPath))
146 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + LibPath));
148 auto CRTPath = TC.getCompilerRTPath();
149 if (TC.getVFS().exists(CRTPath))
150 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + CRTPath));
152 if (!
C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
153 for (
const auto &LibPath : Args.getAllArgValues(options::OPT_L))
154 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + LibPath));
156 CmdArgs.push_back(
"-nologo");
158 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
159 CmdArgs.push_back(
"-debug");
163 if (Args.hasArg(options::OPT_fms_hotpatch, options::OPT__SLASH_hotpatch))
164 CmdArgs.push_back(
"-functionpadmin");
168 bool DefaultIncrementalLinkerCompatible =
169 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
170 if (!Args.hasFlag(options::OPT_mincremental_linker_compatible,
171 options::OPT_mno_incremental_linker_compatible,
172 DefaultIncrementalLinkerCompatible))
173 CmdArgs.push_back(
"-Brepro");
175 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
176 options::OPT_shared);
178 CmdArgs.push_back(Args.MakeArgString(
"-dll"));
181 llvm::sys::path::replace_extension(ImplibName,
"lib");
182 CmdArgs.push_back(Args.MakeArgString(std::string(
"-implib:") + ImplibName));
185 if (TC.getSanitizerArgs(Args).needsFuzzer()) {
186 if (!Args.hasArg(options::OPT_shared))
188 Args.MakeArgString(std::string(
"-wholearchive:") +
189 TC.getCompilerRTArgString(Args,
"fuzzer")));
190 CmdArgs.push_back(Args.MakeArgString(
"-debug"));
193 CmdArgs.push_back(Args.MakeArgString(
"-incremental:no"));
196 if (TC.getSanitizerArgs(Args).needsAsanRt()) {
197 CmdArgs.push_back(Args.MakeArgString(
"-debug"));
198 CmdArgs.push_back(Args.MakeArgString(
"-incremental:no"));
199 if (TC.getSanitizerArgs(Args).needsSharedRt() ||
200 Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
201 for (
const auto &Lib : {
"asan_dynamic",
"asan_dynamic_runtime_thunk"})
202 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
205 CmdArgs.push_back(Args.MakeArgString(
206 TC.getArch() == llvm::Triple::x86
207 ?
"-include:___asan_seh_interceptor"
208 :
"-include:__asan_seh_interceptor"));
211 CmdArgs.push_back(Args.MakeArgString(std::string(
"-wholearchive:") +
212 TC.getCompilerRT(Args,
"asan_dynamic_runtime_thunk")));
214 CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dll_thunk"));
216 for (
const auto &Lib : {
"asan",
"asan_cxx"}) {
217 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
221 CmdArgs.push_back(Args.MakeArgString(std::string(
"-wholearchive:") +
222 TC.getCompilerRT(Args, Lib)));
227 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
230 for (
const Arg *A : Args.filtered(options::OPT__SLASH_guard)) {
231 StringRef GuardArgs = A->getValue();
232 if (GuardArgs.equals_insensitive(
"cf") ||
233 GuardArgs.equals_insensitive(
"cf,nochecks")) {
235 CmdArgs.push_back(
"-guard:cf");
236 }
else if (GuardArgs.equals_insensitive(
"cf-")) {
237 CmdArgs.push_back(
"-guard:cf-");
238 }
else if (GuardArgs.equals_insensitive(
"ehcont")) {
239 CmdArgs.push_back(
"-guard:ehcont");
240 }
else if (GuardArgs.equals_insensitive(
"ehcont-")) {
241 CmdArgs.push_back(
"-guard:ehcont-");
245 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
246 options::OPT_fno_openmp,
false)) {
247 CmdArgs.push_back(
"-nodefaultlib:vcomp.lib");
248 CmdArgs.push_back(
"-nodefaultlib:vcompd.lib");
249 CmdArgs.push_back(Args.MakeArgString(std::string(
"-libpath:") +
250 TC.getDriver().Dir +
"/../lib"));
251 switch (TC.getDriver().getOpenMPRuntime(Args)) {
253 CmdArgs.push_back(
"-defaultlib:libomp.lib");
256 CmdArgs.push_back(
"-defaultlib:libiomp5md.lib");
268 if (!Args.hasArg(options::OPT_nostdlib)) {
273 Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER);
277 else if (
Linker.equals_insensitive(
"lld"))
280 if (
Linker ==
"lld-link") {
281 for (Arg *A : Args.filtered(options::OPT_vfsoverlay))
283 Args.MakeArgString(std::string(
"/vfsoverlay:") + A->getValue()));
285 if (
C.getDriver().isUsingLTO() &&
286 Args.hasFlag(options::OPT_gsplit_dwarf, options::OPT_gno_split_dwarf,
288 CmdArgs.push_back(Args.MakeArgString(Twine(
"/dwodir:") +
293 for (
const auto &Input : Inputs) {
294 if (Input.isFilename()) {
295 CmdArgs.push_back(Input.getFilename());
299 const Arg &A = Input.getInputArg();
302 if (A.getOption().matches(options::OPT_l)) {
303 StringRef Lib = A.getValue();
304 const char *LinkLibArg;
305 if (Lib.endswith(
".lib"))
306 LinkLibArg = Args.MakeArgString(Lib);
308 LinkLibArg = Args.MakeArgString(Lib +
".lib");
309 CmdArgs.push_back(LinkLibArg);
315 A.renderAsInput(Args, CmdArgs);
320 TC.addProfileRTLibs(Args, CmdArgs);
322 std::vector<const char *> Environment;
327 if (
Linker.equals_insensitive(
"link")) {
333 if (!TC.FoundMSVCInstall() && !
canExecute(TC.getVFS(), linkPath)) {
335 ClPath = TC.GetProgramPath(
"cl.exe");
337 linkPath = llvm::sys::path::parent_path(ClPath);
338 llvm::sys::path::append(linkPath,
"link.exe");
340 C.getDriver().Diag(clang::diag::warn_drv_msvc_not_found);
342 C.getDriver().Diag(clang::diag::warn_drv_msvc_not_found);
348 if (TC.getSanitizerArgs(Args).needsAsanRt())
349 CmdArgs.push_back(
"/INFERASANLIBS:NO");
358 if (TC.getIsVS2017OrNewer() &&
359 llvm::Triple(llvm::sys::getProcessTriple()).getArch() != TC.getArch()) {
360 auto HostArch = llvm::Triple(llvm::sys::getProcessTriple()).getArch();
363 std::unique_ptr<wchar_t[], decltype(&FreeEnvironmentStringsW)>(
364 GetEnvironmentStringsW(), FreeEnvironmentStringsW);
366 goto SkipSettingEnvironment;
369 size_t EnvBlockLen = 0;
370 while (EnvBlockWide[EnvBlockLen] != L
'\0') {
372 EnvBlockLen += std::wcslen(&EnvBlockWide[EnvBlockLen]) +
377 std::string EnvBlock;
378 if (!llvm::convertUTF16ToUTF8String(
380 EnvBlockLen *
sizeof(EnvBlockWide[0])),
382 goto SkipSettingEnvironment;
384 Environment.reserve(EnvCount);
389 for (
const char *Cursor = EnvBlock.data(); *Cursor !=
'\0';) {
390 llvm::StringRef EnvVar(Cursor);
391 if (EnvVar.starts_with_insensitive(
"path=")) {
392 constexpr size_t PrefixLen = 5;
393 Environment.push_back(Args.MakeArgString(
394 EnvVar.substr(0, PrefixLen) +
395 TC.getSubDirectoryPath(llvm::SubDirectoryType::Bin) +
396 llvm::Twine(llvm::sys::EnvPathSeparator) +
397 TC.getSubDirectoryPath(llvm::SubDirectoryType::Bin, HostArch) +
398 (EnvVar.size() > PrefixLen
399 ? llvm::Twine(llvm::sys::EnvPathSeparator) +
400 EnvVar.substr(PrefixLen)
403 Environment.push_back(Args.MakeArgString(EnvVar));
405 Cursor += EnvVar.size() + 1 ;
408 SkipSettingEnvironment:;
411 linkPath = TC.GetProgramPath(
Linker.str().c_str());
414 auto LinkCmd = std::make_unique<Command>(
416 Args.MakeArgString(linkPath), CmdArgs, Inputs, Output);
417 if (!Environment.empty())
418 LinkCmd->setEnvironment(Environment);
419 C.addCommand(std::move(LinkCmd));
424 :
ToolChain(D, Triple, Args), CudaInstallation(D, Triple, Args),
425 RocmInstallation(D, Triple, Args) {
430 std::optional<llvm::StringRef> VCToolsDir, VCToolsVersion;
431 if (Arg *A = Args.getLastArg(options::OPT__SLASH_vctoolsdir))
432 VCToolsDir = A->getValue();
433 if (Arg *A = Args.getLastArg(options::OPT__SLASH_vctoolsversion))
434 VCToolsVersion = A->getValue();
435 if (Arg *A = Args.getLastArg(options::OPT__SLASH_winsdkdir))
436 WinSdkDir = A->getValue();
437 if (Arg *A = Args.getLastArg(options::OPT__SLASH_winsdkversion))
438 WinSdkVersion = A->getValue();
439 if (Arg *A = Args.getLastArg(options::OPT__SLASH_winsysroot))
440 WinSysRoot = A->getValue();
446 llvm::findVCToolChainViaCommandLine(
getVFS(), VCToolsDir, VCToolsVersion,
447 WinSysRoot, VCToolChainPath, VSLayout) ||
448 llvm::findVCToolChainViaEnvironment(
getVFS(), VCToolChainPath,
450 llvm::findVCToolChainViaSetupConfig(
getVFS(), VCToolsVersion,
451 VCToolChainPath, VSLayout) ||
452 llvm::findVCToolChainViaRegistry(VCToolChainPath, VSLayout);
475 if (
getArch() == llvm::Triple::x86_64 ||
getArch() == llvm::Triple::arm ||
476 getArch() == llvm::Triple::thumb ||
getArch() == llvm::Triple::aarch64)
483 return getArch() == llvm::Triple::x86_64 ||
484 getArch() == llvm::Triple::aarch64;
492 return getArch() == llvm::Triple::x86_64 ||
493 getArch() == llvm::Triple::aarch64;
497 ArgStringList &CC1Args)
const {
502 ArgStringList &CC1Args)
const {
507 ArgStringList &CmdArgs)
const {
508 CmdArgs.append({Args.MakeArgString(StringRef(
"-libpath:") +
514 CudaInstallation.
print(OS);
515 RocmInstallation.
print(OS);
520 llvm::StringRef SubdirParent)
const {
521 return llvm::getSubDirectoryPath(
Type, VSLayout, VCToolChainPath,
getArch(),
527 llvm::Triple::ArchType TargetArch)
const {
528 return llvm::getSubDirectoryPath(
Type, VSLayout, VCToolChainPath, TargetArch,
538 std::string &path)
const {
541 std::string windowsSDKIncludeVersion;
542 std::string windowsSDKLibVersion;
545 if (!llvm::getWindowsSDKDir(
getVFS(), WinSdkDir, WinSdkVersion, WinSysRoot,
546 sdkPath, sdkMajor, windowsSDKIncludeVersion,
547 windowsSDKLibVersion))
551 llvm::sys::path::append(libPath,
"Lib");
553 if (!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
554 WinSdkVersion.has_value())
555 windowsSDKLibVersion = *WinSdkVersion;
557 llvm::sys::path::append(libPath, windowsSDKLibVersion,
"um");
558 return llvm::appendArchToWindowsSDKLibPath(sdkMajor, libPath,
getArch(),
563 return llvm::useUniversalCRT(VSLayout, VCToolChainPath,
getArch(),
getVFS());
567 std::string &Path)
const {
568 std::string UniversalCRTSdkPath;
569 std::string UCRTVersion;
572 if (!llvm::getUniversalCRTSdkDir(
getVFS(), WinSdkDir, WinSdkVersion,
573 WinSysRoot, UniversalCRTSdkPath,
577 if (!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
578 WinSdkVersion.has_value())
579 UCRTVersion = *WinSdkVersion;
581 StringRef ArchName = llvm::archToWindowsSDKArch(
getArch());
582 if (ArchName.empty())
586 llvm::sys::path::append(LibPath,
"Lib", UCRTVersion,
"ucrt", ArchName);
588 Path = std::string(LibPath.str());
593 VersionTuple Version;
596 llvm::sys::path::append(ClExe,
"cl.exe");
598 std::wstring ClExeWide;
599 if (!llvm::ConvertUTF8toWide(ClExe.c_str(), ClExeWide))
602 const DWORD VersionSize = ::GetFileVersionInfoSizeW(ClExeWide.c_str(),
604 if (VersionSize == 0)
608 if (!::GetFileVersionInfoW(ClExeWide.c_str(), 0, VersionSize,
609 VersionBlock.data()))
612 VS_FIXEDFILEINFO *FileInfo =
nullptr;
613 UINT FileInfoSize = 0;
614 if (!::VerQueryValueW(VersionBlock.data(), L
"\\",
615 reinterpret_cast<LPVOID *
>(&FileInfo), &FileInfoSize) ||
616 FileInfoSize <
sizeof(*FileInfo))
619 const unsigned Major = (FileInfo->dwFileVersionMS >> 16) & 0xFFFF;
620 const unsigned Minor = (FileInfo->dwFileVersionMS ) & 0xFFFF;
621 const unsigned Micro = (FileInfo->dwFileVersionLS >> 16) & 0xFFFF;
623 Version = VersionTuple(Major, Minor, Micro);
629 const ArgList &DriverArgs, ArgStringList &CC1Args,
630 const std::string &folder,
const Twine &subfolder1,
const Twine &subfolder2,
631 const Twine &subfolder3)
const {
633 llvm::sys::path::append(path, subfolder1, subfolder2, subfolder3);
638 ArgStringList &CC1Args)
const {
639 if (DriverArgs.hasArg(options::OPT_nostdinc))
642 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
648 for (
const auto &Path : DriverArgs.getAllArgValues(options::OPT__SLASH_imsvc))
651 auto AddSystemIncludesFromEnv = [&](StringRef Var) ->
bool {
652 if (
auto Val = llvm::sys::Process::GetEnv(Var)) {
654 StringRef(*Val).split(Dirs,
";", -1,
false);
664 for (
const auto &Var :
665 DriverArgs.getAllArgValues(options::OPT__SLASH_external_env)) {
666 AddSystemIncludesFromEnv(Var);
670 if (
const Arg *A = DriverArgs.getLastArg(options::OPT__SLASH_diasdkdir,
671 options::OPT__SLASH_winsysroot)) {
676 if (A->getOption().getID() == options::OPT__SLASH_winsysroot)
677 llvm::sys::path::append(DIASDKPath,
"DIA SDK");
682 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
687 if (!DriverArgs.getLastArg(options::OPT__SLASH_vctoolsdir,
688 options::OPT__SLASH_winsysroot)) {
689 bool Found = AddSystemIncludesFromEnv(
"INCLUDE");
690 Found |= AddSystemIncludesFromEnv(
"EXTERNAL_INCLUDE");
697 if (!VCToolChainPath.empty()) {
705 std::string UniversalCRTSdkPath;
706 std::string UCRTVersion;
707 if (llvm::getUniversalCRTSdkDir(
getVFS(), WinSdkDir, WinSdkVersion,
708 WinSysRoot, UniversalCRTSdkPath,
710 if (!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
711 WinSdkVersion.has_value())
712 UCRTVersion = *WinSdkVersion;
714 "Include", UCRTVersion,
"ucrt");
718 std::string WindowsSDKDir;
720 std::string windowsSDKIncludeVersion;
721 std::string windowsSDKLibVersion;
722 if (llvm::getWindowsSDKDir(
getVFS(), WinSdkDir, WinSdkVersion, WinSysRoot,
723 WindowsSDKDir, major, windowsSDKIncludeVersion,
724 windowsSDKLibVersion)) {
726 if (!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
727 WinSdkVersion.has_value())
728 windowsSDKIncludeVersion = windowsSDKLibVersion = *WinSdkVersion;
733 "Include", windowsSDKIncludeVersion,
736 "Include", windowsSDKIncludeVersion,
739 "Include", windowsSDKIncludeVersion,
742 llvm::VersionTuple Tuple;
743 if (!Tuple.tryParse(windowsSDKIncludeVersion) &&
744 Tuple.getSubminor().value_or(0) >= 17134) {
746 "Include", windowsSDKIncludeVersion,
762 const StringRef Paths[] = {
763 "C:/Program Files/Microsoft Visual Studio 10.0/VC/include",
764 "C:/Program Files/Microsoft Visual Studio 9.0/VC/include",
765 "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
766 "C:/Program Files/Microsoft Visual Studio 8/VC/include",
767 "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include"
774 ArgStringList &CC1Args)
const {
779 const ArgList &Args)
const {
780 bool IsWindowsMSVC =
getTriple().isWindowsMSVCEnvironment();
783 MSVT =
getTriple().getEnvironmentVersion();
784 if (MSVT.empty() && IsWindowsMSVC)
788 Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
794 MSVT = VersionTuple(19, 20);
805 MSVT = VersionTuple(MSVT.getMajor(), MSVT.getMinor().value_or(0),
806 MSVT.getSubminor().value_or(0));
811 if (Triple.getEnvironment() == llvm::Triple::MSVC) {
812 StringRef ObjFmt = Triple.getEnvironmentName().split(
'-').second;
814 Triple.setEnvironmentName((Twine(
"msvc") + MSVT.getAsString()).str());
816 Triple.setEnvironmentName(
817 (Twine(
"msvc") + MSVT.getAsString() + Twine(
'-') + ObjFmt).str());
819 return Triple.getTriple();
824 Res |= SanitizerKind::Address;
825 Res |= SanitizerKind::PointerCompare;
826 Res |= SanitizerKind::PointerSubtract;
827 Res |= SanitizerKind::Fuzzer;
828 Res |= SanitizerKind::FuzzerNoLink;
834 bool SupportsForcingFramePointer,
835 const char *ExpandChar,
const OptTable &Opts) {
836 assert(A->getOption().matches(options::OPT__SLASH_O));
838 StringRef OptStr = A->getValue();
839 for (
size_t I = 0, E = OptStr.size(); I != E; ++I) {
840 const char &OptChar = *(OptStr.data() + I);
850 if (&OptChar != ExpandChar) {
854 if (OptChar ==
'd') {
855 DAL.AddFlagArg(A, Opts.getOption(options::OPT_O0));
857 if (OptChar ==
'1') {
858 DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"s");
859 }
else if (OptChar ==
'2' || OptChar ==
'x') {
860 DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
861 DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"2");
863 if (SupportsForcingFramePointer &&
864 !DAL.hasArgNoClaim(options::OPT_fno_omit_frame_pointer))
865 DAL.AddFlagArg(A, Opts.getOption(options::OPT_fomit_frame_pointer));
866 if (OptChar ==
'1' || OptChar ==
'2')
867 DAL.AddFlagArg(A, Opts.getOption(options::OPT_ffunction_sections));
871 if (I + 1 != E && isdigit(OptStr[I + 1])) {
872 switch (OptStr[I + 1]) {
874 DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_inline));
877 DAL.AddFlagArg(A, Opts.getOption(options::OPT_finline_hint_functions));
880 DAL.AddFlagArg(A, Opts.getOption(options::OPT_finline_functions));
890 if (I + 1 != E && OptStr[I + 1] ==
'-') {
892 DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_builtin));
894 DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
898 DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"s");
901 DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"2");
904 bool OmitFramePointer =
true;
905 if (I + 1 != E && OptStr[I + 1] ==
'-') {
906 OmitFramePointer =
false;
909 if (SupportsForcingFramePointer) {
910 if (OmitFramePointer)
912 Opts.getOption(options::OPT_fomit_frame_pointer));
915 A, Opts.getOption(options::OPT_fno_omit_frame_pointer));
930 const OptTable &Opts) {
931 assert(A->getOption().matches(options::OPT_D));
933 StringRef Val = A->getValue();
934 size_t Hash = Val.find(
'#');
935 if (Hash == StringRef::npos || Hash > Val.find(
'=')) {
940 std::string NewVal = std::string(Val);
942 DAL.AddJoinedArg(A, Opts.getOption(options::OPT_D), NewVal);
946 const OptTable &Opts) {
947 DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_twoPhase_));
948 DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_operator_names));
952 const OptTable &Opts) {
953 DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_twoPhase));
954 DAL.AddFlagArg(A, Opts.getOption(options::OPT_foperator_names));
957llvm::opt::DerivedArgList *
961 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
965 bool SupportsForcingFramePointer =
getArch() != llvm::Triple::x86_64;
976 const char *ExpandChar =
nullptr;
977 for (Arg *A : Args.filtered(options::OPT__SLASH_O)) {
978 StringRef OptStr = A->getValue();
979 for (
size_t I = 0, E = OptStr.size(); I != E; ++I) {
980 char OptChar = OptStr[I];
981 char PrevChar = I > 0 ? OptStr[I - 1] :
'0';
982 if (PrevChar ==
'b') {
986 if (OptChar ==
'1' || OptChar ==
'2' || OptChar ==
'x' || OptChar ==
'd')
987 ExpandChar = OptStr.data() + I;
991 for (Arg *A : Args) {
992 if (A->getOption().matches(options::OPT__SLASH_O)) {
995 TranslateOptArg(A, *DAL, SupportsForcingFramePointer, ExpandChar, Opts);
996 }
else if (A->getOption().matches(options::OPT_D)) {
999 }
else if (A->getOption().matches(options::OPT__SLASH_permissive)) {
1002 }
else if (A->getOption().matches(options::OPT__SLASH_permissive_)) {
1015 const ArgList &DriverArgs, ArgStringList &CC1Args,
1019 if (DriverArgs.hasFlag(options::OPT_fno_rtti, options::OPT_frtti,
1021 CC1Args.push_back(
"-D_HAS_STATIC_RTTI=0");
static void TranslatePermissiveMinus(Arg *A, llvm::opt::DerivedArgList &DAL, const OptTable &Opts)
static VersionTuple getMSVCVersionFromExe(const std::string &BinDir)
static bool canExecute(llvm::vfs::FileSystem &VFS, StringRef Path)
static std::string FindVisualStudioExecutable(const ToolChain &TC, const char *Exe)
static void TranslateDArg(Arg *A, llvm::opt::DerivedArgList &DAL, const OptTable &Opts)
static void TranslateOptArg(Arg *A, llvm::opt::DerivedArgList &DAL, bool SupportsForcingFramePointer, const char *ExpandChar, const OptTable &Opts)
static void TranslatePermissive(Arg *A, llvm::opt::DerivedArgList &DAL, const OptTable &Opts)
Defines version macros and version-related utility functions for Clang.
The base class of the type hierarchy.
Compilation - A set of tasks to perform for a single driver invocation.
void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
void print(raw_ostream &OS) const
Print information about the detected CUDA installation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
const llvm::opt::OptTable & getOpts() 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.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
StringRef getLibPath() const
Get the detected Rocm library path.
void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
void print(raw_ostream &OS) const
Print information about the detected ROCm installation.
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport AtFileUTF16()