1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===--- ToolChains.cpp - ToolChain Implementations -----------------------===// 2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// 3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// The LLVM Compiler Infrastructure 4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// 5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// This file is distributed under the University of Illinois Open Source 6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// License. See LICENSE.TXT for details. 7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// 8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===// 9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "ToolChains.h" 11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Basic/CharInfo.h" 12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Basic/Version.h" 13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Driver/Compilation.h" 14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Driver/Driver.h" 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Driver/DriverDiagnostic.h" 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Driver/Options.h" 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/ADT/StringExtras.h" 18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Config/llvm-config.h" 19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Option/Arg.h" 20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Option/ArgList.h" 21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Support/ErrorHandling.h" 22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Support/FileSystem.h" 23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Support/Process.h" 240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include <cstdio> 25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Include the necessary headers to interface with the Windows registry and 27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// environment. 28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if defined(LLVM_ON_WIN32) 29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define USE_WIN32 30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif 31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifdef USE_WIN32 33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines #define WIN32_LEAN_AND_MEAN 34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines #define NOGDI 350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines #ifndef NOMINMAX 360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines #define NOMINMAX 370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines #endif 38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines #include <windows.h> 39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif 40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace clang::driver; 42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace clang::driver::toolchains; 43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace clang; 44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace llvm::opt; 45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesMSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple& Triple, 47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const ArgList &Args) 48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : ToolChain(D, Triple, Args) { 490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines getProgramPaths().push_back(getDriver().getInstalledDir()); 500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (getDriver().getInstalledDir() != getDriver().Dir) 510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines getProgramPaths().push_back(getDriver().Dir); 52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTool *MSVCToolChain::buildLinker() const { 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return new tools::visualstudio::Link(*this); 56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTool *MSVCToolChain::buildAssembler() const { 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (getTriple().isOSBinFormatMachO()) 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return new tools::darwin::Assemble(*this); 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getDriver().Diag(clang::diag::err_no_external_assembler); 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return nullptr; 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::IsIntegratedAssemblerDefault() const { 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::IsUnwindTablesDefault() const { 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Emit unwind tables by default on Win64. All non-x86_32 Windows platforms 71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // such as ARM and PPC actually require unwind tables, but LLVM doesn't know 72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // how to generate them yet. 73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getArch() == llvm::Triple::x86_64; 74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::isPICDefault() const { 77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getArch() == llvm::Triple::x86_64; 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::isPIEDefault() const { 81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::isPICDefaultForced() const { 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getArch() == llvm::Triple::x86_64; 86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifdef USE_WIN32 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic bool readFullStringValue(HKEY hkey, const char *valueName, 90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string &value) { 91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: We should be using the W versions of the registry functions, but 92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // doing so requires UTF8 / UTF16 conversions similar to how we handle command 93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // line arguments. The UTF8 conversion functions are not exposed publicly 94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // from LLVM though, so in order to do this we will probably need to create 95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // a registry abstraction in LLVMSupport that is Windows only. 96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DWORD result = 0; 97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DWORD valueSize = 0; 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DWORD type = 0; 99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // First just query for the required size. 100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines result = RegQueryValueEx(hkey, valueName, NULL, &type, NULL, &valueSize); 101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (result != ERROR_SUCCESS || type != REG_SZ) 102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<BYTE> buffer(valueSize); 104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines result = RegQueryValueEx(hkey, valueName, NULL, NULL, &buffer[0], &valueSize); 105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (result == ERROR_SUCCESS) 106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines value.assign(reinterpret_cast<const char *>(buffer.data())); 107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return result; 108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif 110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief Read registry string. 112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// This also supports a means to look for high-versioned keys by use 113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// of a $VERSION placeholder in the key path. 114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// $VERSION in the key path is a placeholder for the version number, 115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// causing the highest value path to be searched for and used. 116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// I.e. "SOFTWARE\\Microsoft\\VisualStudio\\$VERSION". 117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// There can be additional characters in the component. Only the numeric 118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// characters are compared. This function only searches HKLM. 119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic bool getSystemRegistryString(const char *keyPath, const char *valueName, 120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string &value, std::string *phValue) { 121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef USE_WIN32 122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#else 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines HKEY hRootKey = HKEY_LOCAL_MACHINE; 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines HKEY hKey = NULL; 126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines long lResult; 127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool returnValue = false; 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *placeHolder = strstr(keyPath, "$VERSION"); 130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string bestName; 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If we have a $VERSION placeholder, do the highest-version search. 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (placeHolder) { 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *keyEnd = placeHolder - 1; 134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *nextKey = placeHolder; 135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Find end of previous key. 136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while ((keyEnd > keyPath) && (*keyEnd != '\\')) 137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines keyEnd--; 138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Find end of key containing $VERSION. 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (*nextKey && (*nextKey != '\\')) 140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextKey++; 141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines size_t partialKeyLength = keyEnd - keyPath; 142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines char partialKey[256]; 143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (partialKeyLength > sizeof(partialKey)) 144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines partialKeyLength = sizeof(partialKey); 145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines strncpy(partialKey, keyPath, partialKeyLength); 146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines partialKey[partialKeyLength] = '\0'; 147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines HKEY hTopKey = NULL; 148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines lResult = RegOpenKeyEx(hRootKey, partialKey, 0, KEY_READ | KEY_WOW64_32KEY, 149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines &hTopKey); 150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (lResult == ERROR_SUCCESS) { 151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines char keyName[256]; 152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines double bestValue = 0.0; 153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DWORD index, size = sizeof(keyName) - 1; 154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (index = 0; RegEnumKeyEx(hTopKey, index, keyName, &size, NULL, 155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines NULL, NULL, NULL) == ERROR_SUCCESS; index++) { 156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *sp = keyName; 157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (*sp && !isDigit(*sp)) 158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines sp++; 159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!*sp) 160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *ep = sp + 1; 162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (*ep && (isDigit(*ep) || (*ep == '.'))) 163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ep++; 164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines char numBuf[32]; 165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines strncpy(numBuf, sp, sizeof(numBuf) - 1); 166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines numBuf[sizeof(numBuf) - 1] = '\0'; 167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines double dvalue = strtod(numBuf, NULL); 168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (dvalue > bestValue) { 169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Test that InstallDir is indeed there before keeping this index. 170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Open the chosen key path remainder. 171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bestName = keyName; 172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Append rest of key. 173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bestName.append(nextKey); 174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines lResult = RegOpenKeyEx(hTopKey, bestName.c_str(), 0, 175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines KEY_READ | KEY_WOW64_32KEY, &hKey); 176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (lResult == ERROR_SUCCESS) { 177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines lResult = readFullStringValue(hKey, valueName, value); 178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (lResult == ERROR_SUCCESS) { 179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bestValue = dvalue; 180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (phValue) 181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines *phValue = bestName; 182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines returnValue = true; 183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RegCloseKey(hKey); 185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines size = sizeof(keyName) - 1; 188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 189176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RegCloseKey(hTopKey); 190176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines lResult = 193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RegOpenKeyEx(hRootKey, keyPath, 0, KEY_READ | KEY_WOW64_32KEY, &hKey); 194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (lResult == ERROR_SUCCESS) { 195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines lResult = readFullStringValue(hKey, valueName, value); 196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (lResult == ERROR_SUCCESS) 197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines returnValue = true; 198176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (phValue) 199176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines phValue->clear(); 200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RegCloseKey(hKey); 201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 202176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return returnValue; 204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif // USE_WIN32 205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief Get Windows SDK installation directory. 208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::getWindowsSDKDir(std::string &path, int &major, 209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int &minor) const { 210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string sdkVersion; 211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Try the Windows registry. 212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool hasSDKDir = getSystemRegistryString( 213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\$VERSION", 214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "InstallationFolder", path, &sdkVersion); 215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!sdkVersion.empty()) 2160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::sscanf(sdkVersion.c_str(), "v%d.%d", &major, &minor); 217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return hasSDKDir && !path.empty(); 218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Gets the library path required to link against the Windows SDK. 221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::getWindowsSDKLibraryPath(std::string &path) const { 222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string sdkPath; 223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int sdkMajor = 0; 224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int sdkMinor = 0; 225176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path.clear(); 227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!getWindowsSDKDir(sdkPath, sdkMajor, sdkMinor)) 228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::SmallString<128> libPath(sdkPath); 231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(libPath, "Lib"); 232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (sdkMajor <= 7) { 233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (getArch()) { 234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // In Windows SDK 7.x, x86 libraries are directly in the Lib folder. 235176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::x86: 236176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::x86_64: 238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(libPath, "x64"); 239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::arm: 241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // It is not necessary to link against Windows SDK 7.x when targeting ARM. 242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines default: 244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Windows SDK 8.x installs libraries in a folder whose names depend on the 248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // version of the OS you're targeting. By default choose the newest, which 249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // usually corresponds to the version of the OS you've installed the SDK on. 250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *tests[] = {"winv6.3", "win8", "win7"}; 251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool found = false; 252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const char *test : tests) { 253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::SmallString<128> testPath(libPath); 254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(testPath, test); 255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (llvm::sys::fs::exists(testPath.c_str())) { 256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines libPath = testPath; 257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines found = true; 258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!found) 263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(libPath, "um"); 266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (getArch()) { 267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::x86: 268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(libPath, "x86"); 269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::x86_64: 271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(libPath, "x64"); 272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::arm: 274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(libPath, "arm"); 275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines default: 277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = libPath.str(); 282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Get the location to use for Visual Studio binaries. The location priority 286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// is: %VCINSTALLDIR% > %PATH% > newest copy of Visual Studio installed on 287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// system (as reported by the registry). 288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::getVisualStudioBinariesFolder(const char *clangProgramPath, 289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string &path) const { 290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path.clear(); 291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallString<128> BinDir; 293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // First check the environment variables that vsvars32.bat sets. 295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::Optional<std::string> VcInstallDir = 296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::Process::GetEnv("VCINSTALLDIR"); 297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (VcInstallDir.hasValue()) { 298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BinDir = VcInstallDir.getValue(); 299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(BinDir, "bin"); 300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Next walk the PATH, trying to find a cl.exe in the path. If we find one, 302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // use that. However, make sure it's not clang's cl.exe. 303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH"); 304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (OptPath.hasValue()) { 305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'}; 306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVector<StringRef, 8> PathSegments; 307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr); 308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (StringRef PathSegment : PathSegments) { 310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (PathSegment.empty()) 311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallString<128> FilePath(PathSegment); 314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(FilePath, "cl.exe"); 315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (llvm::sys::fs::can_execute(FilePath.c_str()) && 316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines !llvm::sys::fs::equivalent(FilePath.c_str(), clangProgramPath)) { 317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If we found it on the PATH, use it exactly as is with no 318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // modifications. 319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = PathSegment; 320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string installDir; 326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // With no VCINSTALLDIR and nothing on the PATH, if we can't find it in the 327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // registry then we have no choice but to fail. 328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!getVisualStudioInstallDir(installDir)) 329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Regardless of what binary we're ultimately trying to find, we make sure 332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // that this is a Visual Studio directory by checking for cl.exe. We use 333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // cl.exe instead of other binaries like link.exe because programs such as 334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // GnuWin32 also have a utility called link.exe, so cl.exe is the least 335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // ambiguous. 336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BinDir = installDir; 337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(BinDir, "VC", "bin"); 338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallString<128> ClPath(BinDir); 339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(ClPath, "cl.exe"); 340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!llvm::sys::fs::can_execute(ClPath.c_str())) 342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (BinDir.empty()) 346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (getArch()) { 349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::x86: 350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::x86_64: 352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(BinDir, "amd64"); 353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::Triple::arm: 355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(BinDir, "arm"); 356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines default: 358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Whatever this is, Visual Studio doesn't have a toolchain for it. 359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = BinDir.str(); 362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Get Visual Studio installation directory. 366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool MSVCToolChain::getVisualStudioInstallDir(std::string &path) const { 367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // First check the environment variables that vsvars32.bat sets. 368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *vcinstalldir = getenv("VCINSTALLDIR"); 369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (vcinstalldir) { 370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = vcinstalldir; 371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = path.substr(0, path.find("\\VC")); 372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string vsIDEInstallDir; 376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string vsExpressIDEInstallDir; 377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Then try the windows registry. 378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool hasVCDir = 379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getSystemRegistryString("SOFTWARE\\Microsoft\\VisualStudio\\$VERSION", 380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "InstallDir", vsIDEInstallDir, nullptr); 381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (hasVCDir && !vsIDEInstallDir.empty()) { 382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = vsIDEInstallDir.substr(0, vsIDEInstallDir.find("\\Common7\\IDE")); 383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool hasVCExpressDir = 387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getSystemRegistryString("SOFTWARE\\Microsoft\\VCExpress\\$VERSION", 388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "InstallDir", vsExpressIDEInstallDir, nullptr); 389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (hasVCExpressDir && !vsExpressIDEInstallDir.empty()) { 390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = vsExpressIDEInstallDir.substr( 391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 0, vsIDEInstallDir.find("\\Common7\\IDE")); 392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Try the environment. 396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *vs120comntools = getenv("VS120COMNTOOLS"); 397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *vs100comntools = getenv("VS100COMNTOOLS"); 398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *vs90comntools = getenv("VS90COMNTOOLS"); 399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *vs80comntools = getenv("VS80COMNTOOLS"); 400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *vscomntools = nullptr; 402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Find any version we can 404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (vs120comntools) 405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines vscomntools = vs120comntools; 406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (vs100comntools) 407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines vscomntools = vs100comntools; 408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (vs90comntools) 409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines vscomntools = vs90comntools; 410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (vs80comntools) 411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines vscomntools = vs80comntools; 412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (vscomntools && *vscomntools) { 414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *p = strstr(vscomntools, "\\Common7\\Tools"); 415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines path = p ? std::string(vscomntools, p) : vscomntools; 416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return true; 417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid MSVCToolChain::AddSystemIncludeWithSubfolder(const ArgList &DriverArgs, 422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArgStringList &CC1Args, 423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const std::string &folder, 424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const char *subfolder) const { 425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::SmallString<128> path(folder); 426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(path, subfolder); 4273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar addSystemInclude(DriverArgs, CC1Args, path); 428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 429176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArgStringList &CC1Args) const { 432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (DriverArgs.hasArg(options::OPT_nostdinc)) 433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { 436176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallString<128> P(getDriver().ResourceDir); 437176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::path::append(P, "include"); 4383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar addSystemInclude(DriverArgs, CC1Args, P); 439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 441176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (DriverArgs.hasArg(options::OPT_nostdlibinc)) 442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Honor %INCLUDE%. It should know essential search paths with vcvarsall.bat. 445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const char *cl_include_dir = getenv("INCLUDE")) { 446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVector<StringRef, 8> Dirs; 447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef(cl_include_dir) 448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines .split(Dirs, ";", /*MaxSplit=*/-1, /*KeepEmpty=*/false); 449176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (StringRef Dir : Dirs) 450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addSystemInclude(DriverArgs, CC1Args, Dir); 451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Dirs.empty()) 452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string VSDir; 456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // When built with access to the proper Windows APIs, try to actually find 458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // the correct include paths first. 459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (getVisualStudioInstallDir(VSDir)) { 460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddSystemIncludeWithSubfolder(DriverArgs, CC1Args, VSDir, "VC\\include"); 461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string WindowsSDKDir; 463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int major, minor; 464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (getWindowsSDKDir(WindowsSDKDir, major, minor)) { 465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (major >= 8) { 466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddSystemIncludeWithSubfolder(DriverArgs, CC1Args, WindowsSDKDir, 467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "include\\shared"); 468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddSystemIncludeWithSubfolder(DriverArgs, CC1Args, WindowsSDKDir, 469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "include\\um"); 470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddSystemIncludeWithSubfolder(DriverArgs, CC1Args, WindowsSDKDir, 471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "include\\winrt"); 472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddSystemIncludeWithSubfolder(DriverArgs, CC1Args, WindowsSDKDir, 474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "include"); 475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 476176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 477176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addSystemInclude(DriverArgs, CC1Args, VSDir); 478176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 479176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 480176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // As a fallback, select default install paths. 483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: Don't guess drives and paths like this on Windows. 484176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const StringRef Paths[] = { 485176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "C:/Program Files/Microsoft Visual Studio 10.0/VC/include", 486176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "C:/Program Files/Microsoft Visual Studio 9.0/VC/include", 487176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include", 488176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "C:/Program Files/Microsoft Visual Studio 8/VC/include", 489176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include" 490176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addSystemIncludes(DriverArgs, CC1Args, Paths); 492176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 493176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 494176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArgStringList &CC1Args) const { 496176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: There should probably be logic here to find libc++ on Windows. 497176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 498