diff options
author | Reid Kleckner <rnk@google.com> | 2017-02-02 19:36:22 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2017-02-02 19:36:22 +0000 |
commit | bf18355d5c654a8ecad8a0160c48669203dc509a (patch) | |
tree | a61686c1527fc2e168b58f07f9628febe1d8dc2d /clang/lib/Driver/Tools.cpp | |
parent | 723fabfcdf08968ea3534ca5993afa38b749925b (diff) | |
download | bcm5719-llvm-bf18355d5c654a8ecad8a0160c48669203dc509a.tar.gz bcm5719-llvm-bf18355d5c654a8ecad8a0160c48669203dc509a.zip |
Revert "[Driver] Updated for Visual Studio 2017"
This reverts commit r293923. It causes test failures on Linux that need
time to debug.
llvm-svn: 293924
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 63 |
1 files changed, 45 insertions, 18 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 29eb9a287a2..910b5106e98 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -10888,12 +10888,19 @@ void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA, // making sure that whatever executable that's found is not a same-named exe // from clang itself to prevent clang from falling back to itself. static std::string FindVisualStudioExecutable(const ToolChain &TC, - const char *Exe) { + const char *Exe, + const char *ClangProgramPath) { const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC); - SmallString<128> FilePath(MSVC.getSubDirectoryPath(toolchains::MSVCToolChain - ::SubDirectoryType::Bin)); - llvm::sys::path::append(FilePath, Exe); - return (llvm::sys::fs::can_execute(FilePath) ? FilePath.str() : Exe); + std::string visualStudioBinDir; + if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath, + visualStudioBinDir)) { + SmallString<128> FilePath(visualStudioBinDir); + llvm::sys::path::append(FilePath, Exe); + if (llvm::sys::fs::can_execute(FilePath.c_str())) + return FilePath.str(); + } + + return Exe; } void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, @@ -10902,7 +10909,7 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, const ArgList &Args, const char *LinkingOutput) const { ArgStringList CmdArgs; - auto &TC = static_cast<const toolchains::MSVCToolChain &>(getToolChain()); + const ToolChain &TC = getToolChain(); assert((Output.isFilename() || Output.isNothing()) && "invalid output"); if (Output.isFilename()) @@ -10918,20 +10925,37 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, // did not run vcvarsall), try to build a consistent link environment. If // the environment variable is set however, assume the user knows what // they're doing. - CmdArgs.push_back(Args.MakeArgString( - std::string("-libpath:") - + TC.getSubDirectoryPath(toolchains::MSVCToolChain - ::SubDirectoryType::Lib))); + std::string VisualStudioDir; + const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC); + if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) { + SmallString<128> LibDir(VisualStudioDir); + llvm::sys::path::append(LibDir, "VC", "lib"); + switch (MSVC.getArch()) { + case llvm::Triple::x86: + // x86 just puts the libraries directly in lib + break; + case llvm::Triple::x86_64: + llvm::sys::path::append(LibDir, "amd64"); + break; + case llvm::Triple::arm: + llvm::sys::path::append(LibDir, "arm"); + break; + default: + break; + } + CmdArgs.push_back( + Args.MakeArgString(std::string("-libpath:") + LibDir.c_str())); - if (TC.useUniversalCRT()) { - std::string UniversalCRTLibPath; - if (TC.getUniversalCRTLibraryPath(UniversalCRTLibPath)) - CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") - + UniversalCRTLibPath)); + if (MSVC.useUniversalCRT(VisualStudioDir)) { + std::string UniversalCRTLibPath; + if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath)) + CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + + UniversalCRTLibPath)); + } } std::string WindowsSdkLibPath; - if (TC.getWindowsSDKLibraryPath(WindowsSdkLibPath)) + if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath)) CmdArgs.push_back( Args.MakeArgString(std::string("-libpath:") + WindowsSdkLibPath)); } @@ -11055,7 +11079,8 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, // If we're using the MSVC linker, it's not sufficient to just use link // from the program PATH, because other environments like GnuWin32 install // their own link.exe which may come first. - linkPath = FindVisualStudioExecutable(TC, "link.exe"); + linkPath = FindVisualStudioExecutable(TC, "link.exe", + C.getDriver().getClangProgramPath()); } else { linkPath = Linker; llvm::sys::path::replace_extension(linkPath, "exe"); @@ -11188,7 +11213,9 @@ std::unique_ptr<Command> visualstudio::Compiler::GetCommand( Args.MakeArgString(std::string("/Fo") + Output.getFilename()); CmdArgs.push_back(Fo); - std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe"); + const Driver &D = getToolChain().getDriver(); + std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe", + D.getClangProgramPath()); return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs, Inputs); } |