if (A->getOption().matches(options::OPT_no_offload_arch_EQ) &&
ArchStr == "all") {
GpuArchs.clear();
+ } else if (ArchStr == "native" &&
+ ToolChains.front()->getTriple().isAMDGPU()) {
+ auto *TC = static_cast<const toolchains::HIPAMDToolChain *>(
+ ToolChains.front());
+ SmallVector<std::string, 1> GPUs;
+ auto Err = TC->detectSystemGPUs(Args, GPUs);
+ if (!Err) {
+ for (auto GPU : GPUs)
+ GpuArchs.insert(Args.MakeArgString(GPU));
+ } else
+ llvm::consumeError(std::move(Err));
} else {
ArchStr = getCanonicalOffloadArch(ArchStr);
if (ArchStr.empty()) {
llvm::Error getSystemGPUArch(const llvm::opt::ArgList &Args,
std::string &GPUArch) const;
+ llvm::Error detectSystemGPUs(const llvm::opt::ArgList &Args,
+ SmallVector<std::string, 1> &GPUArchs) const;
+
protected:
/// Check and diagnose invalid target ID specified by -mcpu.
virtual void checkTargetID(const llvm::opt::ArgList &DriverArgs) const;
/// Get GPU arch from -mcpu without checking.
StringRef getGPUArch(const llvm::opt::ArgList &DriverArgs) const;
- llvm::Error detectSystemGPUs(const llvm::opt::ArgList &Args,
- SmallVector<std::string, 1> &GPUArchs) const;
};
class LLVM_LIBRARY_VISIBILITY ROCMToolChain : public AMDGPUToolChain {