clang 24.0.0git
OffloadArch.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
9
10#include "llvm/ADT/SmallVector.h"
11#include "llvm/ADT/StringRef.h"
12#include "llvm/TargetParser/AMDGPUTargetParser.h"
13#include "llvm/TargetParser/NVPTXTargetParser.h"
14#include "llvm/TargetParser/Triple.h"
15
16namespace clang {
17
19 return getNVPTX(llvm::NVPTX::parseArch("sm_52"));
20}
21
23 return getAMDGPU(llvm::AMDGPU::parseArchAMDGCN("gfx906"));
24}
25
27 switch (A.targetArch()) {
29 return "";
31 return "unknown";
33 return llvm::NVPTX::getArchName(A.nvptxKind()).data();
35 return llvm::AMDGPU::getArchNameAMDGCN(A.amdgpuKind()).data();
37 return "amdgcnspirv";
39 return "graniterapids";
41 return "bmg_g21";
43 return "generic";
44 }
45 return "unknown";
46}
47
49 switch (A.targetArch()) {
51 return llvm::NVPTX::getVirtualArch(A.nvptxKind()).data();
54 return "compute_amdgcn";
56 return "unknown";
61 return "";
62 }
63 return "unknown";
64}
65
66OffloadArch StringToOffloadArch(llvm::StringRef S) {
67 // The empty string denotes the "unused" architecture.
68 if (S.empty())
70
71 // Non-GPU-table pseudo/sentinel architectures.
72 if (S == "amdgcnspirv")
73 return OffloadArch::getSPIRV();
74 if (S == "generic")
76 if (S == "graniterapids")
79 if (S == "bmg_g21")
82
83 // Otherwise defer to the vendor TargetParser GPU lists.
84 if (llvm::NVPTX::GPUKind NV = llvm::NVPTX::parseArch(S))
85 return OffloadArch::getNVPTX(NV);
86 if (llvm::AMDGPU::GPUKind AK = llvm::AMDGPU::parseArchAMDGCN(S))
87 return OffloadArch::getAMDGPU(AK);
89}
90
92#define NVPTX_GPU(NAME, KIND, VIRTUAL, SM_ID, MIN_VER, MAX_VER, SUFFIX) \
93 Values.push_back(NAME);
94#include "llvm/TargetParser/NVPTXTargetParser.def"
95 llvm::AMDGPU::fillValidArchListAMDGCN(Values, llvm::Triple::NoSubArch);
96}
97
98llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
99 OffloadArch ID) {
100 if (ID.isSPIRV())
101 return llvm::Triple(llvm::Triple::spirv64, llvm::Triple::NoSubArch,
102 llvm::Triple::AMD, llvm::Triple::AMDHSA);
103
104 if (ID.isNVPTX()) {
105 llvm::Triple::ArchType Arch = DefaultToolchainTriple.isArch64Bit()
106 ? llvm::Triple::nvptx64
107 : llvm::Triple::nvptx;
108 return llvm::Triple(Arch, llvm::Triple::NoSubArch, llvm::Triple::NVIDIA,
109 llvm::Triple::CUDA);
110 }
111
112 if (ID.isAMDGPU())
113 return llvm::Triple("amdgcn-amd-amdhsa");
114
115 return {};
116}
117
118} // namespace clang
A processor an offloading action can target.
Definition OffloadArch.h:32
static constexpr OffloadArch getUnused()
Definition OffloadArch.h:70
static constexpr OffloadArch getGeneric()
Definition OffloadArch.h:73
static OffloadArch CudaDefault()
Default architectures used when the user does not specify one.
static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K)
Definition OffloadArch.h:61
static OffloadArch HIPDefault()
static constexpr OffloadArch getUnknown()
Definition OffloadArch.h:71
static constexpr OffloadArch getIntel(TargetArch V, IntelArch A)
Definition OffloadArch.h:67
llvm::NVPTX::GPUKind nvptxKind() const
Definition OffloadArch.h:92
llvm::AMDGPU::GPUKind amdgpuKind() const
Definition OffloadArch.h:95
static constexpr OffloadArch getSPIRV()
Definition OffloadArch.h:72
TargetArch targetArch() const
Definition OffloadArch.h:79
static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K)
Definition OffloadArch.h:64
Top level wrappers for InstallAPI frontend operations.
const char * OffloadArchToVirtualArchString(OffloadArch A)
OffloadArch StringToOffloadArch(llvm::StringRef S)
const char * OffloadArchToString(OffloadArch A)
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple, OffloadArch ID)
void fillValidOffloadArchList(llvm::SmallVectorImpl< llvm::StringRef > &Values)
Append the canonical names of all NVIDIA and AMDGPU GPUs.