[clang-cl] Add a /diasdkdir flag and make /winsysroot imply it
D109708 added "DIA SDK" to our win sysroot for hermetic builds that use LLVM_ENABLE_DIA_SDK. But the build system still has to manually pass flags pointing to it. Since we have a /winsysroot flag, make it look at DIA SDK in the sysroot. With this, the following is enough to compile the DIA2Dump example: out\gn\bin\clang-cl ^ "sysroot\DIA SDK\Samples\DIA2Dump\DIA2Dump.cpp" ^ "sysroot\DIA SDK\Samples\DIA2Dump\PrintSymbol.cpp" ^ "sysroot\DIA SDK\Samples\DIA2Dump\regs.cpp" ^ /diasdkdir "sysroot\DIA SDK" ^ ole32.lib oleaut32.lib diaguids.lib Differential Revision: https://reviews.llvm.org/D109828
This commit is contained in:
@@ -6228,6 +6228,8 @@ def _SLASH_TC : CLCompileFlag<"TC">, HelpText<"Treat all source files as C">;
|
||||
def _SLASH_Tp : CLCompileJoinedOrSeparate<"Tp">,
|
||||
HelpText<"Treat <file> as C++ source file">, MetaVarName<"<file>">;
|
||||
def _SLASH_TP : CLCompileFlag<"TP">, HelpText<"Treat all source files as C++">;
|
||||
def _SLASH_diasdkdir : CLJoinedOrSeparate<"diasdkdir">,
|
||||
HelpText<"Path to the DIA SDK">, MetaVarName<"<dir>">;
|
||||
def _SLASH_vctoolsdir : CLJoinedOrSeparate<"vctoolsdir">,
|
||||
HelpText<"Path to the VCToolChain">, MetaVarName<"<dir>">;
|
||||
def _SLASH_vctoolsversion : CLJoinedOrSeparate<"vctoolsversion">,
|
||||
@@ -6237,7 +6239,7 @@ def _SLASH_winsdkdir : CLJoinedOrSeparate<"winsdkdir">,
|
||||
def _SLASH_winsdkversion : CLJoinedOrSeparate<"winsdkversion">,
|
||||
HelpText<"Full version of the Windows SDK, defaults to newest found">;
|
||||
def _SLASH_winsysroot : CLJoinedOrSeparate<"winsysroot">,
|
||||
HelpText<"Same as /vctoolsdir <dir>/VC/Tools/MSVC/<vctoolsversion> /winsdkdir <dir>/Windows Kits/10">,
|
||||
HelpText<"Same as \"/diasdkdir <dir>/DIA SDK\" /vctoolsdir <dir>/VC/Tools/MSVC/<vctoolsversion> \"/winsdkdir <dir>/Windows Kits/10\"">,
|
||||
MetaVarName<"<dir>">;
|
||||
def _SLASH_volatile_iso : Option<["/", "-"], "volatile:iso", KIND_FLAG>,
|
||||
Group<_SLASH_volatile_Group>, Flags<[CLOption, NoXarchOption]>,
|
||||
|
||||
@@ -63,6 +63,61 @@ using namespace clang::driver::tools;
|
||||
using namespace clang;
|
||||
using namespace llvm::opt;
|
||||
|
||||
// Windows SDKs and VC Toolchains group their contents into subdirectories based
|
||||
// on the target architecture. This function converts an llvm::Triple::ArchType
|
||||
// to the corresponding subdirectory name.
|
||||
static const char *llvmArchToWindowsSDKArch(llvm::Triple::ArchType Arch) {
|
||||
using ArchType = llvm::Triple::ArchType;
|
||||
switch (Arch) {
|
||||
case ArchType::x86:
|
||||
return "x86";
|
||||
case ArchType::x86_64:
|
||||
return "x64";
|
||||
case ArchType::arm:
|
||||
return "arm";
|
||||
case ArchType::aarch64:
|
||||
return "arm64";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Similar to the above function, but for Visual Studios before VS2017.
|
||||
static const char *llvmArchToLegacyVCArch(llvm::Triple::ArchType Arch) {
|
||||
using ArchType = llvm::Triple::ArchType;
|
||||
switch (Arch) {
|
||||
case ArchType::x86:
|
||||
// x86 is default in legacy VC toolchains.
|
||||
// e.g. x86 libs are directly in /lib as opposed to /lib/x86.
|
||||
return "";
|
||||
case ArchType::x86_64:
|
||||
return "amd64";
|
||||
case ArchType::arm:
|
||||
return "arm";
|
||||
case ArchType::aarch64:
|
||||
return "arm64";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Similar to the above function, but for DevDiv internal builds.
|
||||
static const char *llvmArchToDevDivInternalArch(llvm::Triple::ArchType Arch) {
|
||||
using ArchType = llvm::Triple::ArchType;
|
||||
switch (Arch) {
|
||||
case ArchType::x86:
|
||||
return "i386";
|
||||
case ArchType::x86_64:
|
||||
return "amd64";
|
||||
case ArchType::arm:
|
||||
return "arm";
|
||||
case ArchType::aarch64:
|
||||
return "arm64";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
static bool canExecute(llvm::vfs::FileSystem &VFS, StringRef Path) {
|
||||
auto Status = VFS.status(Path);
|
||||
if (!Status)
|
||||
@@ -396,6 +451,20 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
// the environment variable is set however, assume the user knows what
|
||||
// they're doing. If the user passes /vctoolsdir or /winsdkdir, trust that
|
||||
// over env vars.
|
||||
if (const Arg *A = Args.getLastArg(options::OPT__SLASH_diasdkdir,
|
||||
options::OPT__SLASH_winsysroot)) {
|
||||
// cl.exe doesn't find the DIA SDK automatically, so this too requires
|
||||
// explicit flags and doesn't automatically look in "DIA SDK" relative
|
||||
// to the path we found for VCToolChainPath.
|
||||
llvm::SmallString<128> DIAPath(A->getValue());
|
||||
if (A->getOption().getID() == options::OPT__SLASH_winsysroot)
|
||||
llvm::sys::path::append(DIAPath, "DIA SDK");
|
||||
|
||||
// The DIA SDK always uses the legacy vc arch, even in new MSVC versions.
|
||||
llvm::sys::path::append(DIAPath, "lib",
|
||||
llvmArchToLegacyVCArch(TC.getArch()));
|
||||
CmdArgs.push_back(Args.MakeArgString(Twine("-libpath:") + DIAPath));
|
||||
}
|
||||
if (!llvm::sys::Process::GetEnv("LIB") ||
|
||||
Args.getLastArg(options::OPT__SLASH_vctoolsdir,
|
||||
options::OPT__SLASH_winsysroot)) {
|
||||
@@ -752,61 +821,6 @@ void MSVCToolChain::printVerboseInfo(raw_ostream &OS) const {
|
||||
RocmInstallation.print(OS);
|
||||
}
|
||||
|
||||
// Windows SDKs and VC Toolchains group their contents into subdirectories based
|
||||
// on the target architecture. This function converts an llvm::Triple::ArchType
|
||||
// to the corresponding subdirectory name.
|
||||
static const char *llvmArchToWindowsSDKArch(llvm::Triple::ArchType Arch) {
|
||||
using ArchType = llvm::Triple::ArchType;
|
||||
switch (Arch) {
|
||||
case ArchType::x86:
|
||||
return "x86";
|
||||
case ArchType::x86_64:
|
||||
return "x64";
|
||||
case ArchType::arm:
|
||||
return "arm";
|
||||
case ArchType::aarch64:
|
||||
return "arm64";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Similar to the above function, but for Visual Studios before VS2017.
|
||||
static const char *llvmArchToLegacyVCArch(llvm::Triple::ArchType Arch) {
|
||||
using ArchType = llvm::Triple::ArchType;
|
||||
switch (Arch) {
|
||||
case ArchType::x86:
|
||||
// x86 is default in legacy VC toolchains.
|
||||
// e.g. x86 libs are directly in /lib as opposed to /lib/x86.
|
||||
return "";
|
||||
case ArchType::x86_64:
|
||||
return "amd64";
|
||||
case ArchType::arm:
|
||||
return "arm";
|
||||
case ArchType::aarch64:
|
||||
return "arm64";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Similar to the above function, but for DevDiv internal builds.
|
||||
static const char *llvmArchToDevDivInternalArch(llvm::Triple::ArchType Arch) {
|
||||
using ArchType = llvm::Triple::ArchType;
|
||||
switch (Arch) {
|
||||
case ArchType::x86:
|
||||
return "i386";
|
||||
case ArchType::x86_64:
|
||||
return "amd64";
|
||||
case ArchType::arm:
|
||||
return "arm";
|
||||
case ArchType::aarch64:
|
||||
return "arm64";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Get the path to a specific subdirectory in the current toolchain for
|
||||
// a given target architecture.
|
||||
// VS2017 changed the VC toolchain layout, so this should be used instead
|
||||
@@ -1263,6 +1277,19 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
||||
AddSystemIncludesFromEnv(Var);
|
||||
}
|
||||
|
||||
// Add DIA SDK include if requested.
|
||||
if (const Arg *A = DriverArgs.getLastArg(options::OPT__SLASH_diasdkdir,
|
||||
options::OPT__SLASH_winsysroot)) {
|
||||
// cl.exe doesn't find the DIA SDK automatically, so this too requires
|
||||
// explicit flags and doesn't automatically look in "DIA SDK" relative
|
||||
// to the path we found for VCToolChainPath.
|
||||
llvm::SmallString<128> DIASDKPath(A->getValue());
|
||||
if (A->getOption().getID() == options::OPT__SLASH_winsysroot)
|
||||
llvm::sys::path::append(DIASDKPath, "DIA SDK");
|
||||
AddSystemIncludeWithSubfolder(DriverArgs, CC1Args, std::string(DIASDKPath),
|
||||
"include");
|
||||
}
|
||||
|
||||
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
|
||||
return;
|
||||
|
||||
|
||||
@@ -1,18 +1,27 @@
|
||||
// RUN: rm -rf %t
|
||||
// RUN: split-file %s %t
|
||||
|
||||
// RUN: %clang_cl /winsysroot %t -### -- %t/foo.cpp 2>&1 | FileCheck %s
|
||||
// RUN: %clang_cl /vctoolsdir %t/VC/Tools/MSVC/27.1828.18284 \
|
||||
// RUN: /winsdkdir "%t/Windows Kits/10" \
|
||||
// RUN: -### -- %t/foo.cpp 2>&1 | FileCheck %s
|
||||
// RUN: %clang_cl -m64 /winsysroot %t -### -- %t/foo.cpp 2>&1 | FileCheck %s
|
||||
// RUN: %clang_cl -m64 \
|
||||
// RUN: /diasdkdir "%t/DIA SDK" \
|
||||
// RUN: /vctoolsdir %t/VC/Tools/MSVC/27.1828.18284 \
|
||||
// RUN: /winsdkdir "%t/Windows Kits/10" \
|
||||
// RUN: -### -- %t/foo.cpp 2>&1 | FileCheck %s
|
||||
|
||||
// CHECK: "-internal-isystem" "[[ROOT:[^"]*]]{{/|\\\\}}VC{{/|\\\\}}Tools{{/|\\\\}}MSVC{{/|\\\\}}27.1828.18284{{/|\\\\}}include"
|
||||
// CHECK: "-internal-isystem" "[[ROOT:[^"]*]]{{/|\\\\}}DIA SDK{{/|\\\\}}include"
|
||||
// CHECK: "-internal-isystem" "[[ROOT]]{{/|\\\\}}VC{{/|\\\\}}Tools{{/|\\\\}}MSVC{{/|\\\\}}27.1828.18284{{/|\\\\}}include"
|
||||
// CHECK: "-internal-isystem" "[[ROOT]]{{/|\\\\}}VC{{/|\\\\}}Tools{{/|\\\\}}MSVC{{/|\\\\}}27.1828.18284{{/|\\\\}}atlmfc{{/|\\\\}}include"
|
||||
// CHECK: "-internal-isystem" "[[ROOT]]{{/|\\\\}}Windows Kits{{/|\\\\}}10{{/|\\\\}}Include{{/|\\\\}}10.0.19041.0{{/|\\\\}}ucrt"
|
||||
// CHECK: "-internal-isystem" "[[ROOT]]{{/|\\\\}}Windows Kits{{/|\\\\}}10{{/|\\\\}}Include{{/|\\\\}}10.0.19041.0{{/|\\\\}}shared"
|
||||
// CHECK: "-internal-isystem" "[[ROOT]]{{/|\\\\}}Windows Kits{{/|\\\\}}10{{/|\\\\}}Include{{/|\\\\}}10.0.19041.0{{/|\\\\}}um"
|
||||
// CHECK: "-internal-isystem" "[[ROOT]]{{/|\\\\}}Windows Kits{{/|\\\\}}10{{/|\\\\}}Include{{/|\\\\}}10.0.19041.0{{/|\\\\}}winrt"
|
||||
|
||||
// CHECK: "-libpath:[[ROOT]]{{/|\\\\}}DIA SDK{{/|\\\\}}lib{{/|\\\\}}amd64"
|
||||
// CHECK: "-libpath:[[ROOT]]{{/|\\\\}}VC{{/|\\\\}}Tools{{/|\\\\}}MSVC{{/|\\\\}}27.1828.18284{{/|\\\\}}lib{{/|\\\\}}x64"
|
||||
// CHECK: "-libpath:[[ROOT]]{{/|\\\\}}VC{{/|\\\\}}Tools{{/|\\\\}}MSVC{{/|\\\\}}27.1828.18284{{/|\\\\}}atlmfc{{/|\\\\}}lib{{/|\\\\}}x64"
|
||||
// CHECK: "-libpath:[[ROOT]]{{/|\\\\}}Windows Kits{{/|\\\\}}10{{/|\\\\}}Lib{{/|\\\\}}10.0.19041.0{{/|\\\\}}ucrt{{/|\\\\}}x64"
|
||||
// CHECK: "-libpath:[[ROOT]]{{/|\\\\}}Windows Kits{{/|\\\\}}10{{/|\\\\}}Lib{{/|\\\\}}10.0.19041.0{{/|\\\\}}um{{/|\\\\}}x64"
|
||||
|
||||
#--- VC/Tools/MSVC/27.1828.18284/include/string
|
||||
namespace std {
|
||||
class mystring {
|
||||
@@ -24,6 +33,9 @@ public:
|
||||
#--- Windows Kits/10/Include/10.0.19041.0/ucrt/assert.h
|
||||
#define myassert(X)
|
||||
|
||||
#--- DIA SDK/include/cvconst.h
|
||||
#define myotherassert(X)
|
||||
|
||||
#--- foo.cpp
|
||||
#include <assert.h>
|
||||
#include <string>
|
||||
|
||||
Reference in New Issue
Block a user