clang 24.0.0git
OffloadArch.h
Go to the documentation of this file.
1//===--- OffloadArch.h - Definition of offloading architectures --- C++ -*-===//
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//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_BASIC_OFFLOADARCH_H
10#define LLVM_CLANG_BASIC_OFFLOADARCH_H
11
12#include "llvm/ADT/StringRef.h"
13#include <cstdint>
14#include <tuple>
15
16namespace llvm {
17class Triple;
18template <typename T> class SmallVectorImpl;
19namespace NVPTX {
20enum GPUKind : uint8_t;
21}
22namespace AMDGPU {
23enum GPUKind : uint8_t;
24}
25} // namespace llvm
26
27namespace clang {
28
29/// A processor an offloading action can target. This is a tagged handle pairing
30/// a TargetArch with the matching TargetParser GPU kind; it does not enumerate
31/// individual GPUs, so new targets are added in the TargetParser data alone.
32class OffloadArch {
33public:
34 enum class TargetArch : uint8_t {
35 Unused, // Default-constructed; no architecture bound.
36 Unknown, // A name that matched no known architecture.
37 NVPTX, // Kind is an llvm::NVPTX::GPUKind.
38 AMDGPU, // Kind is an llvm::AMDGPU::GPUKind.
39 SPIRV, // The 'amdgcnspirv' pseudo target.
40 IntelCPU, // Kind is an IntelArch.
41 IntelGPU, // Kind is an IntelArch.
42 Generic, // The 'generic' processor model.
43 };
44
45 // Intel architectures, which have no TargetParser list yet.
50
51private:
52 // Interpreted according to V; unused for the tagless TargetArch values.
53 uint32_t Kind = 0;
54 TargetArch V = TargetArch::Unused;
55
56 constexpr OffloadArch(TargetArch V, uint32_t Kind) : Kind(Kind), V(V) {}
57
58public:
59 constexpr OffloadArch() = default;
60
61 static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K) {
62 return {TargetArch::NVPTX, static_cast<uint32_t>(K)};
63 }
64 static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K) {
65 return {TargetArch::AMDGPU, static_cast<uint32_t>(K)};
66 }
67 static constexpr OffloadArch getIntel(TargetArch V, IntelArch A) {
68 return {V, static_cast<uint32_t>(A)};
69 }
70 static constexpr OffloadArch getUnused() { return {TargetArch::Unused, 0}; }
71 static constexpr OffloadArch getUnknown() { return {TargetArch::Unknown, 0}; }
72 static constexpr OffloadArch getSPIRV() { return {TargetArch::SPIRV, 0}; }
73 static constexpr OffloadArch getGeneric() { return {TargetArch::Generic, 0}; }
74
75 /// Default architectures used when the user does not specify one.
76 static OffloadArch CudaDefault();
77 static OffloadArch HIPDefault();
78
79 TargetArch targetArch() const { return V; }
80
81 bool isNVPTX() const { return V == TargetArch::NVPTX; }
82 bool isAMDGPU() const { return V == TargetArch::AMDGPU; }
83 bool isSPIRV() const { return V == TargetArch::SPIRV; }
84 bool isIntelCPU() const { return V == TargetArch::IntelCPU; }
85 bool isIntelGPU() const { return V == TargetArch::IntelGPU; }
86 bool isIntel() const { return isIntelCPU() || isIntelGPU(); }
87 bool isGeneric() const { return V == TargetArch::Generic; }
88 bool isUnused() const { return V == TargetArch::Unused; }
89 bool isUnknown() const { return V == TargetArch::Unknown; }
90
91 // Only valid when isNVPTX() / isAMDGPU() respectively.
92 llvm::NVPTX::GPUKind nvptxKind() const {
93 return static_cast<llvm::NVPTX::GPUKind>(Kind);
94 }
95 llvm::AMDGPU::GPUKind amdgpuKind() const {
96 return static_cast<llvm::AMDGPU::GPUKind>(Kind);
97 }
98
99 bool operator==(const OffloadArch &Other) const {
100 return V == Other.V && Kind == Other.Kind;
101 }
102 bool operator!=(const OffloadArch &Other) const { return !(*this == Other); }
103
104 bool operator<(const OffloadArch &Other) const {
105 return std::tie(V, Kind) < std::tie(Other.V, Other.Kind);
106 }
107};
108
109const char *OffloadArchToString(OffloadArch A);
110const char *OffloadArchToVirtualArchString(OffloadArch A);
111
112// Convert a string to an OffloadArch. Returns an Unknown OffloadArch if the
113// string is not recognized.
114OffloadArch StringToOffloadArch(llvm::StringRef S);
115
116/// Append the canonical names of all NVIDIA and AMDGPU GPUs.
118
119llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
120 OffloadArch ID);
121
122/// Represents a bound architecture for offload / multiple architecture
123/// compilation.
124struct BoundArch {
125 llvm::StringRef ArchName;
126
127 /// The parsed offload architecture.
128 /// Will be an Unknown OffloadArch if ArchName is not recognized.
130
131 BoundArch() = default;
132 explicit BoundArch(llvm::StringRef Name)
133 : ArchName(Name), Arch(Name.empty() ? OffloadArch::getUnknown()
134 : StringToOffloadArch(Name)) {}
135
136 BoundArch(llvm::StringRef Name, OffloadArch A) : ArchName(Name), Arch(A) {}
137
138 bool empty() const { return ArchName.empty(); }
139 explicit operator bool() const { return !Arch.isUnused(); }
140
141 bool operator==(const BoundArch &Other) const {
142 return Arch == Other.Arch && ArchName == Other.ArchName;
143 }
144
145 bool operator<(const BoundArch &Other) const {
146 return std::tie(Arch, ArchName) < std::tie(Other.Arch, Other.ArchName);
147 }
148};
149
150} // namespace clang
151
152#endif // LLVM_CLANG_BASIC_OFFLOADARCH_H
#define V(N, I)
A processor an offloading action can target.
Definition OffloadArch.h:32
static constexpr OffloadArch getUnused()
Definition OffloadArch.h:70
constexpr OffloadArch()=default
static constexpr OffloadArch getGeneric()
Definition OffloadArch.h:73
static OffloadArch CudaDefault()
Default architectures used when the user does not specify one.
bool operator<(const OffloadArch &Other) const
static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K)
Definition OffloadArch.h:61
bool isNVPTX() const
Definition OffloadArch.h:81
static OffloadArch HIPDefault()
bool isSPIRV() const
Definition OffloadArch.h:83
bool operator==(const OffloadArch &Other) const
Definition OffloadArch.h:99
static constexpr OffloadArch getUnknown()
Definition OffloadArch.h:71
bool isIntel() const
Definition OffloadArch.h:86
static constexpr OffloadArch getIntel(TargetArch V, IntelArch A)
Definition OffloadArch.h:67
bool isAMDGPU() const
Definition OffloadArch.h:82
bool isUnknown() const
Definition OffloadArch.h:89
llvm::NVPTX::GPUKind nvptxKind() const
Definition OffloadArch.h:92
llvm::AMDGPU::GPUKind amdgpuKind() const
Definition OffloadArch.h:95
bool isIntelCPU() const
Definition OffloadArch.h:84
bool operator!=(const OffloadArch &Other) const
static constexpr OffloadArch getSPIRV()
Definition OffloadArch.h:72
bool isUnused() const
Definition OffloadArch.h:88
TargetArch targetArch() const
Definition OffloadArch.h:79
static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K)
Definition OffloadArch.h:64
bool isIntelGPU() const
Definition OffloadArch.h:85
bool isGeneric() const
Definition OffloadArch.h:87
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.
@ Other
Other implicit parameter.
Definition Decl.h:1774
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
llvm::StringRef ArchName
bool empty() const
bool operator<(const BoundArch &Other) const
BoundArch(llvm::StringRef Name, OffloadArch A)
OffloadArch Arch
The parsed offload architecture.
BoundArch(llvm::StringRef Name)
BoundArch()=default
bool operator==(const BoundArch &Other) const