Skip to content

Commit 7608b60

Browse files
author
iclsrc
committed
Merge from 'sycl' to 'sycl-web'
2 parents 78dfd17 + 2559d65 commit 7608b60

File tree

110 files changed

+1687
-328
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+1687
-328
lines changed

clang/lib/Driver/Driver.cpp

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5565,7 +5565,7 @@ class OffloadingActionBuilder final {
55655565
SYCLDeviceLibLinked = addSYCLDeviceLibs(
55665566
TC, SYCLDeviceLibs, UseAOTLink,
55675567
C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment(),
5568-
IsSYCLNativeCPU, NativeCPULib);
5568+
IsSYCLNativeCPU, NativeCPULib, BoundArch);
55695569
}
55705570
JobAction *LinkSYCLLibs =
55715571
C.MakeAction<LinkJobAction>(SYCLDeviceLibs, types::TY_LLVM_BC);
@@ -5843,7 +5843,7 @@ class OffloadingActionBuilder final {
58435843

58445844
bool addSYCLDeviceLibs(const ToolChain *TC, ActionList &DeviceLinkObjects,
58455845
bool isSpirvAOT, bool isMSVCEnv, bool isNativeCPU,
5846-
Action *&NativeCPULib) {
5846+
Action *&NativeCPULib, const char *BoundArch) {
58475847
int NumOfDeviceLibLinked = 0;
58485848
SmallVector<SmallString<128>, 4> LibLocCandidates;
58495849
SYCLInstallation.getSYCLDeviceLibPath(LibLocCandidates);
@@ -5853,14 +5853,10 @@ class OffloadingActionBuilder final {
58535853
tools::SYCL::getDeviceLibraries(C, TC->getTriple(), isSpirvAOT);
58545854

58555855
for (const auto &DeviceLib : DeviceLibraries) {
5856-
bool LibLocSelected = false;
58575856
for (const auto &LLCandidate : LibLocCandidates) {
5858-
if (LibLocSelected)
5859-
break;
58605857
SmallString<128> LibName(LLCandidate);
58615858
llvm::sys::path::append(LibName, DeviceLib);
58625859
if (llvm::sys::fs::exists(LibName)) {
5863-
58645860
// NativeCPU currently only needs libsycl-nativecpu_utils and
58655861
// libclc, so temporarily skip other device libs in invocation.
58665862
// Todo: remove once NativeCPU tests the other libraries.
@@ -5898,8 +5894,6 @@ class OffloadingActionBuilder final {
58985894
C.MakeAction<InputAction>(*InputArg, types::TY_LLVM_BC);
58995895
DeviceLinkObjects.push_back(SYCLDeviceLibsInputAction);
59005896
}
5901-
if (!LibLocSelected)
5902-
LibLocSelected = !LibLocSelected;
59035897

59045898
// The device link stage may remove symbols not referenced in the
59055899
// source code. Since libsycl-nativecpu_utils contains such symbols
@@ -5910,22 +5904,26 @@ class OffloadingActionBuilder final {
59105904
NativeCPULib = DeviceLinkObjects.back();
59115905
DeviceLinkObjects.pop_back();
59125906
}
5907+
5908+
break;
59135909
}
59145910
}
59155911
}
59165912

5917-
// For NVPTX backend we need to also link libclc and CUDA libdevice
5918-
// at the same stage that we link all of the unbundled SYCL libdevice
5919-
// objects together.
5920-
if ((TC->getTriple().isNVPTX() || isNativeCPU) && NumOfDeviceLibLinked) {
5913+
if (!NumOfDeviceLibLinked)
5914+
return false;
5915+
5916+
// For NVPTX and NativeCPU we need to also link libclc at the same stage
5917+
// that we link all of the unbundled SYCL libdevice objects together.
5918+
if (TC->getTriple().isNVPTX() || isNativeCPU) {
59215919
std::string LibSpirvFile;
59225920
if (Args.hasArg(options::OPT_fsycl_libspirv_path_EQ)) {
59235921
auto ProvidedPath =
59245922
Args.getLastArgValue(options::OPT_fsycl_libspirv_path_EQ).str();
59255923
if (llvm::sys::fs::exists(ProvidedPath))
59265924
LibSpirvFile = ProvidedPath;
59275925
} else {
5928-
SmallVector<StringRef, 8> LibraryPaths;
5926+
SmallVector<StringRef, 2> LibraryPaths;
59295927

59305928
// Expected path w/out install.
59315929
SmallString<256> WithoutInstallPath(C.getDriver().ResourceDir);
@@ -5937,22 +5935,17 @@ class OffloadingActionBuilder final {
59375935
llvm::sys::path::append(WithInstallPath, Twine("../../../share/clc"));
59385936
LibraryPaths.emplace_back(WithInstallPath.c_str());
59395937

5940-
// TODO: check if the isNVPTX() path can also use
5941-
// TC->getTripleString() so that the conditional could be removed
5942-
const std::string TrStr =
5943-
isNativeCPU ? TC->getTripleString() : "nvptx64-nvidia-cuda";
5944-
59455938
// Select remangled libclc variant
59465939
StringRef LibSpirvTargetNamePref =
59475940
TC->getAuxTriple()->isOSWindows()
59485941
? "remangled-l32-signed_char.libspirv-"
59495942
: "remangled-l64-signed_char.libspirv-";
5950-
llvm::Twine LibSpirvTargetNameTemp = LibSpirvTargetNamePref + TrStr;
5951-
llvm::Twine LibSpirvTargetName = LibSpirvTargetNameTemp + ".bc";
59525943

59535944
for (StringRef LibraryPath : LibraryPaths) {
59545945
SmallString<128> LibSpirvTargetFile(LibraryPath);
5955-
llvm::sys::path::append(LibSpirvTargetFile, LibSpirvTargetName);
5946+
llvm::sys::path::append(LibSpirvTargetFile,
5947+
LibSpirvTargetNamePref +
5948+
TC->getTripleString() + ".bc");
59565949
if (llvm::sys::fs::exists(LibSpirvTargetFile) ||
59575950
Args.hasArg(options::OPT__HASH_HASH_HASH)) {
59585951
LibSpirvFile = std::string(LibSpirvTargetFile.str());
@@ -5967,30 +5960,24 @@ class OffloadingActionBuilder final {
59675960
C.MakeAction<InputAction>(*LibClcInputArg, types::TY_LLVM_BC);
59685961
DeviceLinkObjects.push_back(SYCLLibClcInputAction);
59695962
}
5963+
}
59705964

5971-
if (isNativeCPU) {
5972-
// return here to not generate cuda actions
5973-
return NumOfDeviceLibLinked != 0;
5974-
}
5975-
5965+
// For NVPTX we also need to link with the CUDA libdevice
5966+
if (TC->getTriple().isNVPTX() && !Args.hasArg(options::OPT_nogpulib)) {
59765967
const toolchains::CudaToolChain *CudaTC =
59775968
static_cast<const toolchains::CudaToolChain *>(TC);
5978-
for (const auto &LinkInputEnum : enumerate(DeviceLinkerInputs)) {
5979-
const char *BoundArch =
5980-
SYCLTargetInfoList[LinkInputEnum.index()].BoundArch;
5981-
std::string LibDeviceFile =
5982-
CudaTC->CudaInstallation.getLibDeviceFile(BoundArch);
5983-
if (!LibDeviceFile.empty()) {
5984-
Arg *CudaDeviceLibInputArg =
5985-
MakeInputArg(Args, C.getDriver().getOpts(),
5986-
Args.MakeArgString(LibDeviceFile));
5987-
auto *SYCLDeviceLibInputAction = C.MakeAction<InputAction>(
5988-
*CudaDeviceLibInputArg, types::TY_LLVM_BC);
5989-
DeviceLinkObjects.push_back(SYCLDeviceLibInputAction);
5990-
}
5969+
std::string LibDeviceFile =
5970+
CudaTC->CudaInstallation.getLibDeviceFile(BoundArch);
5971+
if (!LibDeviceFile.empty()) {
5972+
Arg *CudaDeviceLibInputArg = MakeInputArg(
5973+
Args, C.getDriver().getOpts(), Args.MakeArgString(LibDeviceFile));
5974+
auto *SYCLDeviceLibInputAction = C.MakeAction<InputAction>(
5975+
*CudaDeviceLibInputArg, types::TY_LLVM_BC);
5976+
DeviceLinkObjects.push_back(SYCLDeviceLibInputAction);
59915977
}
59925978
}
5993-
return NumOfDeviceLibLinked != 0;
5979+
5980+
return true;
59945981
}
59955982

59965983
void appendLinkDependences(OffloadAction::DeviceDependences &DA) override {

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10152,12 +10152,12 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1015210152
ArgStringList WrapperArgs;
1015310153

1015410154
const auto &WrapperJob = *llvm::dyn_cast<OffloadWrapperJobAction>(&JA);
10155-
bool LlcCompileEnabled = WrapperJob.getCompileStep();
10155+
bool WrapperCompileEnabled = WrapperJob.getCompileStep();
1015610156
SmallString<128> OutOpt("-o=");
1015710157
std::string OutTmpName = C.getDriver().GetTemporaryPath("wrapper", "bc");
1015810158
const char *WrapperFileName =
1015910159
C.addTempFile(C.getArgs().MakeArgString(OutTmpName));
10160-
OutOpt += LlcCompileEnabled ? WrapperFileName : Output.getFilename();
10160+
OutOpt += WrapperCompileEnabled ? WrapperFileName : Output.getFilename();
1016110161
WrapperArgs.push_back(C.getArgs().MakeArgString(OutOpt));
1016210162

1016310163
SmallString<128> HostTripleOpt("-host=");
@@ -10255,28 +10255,30 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1025510255
WrapperArgs, std::nullopt);
1025610256
C.addCommand(std::move(Cmd));
1025710257

10258-
if (LlcCompileEnabled) {
10259-
// Construct llc command.
10260-
// The output is an object file
10261-
ArgStringList LlcArgs{"-filetype=obj", "-o", Output.getFilename(),
10262-
WrapperFileName};
10258+
if (WrapperCompileEnabled) {
10259+
// TODO Use TC.SelectTool().
10260+
ArgStringList ClangArgs{
10261+
TCArgs.MakeArgString("--target=" + TC.getAuxTriple()->str()), "-c",
10262+
"-o", Output.getFilename(), WrapperFileName};
1026310263
llvm::Reloc::Model RelocationModel;
1026410264
unsigned PICLevel;
1026510265
bool IsPIE;
1026610266
std::tie(RelocationModel, PICLevel, IsPIE) =
1026710267
ParsePICArgs(getToolChain(), TCArgs);
1026810268
if (PICLevel > 0 || TCArgs.hasArg(options::OPT_shared)) {
10269-
LlcArgs.push_back("-relocation-model=pic");
10269+
if (!TC.getAuxTriple()->isOSWindows())
10270+
ClangArgs.push_back("-fPIC");
1027010271
}
1027110272
if (Arg *A = C.getArgs().getLastArg(options::OPT_mcmodel_EQ))
10272-
LlcArgs.push_back(
10273-
TCArgs.MakeArgString(Twine("--code-model=") + A->getValue()));
10274-
10275-
SmallString<128> LlcPath(C.getDriver().Dir);
10276-
llvm::sys::path::append(LlcPath, "llc");
10277-
const char *Llc = C.getArgs().MakeArgString(LlcPath);
10278-
C.addCommand(std::make_unique<Command>(
10279-
JA, *this, ResponseFileSupport::None(), Llc, LlcArgs, std::nullopt));
10273+
ClangArgs.push_back(
10274+
TCArgs.MakeArgString(Twine("-mcmodel=") + A->getValue()));
10275+
10276+
SmallString<128> ClangPath(C.getDriver().Dir);
10277+
llvm::sys::path::append(ClangPath, "clang");
10278+
const char *Clang = C.getArgs().MakeArgString(ClangPath);
10279+
C.addCommand(std::make_unique<Command>(JA, *this,
10280+
ResponseFileSupport::None(), Clang,
10281+
ClangArgs, std::nullopt));
1028010282
}
1028110283
return;
1028210284
} // end of SYCL flavor of offload wrapper command creation

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -713,21 +713,6 @@ const char *SYCL::Linker::constructLLVMLinkCommand(
713713
return OutputFileName;
714714
}
715715

716-
void SYCL::Linker::constructLlcCommand(Compilation &C, const JobAction &JA,
717-
const InputInfo &Output,
718-
const char *InputFileName) const {
719-
// Construct llc command.
720-
// The output is an object file.
721-
ArgStringList LlcArgs{"-filetype=obj", "-o", Output.getFilename(),
722-
InputFileName};
723-
SmallString<128> LlcPath(C.getDriver().Dir);
724-
llvm::sys::path::append(LlcPath, "llc");
725-
const char *Llc = C.getArgs().MakeArgString(LlcPath);
726-
C.addCommand(std::make_unique<Command>(JA, *this,
727-
ResponseFileSupport::AtFileUTF8(), Llc,
728-
LlcArgs, std::nullopt));
729-
}
730-
731716
// For SYCL the inputs of the linker job are SPIR-V binaries and output is
732717
// a single SPIR-V binary. Input can also be bitcode when specified by
733718
// the user.

clang/lib/Driver/ToolChains/SYCL.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
7474
llvm::StringRef SubArchName,
7575
llvm::StringRef OutputFilePrefix,
7676
const InputInfoList &InputFiles) const;
77-
void constructLlcCommand(Compilation &C, const JobAction &JA,
78-
const InputInfo &Output,
79-
const char *InputFile) const;
8077
};
8178

8279
/// Directly call FPGA Compiler and Linker

clang/test/Driver/linker-wrapper-sycl-win.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// CHK-CMDS-NEXT: "{{.*}}sycl-post-link.exe"{{.*}} SYCL_POST_LINK_OPTIONS -o [[SYCLPOSTLINKOUT:.*]].table [[SECONDLLVMLINKOUT]].bc
2121
// CHK-CMDS-NEXT: "{{.*}}llvm-spirv.exe"{{.*}} LLVM_SPIRV_OPTIONS -o {{.*}}
2222
// CHK-CMDS-NEXT: offload-wrapper: input: {{.*}}, output: [[WRAPPEROUT:.*]].bc
23-
// CHK-CMDS-NEXT: "{{.*}}llc.exe" -filetype=obj -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
23+
// CHK-CMDS-NEXT: "{{.*}}clang.exe"{{.*}} -c -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
2424
// CHK-CMDS-NEXT: "{{.*}}/ld" -- HOST_LINKER_FLAGS -dynamic-linker HOST_DYN_LIB -o a.out [[LLCOUT]].o HOST_LIB_PATH HOST_STAT_LIB {{.*}}.o
2525

2626
/// Check for list of commands for standalone clang-linker-wrapper run for sycl (AOT for Intel GPU)
@@ -44,7 +44,7 @@
4444
// CHK-CMDS-AOT-GEN-NEXT: "{{.*}}llvm-spirv.exe"{{.*}} LLVM_SPIRV_OPTIONS -o {{.*}}
4545
// CHK-CMDS-AOT-GEN-NEXT: "{{.*}}ocloc{{.*}} -output_no_suffix -spirv_input -device pvc -output {{.*}} -file {{.*}}
4646
// CHK-CMDS-AOT-GEN-NEXT: offload-wrapper: input: {{.*}}, output: [[WRAPPEROUT:.*]].bc
47-
// CHK-CMDS-AOT-GEN-NEXT: "{{.*}}llc.exe" -filetype=obj -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
47+
// CHK-CMDS-AOT-GEN-NEXT: "{{.*}}clang.exe"{{.*}} -c -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
4848
// CHK-CMDS-AOT-GEN-NEXT: "{{.*}}/ld" -- HOST_LINKER_FLAGS -dynamic-linker HOST_DYN_LIB -o a.out [[LLCOUT]].o HOST_LIB_PATH HOST_STAT_LIB {{.*}}.o
4949

5050
/// Check for list of commands for standalone clang-linker-wrapper run for sycl (AOT for Intel CPU)
@@ -68,7 +68,7 @@
6868
// CHK-CMDS-AOT-CPU-NEXT: "{{.*}}llvm-spirv.exe"{{.*}} LLVM_SPIRV_OPTIONS -o {{.*}}
6969
// CHK-CMDS-AOT-CPU-NEXT: "{{.*}}opencl-aot.exe"{{.*}} --device=cpu -o {{.*}}
7070
// CHK-CMDS-AOT-CPU-NEXT: offload-wrapper: input: {{.*}}, output: [[WRAPPEROUT:.*]].bc
71-
// CHK-CMDS-AOT-CPU-NEXT: "{{.*}}llc.exe" -filetype=obj -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
71+
// CHK-CMDS-AOT-CPU-NEXT: "{{.*}}clang.exe"{{.*}} -c -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
7272
// CHK-CMDS-AOT-CPU-NEXT: "{{.*}}/ld" -- HOST_LINKER_FLAGS -dynamic-linker HOST_DYN_LIB -o a.out [[LLCOUT]].o HOST_LIB_PATH HOST_STAT_LIB {{.*}}.o
7373

7474
/// Check for list of commands for standalone clang-linker-wrapper run for sycl (AOT for NVPTX)
@@ -93,7 +93,7 @@
9393
// CHK-CMDS-AOT-NV-NEXT: "{{.*}}ptxas"{{.*}} --output-file [[PTXASOUT:.*]] [[CLANGOUT]]
9494
// CHK-CMDS-AOT-NV-NEXT: "{{.*}}fatbinary"{{.*}} --create [[FATBINOUT:.*]] --image=profile={{.*}},file=[[CLANGOUT]] --image=profile={{.*}},file=[[PTXASOUT]]
9595
// CHK-CMDS-AOT-NV-NEXT: offload-wrapper: input: [[FATBINOUT]], output: [[WRAPPEROUT:.*]].bc
96-
// CHK-CMDS-AOT-NV-NEXT: "{{.*}}llc.exe" -filetype=obj -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
96+
// CHK-CMDS-AOT-NV-NEXT: "{{.*}}clang.exe"{{.*}} -c -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
9797
// CHK-CMDS-AOT-NV-NEXT: "{{.*}}ld" -- HOST_LINKER_FLAGS -dynamic-linker HOST_DYN_LIB -o a.out [[LLCOUT]].o HOST_LIB_PATH HOST_STAT_LIB {{.*}}.o
9898
/// Check for list of commands for standalone clang-linker-wrapper run for sycl (AOT for AMD)
9999
// -------
@@ -110,5 +110,5 @@
110110
// CHK-CMDS-AOT-AMD-NEXT: "{{.*}}clang.exe"{{.*}} -o [[CLANGOUT:.*]] --target=amdgcn-amd-amdhsa -mcpu={{.*}}
111111
// CHK-CMDS-AOT-AMD-NEXT: "{{.*}}clang-offload-bundler.exe"{{.*}} -input=[[CLANGOUT]] -output=[[BUNDLEROUT:.*]]
112112
// CHK-CMDS-AOT-AMD-NEXT: offload-wrapper: input: [[BUNDLEROUT]], output: [[WRAPPEROUT:.*]].bc
113-
// CHK-CMDS-AOT-AMD-NEXT: "{{.*}}llc.exe" -filetype=obj -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
113+
// CHK-CMDS-AOT-AMD-NEXT: "{{.*}}clang.exe"{{.*}} -c -o [[LLCOUT:.*]].o [[WRAPPEROUT]].bc
114114
// CHK-CMDS-AOT-AMD-NEXT: "{{.*}}ld" -- HOST_LINKER_FLAGS -dynamic-linker HOST_DYN_LIB -o a.out [[LLCOUT]].o HOST_LIB_PATH HOST_STAT_LIB {{.*}}.o

0 commit comments

Comments
 (0)