Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h
Line
Count
Source (jump to first uncovered line)
1
//===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- 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_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
10
#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
11
12
#include "Utils/AMDGPUBaseInfo.h"
13
#include "Utils/AMDGPUPALMetadata.h"
14
#include "llvm/MC/MCStreamer.h"
15
16
struct amd_kernel_code_t;
17
18
namespace llvm {
19
20
class MCELFStreamer;
21
class MCSymbol;
22
class formatted_raw_ostream;
23
24
namespace AMDGPU {
25
namespace HSAMD {
26
struct Metadata;
27
}
28
} // namespace AMDGPU
29
30
namespace amdhsa {
31
struct kernel_descriptor_t;
32
}
33
34
class AMDGPUTargetStreamer : public MCTargetStreamer {
35
  AMDGPUPALMetadata PALMetadata;
36
37
protected:
38
  // TODO: Move HSAMetadataStream to AMDGPUTargetStreamer.
39
  std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> TargetID;
40
41
0
  MCContext &getContext() const { return Streamer.getContext(); }
42
43
public:
44
0
  AMDGPUTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
45
46
0
  AMDGPUPALMetadata *getPALMetadata() { return &PALMetadata; }
47
48
0
  virtual void EmitDirectiveAMDGCNTarget(){};
49
50
  virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
51
0
                                                 uint32_t Minor){};
52
53
  virtual void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor,
54
                                               uint32_t Stepping,
55
                                               StringRef VendorName,
56
0
                                               StringRef ArchName){};
57
58
0
  virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header){};
59
60
0
  virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type){};
61
62
0
  virtual void emitAMDGPULDS(MCSymbol *Symbol, unsigned Size, Align Alignment) {
63
0
  }
64
65
  /// \returns True on success, false on failure.
66
0
  virtual bool EmitISAVersion() { return true; }
67
68
  /// \returns True on success, false on failure.
69
  virtual bool EmitHSAMetadataV2(StringRef HSAMetadataString);
70
71
  /// \returns True on success, false on failure.
72
  virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString);
73
74
  /// Emit HSA Metadata
75
  ///
76
  /// When \p Strict is true, known metadata elements must already be
77
  /// well-typed. When \p Strict is false, known types are inferred and
78
  /// the \p HSAMetadata structure is updated with the correct types.
79
  ///
80
  /// \returns True on success, false on failure.
81
0
  virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) {
82
0
    return true;
83
0
  }
84
85
  /// \returns True on success, false on failure.
86
0
  virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) {
87
0
    return true;
88
0
  }
89
90
  /// \returns True on success, false on failure.
91
0
  virtual bool EmitCodeEnd(const MCSubtargetInfo &STI) { return true; }
92
93
  /// \returns True on success, false on failure.
94
0
  virtual bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) {
95
0
    return true;
96
0
  }
97
98
  virtual void EmitAmdhsaKernelDescriptor(
99
      const MCSubtargetInfo &STI, StringRef KernelName,
100
      const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR,
101
      uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr,
102
0
      unsigned CodeObjectVersion){};
103
104
  static StringRef getArchNameFromElfMach(unsigned ElfMach);
105
  static unsigned getElfMach(StringRef GPU);
106
107
0
  const std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() const {
108
0
    return TargetID;
109
0
  }
110
0
  std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() {
111
0
    return TargetID;
112
0
  }
113
  void initializeTargetID(const MCSubtargetInfo &STI,
114
0
                          unsigned CodeObjectVersion) {
115
0
    assert(TargetID == std::nullopt && "TargetID can only be initialized once");
116
0
    TargetID.emplace(STI);
117
0
    getTargetID()->setCodeObjectVersion(CodeObjectVersion);
118
0
  }
119
  void initializeTargetID(const MCSubtargetInfo &STI, StringRef FeatureString,
120
0
                          unsigned CodeObjectVersion) {
121
0
    initializeTargetID(STI, CodeObjectVersion);
122
123
0
    assert(getTargetID() != std::nullopt && "TargetID is None");
124
0
    getTargetID()->setTargetIDFromFeaturesString(FeatureString);
125
0
  }
126
};
127
128
class AMDGPUTargetAsmStreamer final : public AMDGPUTargetStreamer {
129
  formatted_raw_ostream &OS;
130
public:
131
  AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
132
133
  void finish() override;
134
135
  void EmitDirectiveAMDGCNTarget() override;
136
137
  void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
138
                                         uint32_t Minor) override;
139
140
  void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor,
141
                                       uint32_t Stepping, StringRef VendorName,
142
                                       StringRef ArchName) override;
143
144
  void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
145
146
  void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
147
148
  void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override;
149
150
  /// \returns True on success, false on failure.
151
  bool EmitISAVersion() override;
152
153
  /// \returns True on success, false on failure.
154
  bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override;
155
156
  /// \returns True on success, false on failure.
157
  bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override;
158
159
  /// \returns True on success, false on failure.
160
  bool EmitCodeEnd(const MCSubtargetInfo &STI) override;
161
162
  /// \returns True on success, false on failure.
163
  bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) override;
164
165
  void EmitAmdhsaKernelDescriptor(
166
      const MCSubtargetInfo &STI, StringRef KernelName,
167
      const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR,
168
      uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr,
169
      unsigned CodeObjectVersion) override;
170
};
171
172
class AMDGPUTargetELFStreamer final : public AMDGPUTargetStreamer {
173
  const MCSubtargetInfo &STI;
174
  MCStreamer &Streamer;
175
176
  void EmitNote(StringRef Name, const MCExpr *DescSize, unsigned NoteType,
177
                function_ref<void(MCELFStreamer &)> EmitDesc);
178
179
  unsigned getEFlags();
180
181
  unsigned getEFlagsR600();
182
  unsigned getEFlagsAMDGCN();
183
184
  unsigned getEFlagsUnknownOS();
185
  unsigned getEFlagsAMDHSA();
186
  unsigned getEFlagsAMDPAL();
187
  unsigned getEFlagsMesa3D();
188
189
  unsigned getEFlagsV3();
190
  unsigned getEFlagsV4();
191
192
public:
193
  AMDGPUTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
194
195
  MCELFStreamer &getStreamer();
196
197
  void finish() override;
198
199
  void EmitDirectiveAMDGCNTarget() override;
200
201
  void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
202
                                         uint32_t Minor) override;
203
204
  void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor,
205
                                       uint32_t Stepping, StringRef VendorName,
206
                                       StringRef ArchName) override;
207
208
  void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
209
210
  void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
211
212
  void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override;
213
214
  /// \returns True on success, false on failure.
215
  bool EmitISAVersion() override;
216
217
  /// \returns True on success, false on failure.
218
  bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override;
219
220
  /// \returns True on success, false on failure.
221
  bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override;
222
223
  /// \returns True on success, false on failure.
224
  bool EmitCodeEnd(const MCSubtargetInfo &STI) override;
225
226
  /// \returns True on success, false on failure.
227
  bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) override;
228
229
  void EmitAmdhsaKernelDescriptor(
230
      const MCSubtargetInfo &STI, StringRef KernelName,
231
      const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR,
232
      uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr,
233
      unsigned CodeObjectVersion) override;
234
};
235
236
}
237
#endif