@@ -90,9 +90,27 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand(
9090 }
9191
9292 // Emit SPIR-V binary.
93+ llvm::opt::ArgStringList TrArgs;
94+ auto T = getToolChain ().getTriple ();
95+ bool HasNoSubArch = T.getSubArch () == llvm::Triple::NoSubArch;
96+ if (T.getOS () == llvm::Triple::ChipStar) {
97+ // chipStar needs 1.2 for supporting warp-level primitivies via sub-group
98+ // extensions. Strictly put we'd need 1.3 for the standard non-extension
99+ // shuffle operations, but it's not supported by any backend driver of the
100+ // chipStar.
101+ if (HasNoSubArch)
102+ TrArgs.push_back (" --spirv-max-version=1.2" );
103+ TrArgs.push_back (" --spirv-ext=-all"
104+ // Needed for experimental indirect call support.
105+ " ,+SPV_INTEL_function_pointers"
106+ // Needed for shuffles below SPIR-V 1.3
107+ " ,+SPV_INTEL_subgroups" );
108+ } else {
109+ if (HasNoSubArch)
110+ TrArgs.push_back (" --spirv-max-version=1.1" );
111+ TrArgs.push_back (" --spirv-ext=+all" );
112+ }
93113
94- llvm::opt::ArgStringList TrArgs{" --spirv-max-version=1.1" ,
95- " --spirv-ext=+all" };
96114 InputInfo TrInput = InputInfo (types::TY_LLVM_BC, TempFile, " " );
97115 SPIRV::constructTranslateCommand (C, *this , JA, Output, TrInput, TrArgs);
98116}
@@ -116,7 +134,16 @@ void HIPSPV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
116134
117135HIPSPVToolChain::HIPSPVToolChain (const Driver &D, const llvm::Triple &Triple,
118136 const ToolChain &HostTC, const ArgList &Args)
119- : ToolChain(D, Triple, Args), HostTC(HostTC) {
137+ : ToolChain(D, Triple, Args), HostTC(&HostTC) {
138+ // Lookup binaries into the driver directory, this is used to
139+ // discover the clang-offload-bundler executable.
140+ getProgramPaths ().push_back (getDriver ().Dir );
141+ }
142+
143+ // Non-offloading toolchain. Primaly used by clang-offload-linker.
144+ HIPSPVToolChain::HIPSPVToolChain (const Driver &D, const llvm::Triple &Triple,
145+ const ArgList &Args)
146+ : ToolChain(D, Triple, Args), HostTC(nullptr ) {
120147 // Lookup binaries into the driver directory, this is used to
121148 // discover the clang-offload-bundler executable.
122149 getProgramPaths ().push_back (getDriver ().Dir );
@@ -125,7 +152,14 @@ HIPSPVToolChain::HIPSPVToolChain(const Driver &D, const llvm::Triple &Triple,
125152void HIPSPVToolChain::addClangTargetOptions (
126153 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
127154 Action::OffloadKind DeviceOffloadingKind) const {
128- HostTC.addClangTargetOptions (DriverArgs, CC1Args, DeviceOffloadingKind);
155+
156+ if (!HostTC) {
157+ assert (DeviceOffloadingKind == Action::OFK_None &&
158+ " Need host toolchain for offloading!" );
159+ return ;
160+ }
161+
162+ HostTC->addClangTargetOptions (DriverArgs, CC1Args, DeviceOffloadingKind);
129163
130164 assert (DeviceOffloadingKind == Action::OFK_HIP &&
131165 " Only HIP offloading kinds are supported for GPUs." );
@@ -156,27 +190,37 @@ Tool *HIPSPVToolChain::buildLinker() const {
156190}
157191
158192void HIPSPVToolChain::addClangWarningOptions (ArgStringList &CC1Args) const {
159- HostTC.addClangWarningOptions (CC1Args);
193+ if (HostTC)
194+ HostTC->addClangWarningOptions (CC1Args);
195+ ToolChain::addClangWarningOptions (CC1Args);
160196}
161197
162198ToolChain::CXXStdlibType
163199HIPSPVToolChain::GetCXXStdlibType (const ArgList &Args) const {
164- return HostTC.GetCXXStdlibType (Args);
200+ if (HostTC)
201+ return HostTC->GetCXXStdlibType (Args);
202+ return ToolChain::GetCXXStdlibType (Args);
165203}
166204
167205void HIPSPVToolChain::AddClangSystemIncludeArgs (const ArgList &DriverArgs,
168206 ArgStringList &CC1Args) const {
169- HostTC.AddClangSystemIncludeArgs (DriverArgs, CC1Args);
207+ if (HostTC)
208+ HostTC->AddClangSystemIncludeArgs (DriverArgs, CC1Args);
209+ ToolChain::AddClangSystemIncludeArgs (DriverArgs, CC1Args);
170210}
171211
172212void HIPSPVToolChain::AddClangCXXStdlibIncludeArgs (
173213 const ArgList &Args, ArgStringList &CC1Args) const {
174- HostTC.AddClangCXXStdlibIncludeArgs (Args, CC1Args);
214+ if (HostTC)
215+ HostTC->AddClangCXXStdlibIncludeArgs (Args, CC1Args);
216+ ToolChain::AddClangCXXStdlibIncludeArgs (Args, CC1Args);
175217}
176218
177219void HIPSPVToolChain::AddIAMCUIncludeArgs (const ArgList &Args,
178220 ArgStringList &CC1Args) const {
179- HostTC.AddIAMCUIncludeArgs (Args, CC1Args);
221+ if (HostTC)
222+ HostTC->AddIAMCUIncludeArgs (Args, CC1Args);
223+ ToolChain::AddIAMCUIncludeArgs (Args, CC1Args);
180224}
181225
182226void HIPSPVToolChain::AddHIPIncludeArgs (const ArgList &DriverArgs,
@@ -270,12 +314,16 @@ SanitizerMask HIPSPVToolChain::getSupportedSanitizers() const {
270314 // This behavior is necessary because the host and device toolchains
271315 // invocations often share the command line, so the device toolchain must
272316 // tolerate flags meant only for the host toolchain.
273- return HostTC.getSupportedSanitizers ();
317+ if (HostTC)
318+ return HostTC->getSupportedSanitizers ();
319+ return ToolChain::getSupportedSanitizers ();
274320}
275321
276322VersionTuple HIPSPVToolChain::computeMSVCVersion (const Driver *D,
277323 const ArgList &Args) const {
278- return HostTC.computeMSVCVersion (D, Args);
324+ if (HostTC)
325+ return HostTC->computeMSVCVersion (D, Args);
326+ return ToolChain::computeMSVCVersion (D, Args);
279327}
280328
281329void HIPSPVToolChain::adjustDebugInfoKind (
0 commit comments