Skip to content

Commit aaae334

Browse files
authored
[Driver][SYCL] Cleanup Windows defaultlib linking behaviors (#7856)
Changes from the community has caused a section of duplicate code when dealing with adding the required default libraries for Windows linking. This is causing a doubling up of the predefined macros (_MT, _DLL and _DEBUG) as well as multiple inclusions of the MSVC runtime libs. The duplication of the runtime libs is also causing a warning to be emitted from the linker due to 2 different variants of the library being linked in when -fsycl compilations are enabled. Cleanup this portion of code, moving the SYCL specific additions to the new function.
1 parent c64b157 commit aaae334

File tree

1 file changed

+44
-100
lines changed

1 file changed

+44
-100
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 44 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -4676,13 +4676,22 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
46764676
const ToolChain &TC) {
46774677
unsigned RTOptionID = options::OPT__SLASH_MT;
46784678

4679+
bool isSPIR = TC.getTriple().isSPIR();
4680+
bool isSYCL = Args.hasArg(options::OPT_fsycl);
4681+
// For SYCL Windows, /MD is the default.
4682+
if (isSYCL)
4683+
RTOptionID = options::OPT__SLASH_MD;
4684+
46794685
if (Args.hasArg(options::OPT__SLASH_LDd))
4680-
// The /LDd option implies /MTd. The dependent lib part can be overridden,
4681-
// but defining _DEBUG is sticky.
4682-
RTOptionID = options::OPT__SLASH_MTd;
4686+
// The /LDd option implies /MTd (/MDd for SYCL). The dependent lib part
4687+
// can be overridden, but defining _DEBUG is sticky.
4688+
RTOptionID = isSYCL ? options::OPT__SLASH_MDd : options::OPT__SLASH_MTd;
46834689

4684-
if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
4690+
Arg *SetArg = nullptr;
4691+
if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) {
46854692
RTOptionID = A->getOption().getID();
4693+
SetArg = A;
4694+
}
46864695

46874696
if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
46884697
RTOptionID = llvm::StringSwitch<unsigned>(A->getValue())
@@ -4691,40 +4700,43 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
46914700
.Case("dll", options::OPT__SLASH_MD)
46924701
.Case("dll_dbg", options::OPT__SLASH_MDd)
46934702
.Default(options::OPT__SLASH_MT);
4703+
SetArg = A;
46944704
}
4705+
if (isSYCL && !isSPIR && SetArg &&
4706+
(RTOptionID == options::OPT__SLASH_MT ||
4707+
RTOptionID == options::OPT__SLASH_MTd))
4708+
// Use of /MT or /MTd is not supported for SYCL.
4709+
TC.getDriver().Diag(diag::err_drv_unsupported_opt_dpcpp)
4710+
<< SetArg->getOption().getName();
46954711

4696-
bool isSPIR = TC.getTriple().isSPIR();
4697-
StringRef FlagForCRT;
4698-
switch (RTOptionID) {
4699-
case options::OPT__SLASH_MD:
4700-
if (Args.hasArg(options::OPT__SLASH_LDd))
4712+
enum { addDEBUG = 0x1, addMT = 0x2, addDLL = 0x4 };
4713+
auto addPreDefines = [&](unsigned Defines) {
4714+
if (Defines & addDEBUG)
47014715
CmdArgs.push_back("-D_DEBUG");
4702-
if (!isSPIR) {
4716+
if (Defines & addMT && !isSPIR)
47034717
CmdArgs.push_back("-D_MT");
4718+
if (Defines & addDLL && !isSPIR)
47044719
CmdArgs.push_back("-D_DLL");
4705-
}
4720+
};
4721+
StringRef FlagForCRT;
4722+
switch (RTOptionID) {
4723+
case options::OPT__SLASH_MD:
4724+
addPreDefines((Args.hasArg(options::OPT__SLASH_LDd) ? addDEBUG : 0x0) |
4725+
addMT | addDLL);
47064726
FlagForCRT = "--dependent-lib=msvcrt";
47074727
break;
47084728
case options::OPT__SLASH_MDd:
4709-
CmdArgs.push_back("-D_DEBUG");
4710-
if (!isSPIR) {
4711-
CmdArgs.push_back("-D_MT");
4712-
CmdArgs.push_back("-D_DLL");
4713-
}
4729+
addPreDefines(addDEBUG | addMT | addDLL);
47144730
FlagForCRT = "--dependent-lib=msvcrtd";
47154731
break;
47164732
case options::OPT__SLASH_MT:
4717-
if (Args.hasArg(options::OPT__SLASH_LDd))
4718-
CmdArgs.push_back("-D_DEBUG");
4719-
if (!isSPIR)
4720-
CmdArgs.push_back("-D_MT");
4733+
addPreDefines((Args.hasArg(options::OPT__SLASH_LDd) ? addDEBUG : 0x0) |
4734+
addMT);
47214735
CmdArgs.push_back("-flto-visibility-public-std");
47224736
FlagForCRT = "--dependent-lib=libcmt";
47234737
break;
47244738
case options::OPT__SLASH_MTd:
4725-
CmdArgs.push_back("-D_DEBUG");
4726-
if (!isSPIR)
4727-
CmdArgs.push_back("-D_MT");
4739+
addPreDefines(addDEBUG | addMT);
47284740
CmdArgs.push_back("-flto-visibility-public-std");
47294741
FlagForCRT = "--dependent-lib=libcmtd";
47304742
break;
@@ -4741,6 +4753,15 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
47414753
// users want. The /Za flag to cl.exe turns this off, but it's not
47424754
// implemented in clang.
47434755
CmdArgs.push_back("--dependent-lib=oldnames");
4756+
// Add SYCL dependent library
4757+
if (Args.hasArg(options::OPT_fsycl) &&
4758+
!Args.hasArg(options::OPT_nolibsycl)) {
4759+
if (RTOptionID == options::OPT__SLASH_MDd)
4760+
CmdArgs.push_back("--dependent-lib=sycl" SYCL_MAJOR_VERSION "d");
4761+
else
4762+
CmdArgs.push_back("--dependent-lib=sycl" SYCL_MAJOR_VERSION);
4763+
CmdArgs.push_back("--dependent-lib=sycl-devicelib-host");
4764+
}
47444765
}
47454766
}
47464767

@@ -8165,85 +8186,8 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
81658186
ArgStringList &CmdArgs,
81668187
codegenoptions::DebugInfoKind *DebugInfoKind,
81678188
bool *EmitCodeView) const {
8168-
unsigned RTOptionID = options::OPT__SLASH_MT;
81698189
bool isNVPTX = getToolChain().getTriple().isNVPTX();
8170-
bool isSPIR = getToolChain().getTriple().isSPIR();
8171-
// FIXME: isSYCL should not be enabled by "isSPIR"
8172-
bool isSYCL = Args.hasArg(options::OPT_fsycl) || isSPIR;
8173-
// For SYCL Windows, /MD is the default.
8174-
if (isSYCL)
8175-
RTOptionID = options::OPT__SLASH_MD;
8176-
8177-
if (Args.hasArg(options::OPT__SLASH_LDd))
8178-
// The /LDd option implies /MTd (/MDd for SYCL). The dependent lib part
8179-
// can be overridden but defining _DEBUG is sticky.
8180-
RTOptionID = isSYCL ? options::OPT__SLASH_MDd : options::OPT__SLASH_MTd;
8181-
8182-
if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) {
8183-
RTOptionID = A->getOption().getID();
8184-
if (isSYCL && !isSPIR &&
8185-
(RTOptionID == options::OPT__SLASH_MT ||
8186-
RTOptionID == options::OPT__SLASH_MTd))
8187-
// Use of /MT or /MTd is not supported for SYCL.
8188-
getToolChain().getDriver().Diag(diag::err_drv_unsupported_opt_dpcpp)
8189-
<< A->getOption().getName();
8190-
}
8191-
8192-
enum { addDEBUG = 0x1, addMT = 0x2, addDLL = 0x4 };
8193-
auto addPreDefines = [&](unsigned Defines) {
8194-
if (Defines & addDEBUG)
8195-
CmdArgs.push_back("-D_DEBUG");
8196-
if (Defines & addMT && !isSPIR)
8197-
CmdArgs.push_back("-D_MT");
8198-
if (Defines & addDLL && !isSPIR)
8199-
CmdArgs.push_back("-D_DLL");
8200-
};
8201-
StringRef FlagForCRT;
8202-
switch (RTOptionID) {
8203-
case options::OPT__SLASH_MD:
8204-
addPreDefines((Args.hasArg(options::OPT__SLASH_LDd) ? addDEBUG : 0x0) |
8205-
addMT | addDLL);
8206-
FlagForCRT = "--dependent-lib=msvcrt";
8207-
break;
8208-
case options::OPT__SLASH_MDd:
8209-
addPreDefines(addDEBUG | addMT | addDLL);
8210-
FlagForCRT = "--dependent-lib=msvcrtd";
8211-
break;
8212-
case options::OPT__SLASH_MT:
8213-
addPreDefines((Args.hasArg(options::OPT__SLASH_LDd) ? addDEBUG : 0x0) |
8214-
addMT);
8215-
CmdArgs.push_back("-flto-visibility-public-std");
8216-
FlagForCRT = "--dependent-lib=libcmt";
8217-
break;
8218-
case options::OPT__SLASH_MTd:
8219-
addPreDefines(addDEBUG | addMT);
8220-
CmdArgs.push_back("-flto-visibility-public-std");
8221-
FlagForCRT = "--dependent-lib=libcmtd";
8222-
break;
8223-
default:
8224-
llvm_unreachable("Unexpected option ID.");
8225-
}
8226-
8227-
if (Args.hasArg(options::OPT__SLASH_Zl)) {
8228-
CmdArgs.push_back("-D_VC_NODEFAULTLIB");
8229-
} else {
8230-
CmdArgs.push_back(FlagForCRT.data());
8231-
8232-
// This provides POSIX compatibility (maps 'open' to '_open'), which most
8233-
// users want. The /Za flag to cl.exe turns this off, but it's not
8234-
// implemented in clang.
8235-
CmdArgs.push_back("--dependent-lib=oldnames");
82368190

8237-
// Add SYCL dependent library
8238-
if (Args.hasArg(options::OPT_fsycl) &&
8239-
!Args.hasArg(options::OPT_nolibsycl)) {
8240-
if (RTOptionID == options::OPT__SLASH_MDd)
8241-
CmdArgs.push_back("--dependent-lib=sycl" SYCL_MAJOR_VERSION "d");
8242-
else
8243-
CmdArgs.push_back("--dependent-lib=sycl" SYCL_MAJOR_VERSION);
8244-
CmdArgs.push_back("--dependent-lib=sycl-devicelib-host");
8245-
}
8246-
}
82478191
ProcessVSRuntimeLibrary(Args, CmdArgs, getToolChain());
82488192

82498193
if (Arg *ShowIncludes =

0 commit comments

Comments
 (0)