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