;
49 autoStatus = VFS.status(
Path);
52 return(Status->getPermissions() & llvm::sys::fs::perms::all_exe) != 0;
63MSVC.getSubDirectoryPath(llvm::SubDirectoryType::Bin));
64llvm::sys::path::append(FilePath, Exe);
65 returnstd::string(
canExecute(TC.
getVFS(), FilePath) ? FilePath.str() : Exe);
72 const char*LinkingOutput)
const{
73ArgStringList CmdArgs;
80Args.MakeArgString(std::string(
"-out:") + Output.
getFilename()));
82 if(Args.hasArg(options::OPT_marm64x))
83CmdArgs.push_back(
"-machine:arm64x");
84 else if(TC.getTriple().isWindowsArm64EC())
85CmdArgs.push_back(
"-machine:arm64ec");
87 if(
constArg *A = Args.getLastArg(options::OPT_fveclib)) {
88StringRef
V= A->getValue();
90CmdArgs.push_back(Args.MakeArgString(
"--dependent-lib=amath"));
93 if(!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
94!
C.getDriver().IsCLMode() && !
C.getDriver().IsFlangMode()) {
95CmdArgs.push_back(
"-defaultlib:libcmt");
96CmdArgs.push_back(
"-defaultlib:oldnames");
104 if(
constArg *A = Args.getLastArg(options::OPT__SLASH_diasdkdir,
105options::OPT__SLASH_winsysroot)) {
110 if(A->getOption().getID() == options::OPT__SLASH_winsysroot)
111llvm::sys::path::append(DIAPath,
"DIA SDK");
114llvm::sys::path::append(DIAPath,
"lib",
115llvm::archToLegacyVCArch(TC.getArch()));
116CmdArgs.push_back(Args.MakeArgString(Twine(
"-libpath:") + DIAPath));
118 if(!llvm::sys::Process::GetEnv(
"LIB") ||
119Args.getLastArg(options::OPT__SLASH_vctoolsdir,
120options::OPT__SLASH_winsysroot)) {
121CmdArgs.push_back(Args.MakeArgString(
122Twine(
"-libpath:") +
123TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib)));
124CmdArgs.push_back(Args.MakeArgString(
125Twine(
"-libpath:") +
126TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib,
"atlmfc")));
128 if(!llvm::sys::Process::GetEnv(
"LIB") ||
129Args.getLastArg(options::OPT__SLASH_winsdkdir,
130options::OPT__SLASH_winsysroot)) {
131 if(TC.useUniversalCRT()) {
132std::string UniversalCRTLibPath;
133 if(TC.getUniversalCRTLibraryPath(Args, UniversalCRTLibPath))
135Args.MakeArgString(Twine(
"-libpath:") + UniversalCRTLibPath));
137std::string WindowsSdkLibPath;
138 if(TC.getWindowsSDKLibraryPath(Args, WindowsSdkLibPath))
140Args.MakeArgString(std::string(
"-libpath:") + WindowsSdkLibPath));
143 if(!
C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
144 for(
const auto&LibPath : Args.getAllArgValues(options::OPT_L))
145CmdArgs.push_back(Args.MakeArgString(
"-libpath:"+ LibPath));
147 if(
C.getDriver().IsFlangMode() &&
148!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
155CmdArgs.push_back(
"/subsystem:console");
160 for(
const auto&LibPath : TC.getLibraryPaths()) {
161 if(TC.getVFS().exists(LibPath))
162CmdArgs.push_back(Args.MakeArgString(
"-libpath:"+ LibPath));
164 autoCRTPath = TC.getCompilerRTPath();
165 if(TC.getVFS().exists(CRTPath))
166CmdArgs.push_back(Args.MakeArgString(
"-libpath:"+ CRTPath));
168CmdArgs.push_back(
"-nologo");
170 if(Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
171CmdArgs.push_back(
"-debug");
175 if(Args.hasArg(options::OPT_fms_hotpatch, options::OPT__SLASH_hotpatch))
176CmdArgs.push_back(
"-functionpadmin");
180 boolDefaultIncrementalLinkerCompatible =
181 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
182 if(!Args.hasFlag(options::OPT_mincremental_linker_compatible,
183options::OPT_mno_incremental_linker_compatible,
184DefaultIncrementalLinkerCompatible))
185CmdArgs.push_back(
"-Brepro");
187 boolDLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
188options::OPT_shared);
190CmdArgs.push_back(Args.MakeArgString(
"-dll"));
193llvm::sys::path::replace_extension(ImplibName,
"lib");
194CmdArgs.push_back(Args.MakeArgString(std::string(
"-implib:") + ImplibName));
197 if(TC.getSanitizerArgs(Args).needsFuzzer()) {
198 if(!Args.hasArg(options::OPT_shared))
200Args.MakeArgString(std::string(
"-wholearchive:") +
201TC.getCompilerRTArgString(Args,
"fuzzer")));
202CmdArgs.push_back(Args.MakeArgString(
"-debug"));
205CmdArgs.push_back(Args.MakeArgString(
"-incremental:no"));
208 if(TC.getSanitizerArgs(Args).needsAsanRt()) {
209CmdArgs.push_back(Args.MakeArgString(
"-debug"));
210CmdArgs.push_back(Args.MakeArgString(
"-incremental:no"));
211CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dynamic"));
212 autodefines = Args.getAllArgValues(options::OPT_D);
213 if(Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd) ||
214find(begin(defines), end(defines),
"_DLL") != end(defines)) {
217CmdArgs.push_back(Args.MakeArgString(
218TC.getArch() == llvm::Triple::x86
219?
"-include:___asan_seh_interceptor" 220:
"-include:__asan_seh_interceptor"));
223CmdArgs.push_back(Args.MakeArgString(
224std::string(
"-wholearchive:") +
225TC.getCompilerRT(Args,
"asan_dynamic_runtime_thunk")));
229CmdArgs.push_back(Args.MakeArgString(
230std::string(
"-wholearchive:") +
231TC.getCompilerRT(Args,
"asan_static_runtime_thunk")));
235Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
238 for(
constArg *A : Args.filtered(options::OPT__SLASH_guard)) {
239StringRef GuardArgs = A->getValue();
240 if(GuardArgs.equals_insensitive(
"cf") ||
241GuardArgs.equals_insensitive(
"cf,nochecks")) {
243CmdArgs.push_back(
"-guard:cf");
244}
else if(GuardArgs.equals_insensitive(
"cf-")) {
245CmdArgs.push_back(
"-guard:cf-");
246}
else if(GuardArgs.equals_insensitive(
"ehcont")) {
247CmdArgs.push_back(
"-guard:ehcont");
248}
else if(GuardArgs.equals_insensitive(
"ehcont-")) {
249CmdArgs.push_back(
"-guard:ehcont-");
253 if(Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
254options::OPT_fno_openmp,
false)) {
255CmdArgs.push_back(
"-nodefaultlib:vcomp.lib");
256CmdArgs.push_back(
"-nodefaultlib:vcompd.lib");
257CmdArgs.push_back(Args.MakeArgString(std::string(
"-libpath:") +
258TC.getDriver().Dir +
"/../lib"));
259 switch(TC.getDriver().getOpenMPRuntime(Args)) {
261CmdArgs.push_back(
"-defaultlib:libomp.lib");
264CmdArgs.push_back(
"-defaultlib:libiomp5md.lib");
276 if(!Args.hasArg(options::OPT_nostdlib)) {
281Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER);
285 else if(
Linker.equals_insensitive(
"lld"))
288 if(
Linker==
"lld-link") {
289 for(Arg *A : Args.filtered(options::OPT_vfsoverlay))
291Args.MakeArgString(std::string(
"/vfsoverlay:") + A->getValue()));
293 if(
C.getDriver().isUsingLTO() &&
294Args.hasFlag(options::OPT_gsplit_dwarf, options::OPT_gno_split_dwarf,
296CmdArgs.push_back(Args.MakeArgString(Twine(
"/dwodir:") +
301 for(
const auto&Input : Inputs) {
302 if(Input.isFilename()) {
303CmdArgs.push_back(Input.getFilename());
307 constArg &A = Input.getInputArg();
310 if(A.getOption().matches(options::OPT_l)) {
311StringRef Lib = A.getValue();
312 const char*LinkLibArg;
313 if(Lib.ends_with(
".lib"))
314LinkLibArg = Args.MakeArgString(Lib);
316LinkLibArg = Args.MakeArgString(Lib +
".lib");
317CmdArgs.push_back(LinkLibArg);
323A.renderAsInput(Args, CmdArgs);
328TC.addProfileRTLibs(Args, CmdArgs);
330std::vector<const char *> Environment;
335 if(
Linker.equals_insensitive(
"link")) {
341 if(!TC.FoundMSVCInstall() && !
canExecute(TC.getVFS(), linkPath)) {
343ClPath = TC.GetProgramPath(
"cl.exe");
345linkPath = llvm::sys::path::parent_path(ClPath);
346llvm::sys::path::append(linkPath,
"link.exe");
348 C.getDriver().Diag(clang::diag::warn_drv_msvc_not_found);
350 C.getDriver().Diag(clang::diag::warn_drv_msvc_not_found);
356 if(TC.getSanitizerArgs(Args).needsAsanRt())
357CmdArgs.push_back(
"/INFERASANLIBS:NO");
366 if(TC.getIsVS2017OrNewer() &&
367llvm::Triple(llvm::sys::getProcessTriple()).getArch() != TC.getArch()) {
368 autoHostArch = llvm::Triple(llvm::sys::getProcessTriple()).getArch();
371std::unique_ptr<wchar_t[], decltype(&FreeEnvironmentStringsW)>(
372GetEnvironmentStringsW(), FreeEnvironmentStringsW);
374 gotoSkipSettingEnvironment;
377 size_tEnvBlockLen = 0;
378 while(EnvBlockWide[EnvBlockLen] != L
'\0') {
380EnvBlockLen += std::wcslen(&EnvBlockWide[EnvBlockLen]) +
385std::string EnvBlock;
386 if(!llvm::convertUTF16ToUTF8String(
388EnvBlockLen *
sizeof(EnvBlockWide[0])),
390 gotoSkipSettingEnvironment;
392Environment.reserve(EnvCount);
397 for(
const char*Cursor = EnvBlock.data(); *Cursor !=
'\0';) {
398llvm::StringRef EnvVar(Cursor);
399 if(EnvVar.starts_with_insensitive(
"path=")) {
400 constexpr size_tPrefixLen = 5;
401Environment.push_back(Args.MakeArgString(
402EnvVar.substr(0, PrefixLen) +
403TC.getSubDirectoryPath(llvm::SubDirectoryType::Bin) +
404llvm::Twine(llvm::sys::EnvPathSeparator) +
405TC.getSubDirectoryPath(llvm::SubDirectoryType::Bin, HostArch) +
406(EnvVar.size() > PrefixLen
407? llvm::Twine(llvm::sys::EnvPathSeparator) +
408EnvVar.substr(PrefixLen)
411Environment.push_back(Args.MakeArgString(EnvVar));
413Cursor += EnvVar.size() + 1
;
416SkipSettingEnvironment:;
419linkPath = TC.GetProgramPath(
Linker.str().c_str());
422 autoLinkCmd = std::make_unique<Command>(
424Args.MakeArgString(linkPath), CmdArgs, Inputs, Output);
425 if(!Environment.empty())
426LinkCmd->setEnvironment(Environment);
427 C.addCommand(std::move(LinkCmd));
432:
ToolChain(
D, Triple, Args), CudaInstallation(
D, Triple, Args),
433RocmInstallation(
D, Triple, Args), SYCLInstallation(
D, Triple, Args) {
436std::optional<llvm::StringRef> VCToolsDir, VCToolsVersion;
437 if(Arg *A = Args.getLastArg(options::OPT__SLASH_vctoolsdir))
438VCToolsDir = A->getValue();
439 if(Arg *A = Args.getLastArg(options::OPT__SLASH_vctoolsversion))
440VCToolsVersion = A->getValue();
441 if(Arg *A = Args.getLastArg(options::OPT__SLASH_winsdkdir))
442WinSdkDir = A->getValue();
443 if(Arg *A = Args.getLastArg(options::OPT__SLASH_winsdkversion))
444WinSdkVersion = A->getValue();
445 if(Arg *A = Args.getLastArg(options::OPT__SLASH_winsysroot))
446WinSysRoot = A->getValue();
452llvm::findVCToolChainViaCommandLine(
getVFS(), VCToolsDir, VCToolsVersion,
453WinSysRoot, VCToolChainPath, VSLayout) ||
454llvm::findVCToolChainViaEnvironment(
getVFS(), VCToolChainPath,
456llvm::findVCToolChainViaSetupConfig(
getVFS(), VCToolsVersion,
457VCToolChainPath, VSLayout) ||
458llvm::findVCToolChainViaRegistry(VCToolChainPath, VSLayout);
481 if(
getArch() == llvm::Triple::x86_64 ||
getArch() == llvm::Triple::arm ||
482 getArch() == llvm::Triple::thumb ||
getArch() == llvm::Triple::aarch64)
489 return getArch() == llvm::Triple::x86_64 ||
490 getArch() == llvm::Triple::aarch64;
498 return getArch() == llvm::Triple::x86_64 ||
499 getArch() == llvm::Triple::aarch64;
503ArgStringList &CC1Args)
const{
504CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);
508ArgStringList &CC1Args)
const{
509RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
513ArgStringList &CC1Args)
const{
514SYCLInstallation->addSYCLIncludeArgs(DriverArgs, CC1Args);
518ArgStringList &CmdArgs)
const{
519CmdArgs.append({Args.MakeArgString(StringRef(
"-libpath:") +
520RocmInstallation->getLibPath()),
525CudaInstallation->print(OS);
526RocmInstallation->print(OS);
531llvm::StringRef SubdirParent)
const{
532 returnllvm::getSubDirectoryPath(
Type, VSLayout, VCToolChainPath,
getArch(),
538llvm::Triple::ArchType TargetArch)
const{
539 returnllvm::getSubDirectoryPath(
Type, VSLayout, VCToolChainPath, TargetArch,
549std::string &path)
const{
552std::string windowsSDKIncludeVersion;
553std::string windowsSDKLibVersion;
556 if(!llvm::getWindowsSDKDir(
getVFS(), WinSdkDir, WinSdkVersion, WinSysRoot,
557sdkPath, sdkMajor, windowsSDKIncludeVersion,
558windowsSDKLibVersion))
562llvm::sys::path::append(libPath,
"Lib");
564 if(!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
565WinSdkVersion.has_value())
566windowsSDKLibVersion = *WinSdkVersion;
568llvm::sys::path::append(libPath, windowsSDKLibVersion,
"um");
569 returnllvm::appendArchToWindowsSDKLibPath(sdkMajor, libPath,
getArch(),
574 returnllvm::useUniversalCRT(VSLayout, VCToolChainPath,
getArch(),
getVFS());
578std::string &
Path)
const{
579std::string UniversalCRTSdkPath;
580std::string UCRTVersion;
583 if(!llvm::getUniversalCRTSdkDir(
getVFS(), WinSdkDir, WinSdkVersion,
584WinSysRoot, UniversalCRTSdkPath,
588 if(!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
589WinSdkVersion.has_value())
590UCRTVersion = *WinSdkVersion;
592StringRef ArchName = llvm::archToWindowsSDKArch(
getArch());
593 if(ArchName.empty())
597llvm::sys::path::append(LibPath,
"Lib", UCRTVersion,
"ucrt", ArchName);
599 Path= std::string(LibPath);
604VersionTuple Version;
607llvm::sys::path::append(ClExe,
"cl.exe");
609std::wstring ClExeWide;
610 if(!llvm::ConvertUTF8toWide(ClExe.c_str(), ClExeWide))
613 constDWORD VersionSize = ::GetFileVersionInfoSizeW(ClExeWide.c_str(),
615 if(VersionSize == 0)
619 if(!::GetFileVersionInfoW(ClExeWide.c_str(), 0, VersionSize,
620VersionBlock.data()))
623VS_FIXEDFILEINFO *FileInfo =
nullptr;
624UINT FileInfoSize = 0;
625 if(!::VerQueryValueW(VersionBlock.data(), L
"\\",
626 reinterpret_cast<LPVOID *
>(&FileInfo), &FileInfoSize) ||
627FileInfoSize <
sizeof(*FileInfo))
630 const unsignedMajor = (FileInfo->dwFileVersionMS >> 16) & 0xFFFF;
631 const unsignedMinor = (FileInfo->dwFileVersionMS ) & 0xFFFF;
632 const unsignedMicro = (FileInfo->dwFileVersionLS >> 16) & 0xFFFF;
634Version = VersionTuple(Major, Minor, Micro);
640 constArgList &DriverArgs, ArgStringList &CC1Args,
641 conststd::string &folder,
constTwine &subfolder1,
constTwine &subfolder2,
642 constTwine &subfolder3)
const{
644llvm::sys::path::append(path, subfolder1, subfolder2, subfolder3);
649ArgStringList &CC1Args)
const{
650 if(DriverArgs.hasArg(options::OPT_nostdinc))
653 if(!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
659 for(
const auto&
Path: DriverArgs.getAllArgValues(options::OPT__SLASH_imsvc))
662 autoAddSystemIncludesFromEnv = [&](StringRef Var) ->
bool{
663 if(
autoVal = llvm::sys::Process::GetEnv(Var)) {
665StringRef(*Val).split(Dirs,
";",
-1,
false);
675 for(
const auto&Var :
676DriverArgs.getAllArgValues(options::OPT__SLASH_external_env)) {
677AddSystemIncludesFromEnv(Var);
681 if(
constArg *A = DriverArgs.getLastArg(options::OPT__SLASH_diasdkdir,
682options::OPT__SLASH_winsysroot)) {
687 if(A->getOption().getID() == options::OPT__SLASH_winsysroot)
688llvm::sys::path::append(DIASDKPath,
"DIA SDK");
693 if(DriverArgs.hasArg(options::OPT_nostdlibinc))
698 if(!DriverArgs.getLastArg(options::OPT__SLASH_vctoolsdir,
699options::OPT__SLASH_winsysroot)) {
700 bool Found= AddSystemIncludesFromEnv(
"INCLUDE");
701 Found|= AddSystemIncludesFromEnv(
"EXTERNAL_INCLUDE");
708 if(!VCToolChainPath.empty()) {
716std::string UniversalCRTSdkPath;
717std::string UCRTVersion;
718 if(llvm::getUniversalCRTSdkDir(
getVFS(), WinSdkDir, WinSdkVersion,
719WinSysRoot, UniversalCRTSdkPath,
721 if(!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
722WinSdkVersion.has_value())
723UCRTVersion = *WinSdkVersion;
725 "Include", UCRTVersion,
"ucrt");
729std::string WindowsSDKDir;
731std::string windowsSDKIncludeVersion;
732std::string windowsSDKLibVersion;
733 if(llvm::getWindowsSDKDir(
getVFS(), WinSdkDir, WinSdkVersion, WinSysRoot,
734WindowsSDKDir, major, windowsSDKIncludeVersion,
735windowsSDKLibVersion)) {
737 if(!(WinSdkDir.has_value() || WinSysRoot.has_value()) &&
738WinSdkVersion.has_value())
739windowsSDKIncludeVersion = windowsSDKLibVersion = *WinSdkVersion;
744 "Include", windowsSDKIncludeVersion,
747 "Include", windowsSDKIncludeVersion,
750 "Include", windowsSDKIncludeVersion,
753llvm::VersionTuple Tuple;
754 if(!Tuple.tryParse(windowsSDKIncludeVersion) &&
755Tuple.getSubminor().value_or(0) >= 17134) {
757 "Include", windowsSDKIncludeVersion,
773 constStringRef Paths[] = {
774 "C:/Program Files/Microsoft Visual Studio 10.0/VC/include",
775 "C:/Program Files/Microsoft Visual Studio 9.0/VC/include",
776 "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
777 "C:/Program Files/Microsoft Visual Studio 8/VC/include",
778 "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include" 785ArgStringList &CC1Args)
const{
790 constArgList &Args)
const{
791 boolIsWindowsMSVC =
getTriple().isWindowsMSVCEnvironment();
794MSVT =
getTriple().getEnvironmentVersion();
795 if(MSVT.empty() && IsWindowsMSVC)
799Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
805MSVT = VersionTuple(19, 33);
816MSVT = VersionTuple(MSVT.getMajor(), MSVT.getMinor().value_or(0),
817MSVT.getSubminor().value_or(0));
822 if(Triple.getEnvironment() == llvm::Triple::MSVC) {
823StringRef ObjFmt = Triple.getEnvironmentName().split(
'-').second;
825Triple.setEnvironmentName((Twine(
"msvc") + MSVT.getAsString()).str());
827Triple.setEnvironmentName(
828(Twine(
"msvc") + MSVT.getAsString() + Twine(
'-') + ObjFmt).str());
830 returnTriple.getTriple();
835Res |= SanitizerKind::Address;
836Res |= SanitizerKind::PointerCompare;
837Res |= SanitizerKind::PointerSubtract;
838Res |= SanitizerKind::Fuzzer;
839Res |= SanitizerKind::FuzzerNoLink;
845 boolSupportsForcingFramePointer,
846 const char*ExpandChar,
constOptTable &Opts) {
847assert(A->getOption().matches(options::OPT__SLASH_O));
849StringRef OptStr = A->getValue();
850 for(
size_tI = 0,
E= OptStr.size(); I !=
E; ++I) {
851 const char&OptChar = *(OptStr.data() + I);
861 if(&OptChar != ExpandChar) {
865 if(OptChar ==
'd') {
866DAL.AddFlagArg(A, Opts.getOption(options::OPT_O0));
868 if(OptChar ==
'1') {
869DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"s");
870}
else if(OptChar ==
'2'|| OptChar ==
'x') {
871DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
872DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"3");
874 if(SupportsForcingFramePointer &&
875!DAL.hasArgNoClaim(options::OPT_fno_omit_frame_pointer))
876DAL.AddFlagArg(A, Opts.getOption(options::OPT_fomit_frame_pointer));
877 if(OptChar ==
'1'|| OptChar ==
'2')
878DAL.AddFlagArg(A, Opts.getOption(options::OPT_ffunction_sections));
882 if(I + 1 !=
E&& isdigit(OptStr[I + 1])) {
883 switch(OptStr[I + 1]) {
885DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_inline));
888DAL.AddFlagArg(A, Opts.getOption(options::OPT_finline_hint_functions));
892DAL.AddFlagArg(A, Opts.getOption(options::OPT_finline_functions));
902 if(I + 1 !=
E&& OptStr[I + 1] ==
'-') {
904DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_builtin));
906DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
910DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"s");
913DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O),
"3");
916 boolOmitFramePointer =
true;
917 if(I + 1 !=
E&& OptStr[I + 1] ==
'-') {
918OmitFramePointer =
false;
921 if(SupportsForcingFramePointer) {
922 if(OmitFramePointer)
924Opts.getOption(options::OPT_fomit_frame_pointer));
927A, Opts.getOption(options::OPT_fno_omit_frame_pointer));
942 constOptTable &Opts) {
943assert(A->getOption().matches(options::OPT_D));
945StringRef Val = A->getValue();
946 size_tHash = Val.find(
'#');
947 if(Hash == StringRef::npos || Hash > Val.find(
'=')) {
952std::string NewVal = std::string(Val);
954DAL.AddJoinedArg(A, Opts.getOption(options::OPT_D), NewVal);
958 constOptTable &Opts) {
959DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_twoPhase_));
960DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_operator_names));
964 constOptTable &Opts) {
965DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_twoPhase));
966DAL.AddFlagArg(A, Opts.getOption(options::OPT_foperator_names));
969llvm::opt::DerivedArgList *
973DerivedArgList *DAL =
newDerivedArgList(Args.getBaseArgs());
977 boolSupportsForcingFramePointer =
getArch() != llvm::Triple::x86_64;
988 const char*ExpandChar =
nullptr;
989 for(Arg *A : Args.filtered(options::OPT__SLASH_O)) {
990StringRef OptStr = A->getValue();
991 for(
size_tI = 0,
E= OptStr.size(); I !=
E; ++I) {
992 charOptChar = OptStr[I];
993 charPrevChar = I > 0 ? OptStr[I - 1] :
'0';
994 if(PrevChar ==
'b') {
998 if(OptChar ==
'1'|| OptChar ==
'2'|| OptChar ==
'x'|| OptChar ==
'd')
999ExpandChar = OptStr.data() + I;
1003 for(Arg *A : Args) {
1004 if(A->getOption().matches(options::OPT__SLASH_O)) {
1007 TranslateOptArg(A, *DAL, SupportsForcingFramePointer, ExpandChar, Opts);
1008}
else if(A->getOption().matches(options::OPT_D)) {
1011}
else if(A->getOption().matches(options::OPT__SLASH_permissive)) {
1014}
else if(A->getOption().matches(options::OPT__SLASH_permissive_)) {
1027 constArgList &DriverArgs, ArgStringList &CC1Args,
1031 if(DriverArgs.hasFlag(options::OPT_fno_rtti, options::OPT_frtti,
1033CC1Args.push_back(
"-D_HAS_STATIC_RTTI=0");
1035 if(Arg *A = DriverArgs.getLastArgNoClaim(options::OPT_marm64x))
1036A->ignoreTargetSpecific();
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.
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.
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr ResponseFileSupport AtFileUTF16()
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