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 "llvm/TargetParser/Triple.h"
14#include <cstdint>
15#include <tuple>
16
17namespace llvm {
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 AMDGCNSPIRV, // 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 getAMDGCNSPIRV() {
73 return {TargetArch::AMDGCNSPIRV, 0};
74 }
75 static constexpr OffloadArch getGeneric() { return {TargetArch::Generic, 0}; }
76
77 /// Default architectures used when the user does not specify one.
78 static OffloadArch CudaDefault();
79 static OffloadArch HIPDefault();
80
81 TargetArch targetArch() const { return V; }
82
83 bool isNVPTX() const { return V == TargetArch::NVPTX; }
84 bool isAMDGPU() const { return V == TargetArch::AMDGPU; }
85 bool isAMDGCNSPIRV() const { return V == TargetArch::AMDGCNSPIRV; }
86 bool isIntelCPU() const { return V == TargetArch::IntelCPU; }
87 bool isIntelGPU() const { return V == TargetArch::IntelGPU; }
88 bool isIntel() const { return isIntelCPU() || isIntelGPU(); }
89 bool isGeneric() const { return V == TargetArch::Generic; }
90 bool isUnused() const { return V == TargetArch::Unused; }
91 bool isUnknown() const { return V == TargetArch::Unknown; }
92
93 // Only valid when isNVPTX() / isAMDGPU() respectively.
94 llvm::NVPTX::GPUKind nvptxKind() const {
95 return static_cast<llvm::NVPTX::GPUKind>(Kind);
96 }
97 llvm::AMDGPU::GPUKind amdgpuKind() const {
98 return static_cast<llvm::AMDGPU::GPUKind>(Kind);
99 }
100
101 bool operator==(const OffloadArch &Other) const {
102 return V == Other.V && Kind == Other.Kind;
103 }
104 bool operator!=(const OffloadArch &Other) const { return !(*this == Other); }
105
106 bool operator<(const OffloadArch &Other) const {
107 return std::tie(V, Kind) < std::tie(Other.V, Other.Kind);
108 }
109};
110
111const char *OffloadArchToString(OffloadArch A);
112const char *OffloadArchToVirtualArchString(OffloadArch A);
113
114// Convert a string to an OffloadArch. Returns an Unknown OffloadArch if the
115// string is not recognized.
116OffloadArch StringToOffloadArch(llvm::StringRef S);
117
118/// Append the canonical names of all NVIDIA and AMDGPU GPUs.
120
121OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch);
122llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID);
123
124llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
125 OffloadArch ID);
126
127/// Represents a bound architecture for offload / multiple architecture
128/// compilation.
129struct BoundArch {
130 llvm::StringRef ArchName;
131
132 /// The parsed offload architecture.
133 /// Will be an Unknown OffloadArch if ArchName is not recognized.
135
136 BoundArch() = default;
137 explicit BoundArch(llvm::StringRef Name)
138 : ArchName(Name), Arch(Name.empty() ? OffloadArch::getUnknown()
139 : StringToOffloadArch(Name)) {}
140
141 BoundArch(llvm::StringRef Name, OffloadArch A) : ArchName(Name), Arch(A) {}
142
143 bool empty() const { return ArchName.empty(); }
144 explicit operator bool() const { return !Arch.isUnused(); }
145
146 bool operator==(const BoundArch &Other) const {
147 return Arch == Other.Arch && ArchName == Other.ArchName;
148 }
149
150 bool operator<(const BoundArch &Other) const {
151 return std::tie(Arch, ArchName) < std::tie(Other.Arch, Other.ArchName);
152 }
153};
154
155} // namespace clang
156
157#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
static constexpr OffloadArch getAMDGCNSPIRV()
Definition OffloadArch.h:72
constexpr OffloadArch()=default
static constexpr OffloadArch getGeneric()
Definition OffloadArch.h:75
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:83
static OffloadArch HIPDefault()
bool operator==(const OffloadArch &Other) const
static constexpr OffloadArch getUnknown()
Definition OffloadArch.h:71
bool isIntel() const
Definition OffloadArch.h:88
static constexpr OffloadArch getIntel(TargetArch V, IntelArch A)
Definition OffloadArch.h:67
bool isAMDGPU() const
Definition OffloadArch.h:84
bool isUnknown() const
Definition OffloadArch.h:91
llvm::NVPTX::GPUKind nvptxKind() const
Definition OffloadArch.h:94
llvm::AMDGPU::GPUKind amdgpuKind() const
Definition OffloadArch.h:97
bool isIntelCPU() const
Definition OffloadArch.h:86
bool operator!=(const OffloadArch &Other) const
bool isAMDGCNSPIRV() const
Definition OffloadArch.h:85
bool isUnused() const
Definition OffloadArch.h:90
TargetArch targetArch() const
Definition OffloadArch.h:81
static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K)
Definition OffloadArch.h:64
bool isIntelGPU() const
Definition OffloadArch.h:87
bool isGeneric() const
Definition OffloadArch.h:89
Top level wrappers for InstallAPI frontend operations.
llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID)
OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch)
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:1775
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