@@ -190,8 +190,8 @@ Error asyncMemCopy(bool UseMultipleSdmaEngines, void *Dst, hsa_agent_t DstAgent,
190190#endif
191191}
192192
193- Expected<std::string> getTargetTripleAndFeatures (hsa_agent_t Agent) {
194- std::string Target;
193+ Error getTargetTripleAndFeatures (hsa_agent_t Agent,
194+ SmallVector<SmallString< 32 >> &Targets) {
195195 auto Err = hsa_utils::iterateAgentISAs (Agent, [&](hsa_isa_t ISA) {
196196 uint32_t Length;
197197 hsa_status_t Status;
@@ -205,13 +205,13 @@ Expected<std::string> getTargetTripleAndFeatures(hsa_agent_t Agent) {
205205 return Status;
206206
207207 llvm::StringRef TripleTarget (ISAName.begin (), Length);
208- if (TripleTarget.consume_front (" amdgcn-amd-amdhsa" ))
209- Target = TripleTarget.ltrim (' -' ).rtrim (' \0 ' ).str ();
210- return HSA_STATUS_INFO_BREAK;
208+ if (TripleTarget.consume_front (" amdgcn-amd-amdhsa" )) {
209+ auto Target = TripleTarget.ltrim (' -' ).rtrim (' \0 ' );
210+ Targets.push_back (Target);
211+ }
212+ return HSA_STATUS_SUCCESS;
211213 });
212- if (Err)
213- return Err;
214- return Target;
214+ return Err;
215215}
216216} // namespace hsa_utils
217217
@@ -1992,12 +1992,10 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
19921992 return Err;
19931993
19941994 // Detect if XNACK is enabled
1995- auto TargeTripleAndFeaturesOrError =
1996- hsa_utils::getTargetTripleAndFeatures (Agent);
1997- if (!TargeTripleAndFeaturesOrError)
1998- return TargeTripleAndFeaturesOrError.takeError ();
1999- if (static_cast <StringRef>(*TargeTripleAndFeaturesOrError)
2000- .contains (" xnack+" ))
1995+ SmallVector<SmallString<32 >> Targets;
1996+ if (auto Err = hsa_utils::getTargetTripleAndFeatures (Agent, Targets))
1997+ return Err;
1998+ if (!Targets.empty () && Targets[0 ].str ().contains (" xnack+" ))
20011999 IsXnackEnabled = true ;
20022000
20032001 // detect if device is an APU.
@@ -3211,13 +3209,16 @@ struct AMDGPUPluginTy final : public GenericPluginTy {
32113209 if (!Processor)
32123210 return false ;
32133211
3214- auto TargeTripleAndFeaturesOrError =
3215- hsa_utils::getTargetTripleAndFeatures (getKernelAgent (DeviceId));
3216- if (!TargeTripleAndFeaturesOrError)
3217- return TargeTripleAndFeaturesOrError.takeError ();
3218- return offloading::amdgpu::isImageCompatibleWithEnv (
3219- Processor ? *Processor : " " , ElfOrErr->getPlatformFlags (),
3220- *TargeTripleAndFeaturesOrError);
3212+ SmallVector<SmallString<32 >> Targets;
3213+ if (auto Err = hsa_utils::getTargetTripleAndFeatures (
3214+ getKernelAgent (DeviceId), Targets))
3215+ return Err;
3216+ for (auto &Target : Targets)
3217+ if (offloading::amdgpu::isImageCompatibleWithEnv (
3218+ Processor ? *Processor : " " , ElfOrErr->getPlatformFlags (),
3219+ Target.str ()))
3220+ return true ;
3221+ return false ;
32213222 }
32223223
32233224 bool isDataExchangable (int32_t SrcDeviceId, int32_t DstDeviceId) override {
0 commit comments