1 //===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- C++ -*--===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
11 #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
12 
13 #include "AMDKernelCodeT.h"
14 #include "llvm/BinaryFormat/MsgPackTypes.h"
15 #include "llvm/MC/MCStreamer.h"
16 #include "llvm/MC/MCSubtargetInfo.h"
17 #include "llvm/Support/AMDGPUMetadata.h"
18 #include "llvm/Support/AMDHSAKernelDescriptor.h"
19 
20 namespace llvm {
21 #include "AMDGPUPTNote.h"
22 
23 class DataLayout;
24 class Function;
25 class MCELFStreamer;
26 class MCSymbol;
27 class MDNode;
28 class Module;
29 class Type;
30 
31 class AMDGPUTargetStreamer : public MCTargetStreamer {
32 protected:
getContext()33   MCContext &getContext() const { return Streamer.getContext(); }
34 
35 public:
AMDGPUTargetStreamer(MCStreamer & S)36   AMDGPUTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
37 
38   virtual void EmitDirectiveAMDGCNTarget(StringRef Target) = 0;
39 
40   virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
41                                                  uint32_t Minor) = 0;
42 
43   virtual void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
44                                              uint32_t Stepping,
45                                              StringRef VendorName,
46                                              StringRef ArchName) = 0;
47 
48   virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) = 0;
49 
50   virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) = 0;
51 
52   /// \returns True on success, false on failure.
53   virtual bool EmitISAVersion(StringRef IsaVersionString) = 0;
54 
55   /// \returns True on success, false on failure.
56   virtual bool EmitHSAMetadataV2(StringRef HSAMetadataString);
57 
58   /// \returns True on success, false on failure.
59   virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString);
60 
61   /// Emit HSA Metadata
62   ///
63   /// When \p Strict is true, known metadata elements must already be
64   /// well-typed. When \p Strict is false, known types are inferred and
65   /// the \p HSAMetadata structure is updated with the correct types.
66   ///
67   /// \returns True on success, false on failure.
68   virtual bool EmitHSAMetadata(std::shared_ptr<msgpack::Node> &HSAMetadata,
69                                bool Strict) = 0;
70 
71   /// \returns True on success, false on failure.
72   virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) = 0;
73 
74   /// \returns True on success, false on failure.
75   virtual bool EmitPALMetadata(const AMDGPU::PALMD::Metadata &PALMetadata) = 0;
76 
77   virtual void EmitAmdhsaKernelDescriptor(
78       const MCSubtargetInfo &STI, StringRef KernelName,
79       const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR,
80       uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr,
81       bool ReserveXNACK) = 0;
82 
83   static StringRef getArchNameFromElfMach(unsigned ElfMach);
84   static unsigned getElfMach(StringRef GPU);
85 };
86 
87 class AMDGPUTargetAsmStreamer final : public AMDGPUTargetStreamer {
88   formatted_raw_ostream &OS;
89 public:
90   AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
91 
92   void EmitDirectiveAMDGCNTarget(StringRef Target) override;
93 
94   void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
95                                          uint32_t Minor) override;
96 
97   void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
98                                      uint32_t Stepping, StringRef VendorName,
99                                      StringRef ArchName) override;
100 
101   void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
102 
103   void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
104 
105   /// \returns True on success, false on failure.
106   bool EmitISAVersion(StringRef IsaVersionString) override;
107 
108   /// \returns True on success, false on failure.
109   bool EmitHSAMetadata(std::shared_ptr<msgpack::Node> &HSAMetadata,
110                        bool Strict) override;
111 
112   /// \returns True on success, false on failure.
113   bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override;
114 
115   /// \returns True on success, false on failure.
116   bool EmitPALMetadata(const AMDGPU::PALMD::Metadata &PALMetadata) override;
117 
118   void EmitAmdhsaKernelDescriptor(
119       const MCSubtargetInfo &STI, StringRef KernelName,
120       const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR,
121       uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr,
122       bool ReserveXNACK) override;
123 };
124 
125 class AMDGPUTargetELFStreamer final : public AMDGPUTargetStreamer {
126   MCStreamer &Streamer;
127 
128   void EmitNote(StringRef Name, const MCExpr *DescSize, unsigned NoteType,
129                 function_ref<void(MCELFStreamer &)> EmitDesc);
130 
131 public:
132   AMDGPUTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
133 
134   MCELFStreamer &getStreamer();
135 
136   void EmitDirectiveAMDGCNTarget(StringRef Target) override;
137 
138   void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
139                                          uint32_t Minor) override;
140 
141   void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
142                                      uint32_t Stepping, StringRef VendorName,
143                                      StringRef ArchName) override;
144 
145   void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
146 
147   void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
148 
149   /// \returns True on success, false on failure.
150   bool EmitISAVersion(StringRef IsaVersionString) override;
151 
152   /// \returns True on success, false on failure.
153   bool EmitHSAMetadata(std::shared_ptr<msgpack::Node> &HSAMetadata,
154                        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 EmitPALMetadata(const AMDGPU::PALMD::Metadata &PALMetadata) override;
161 
162   void EmitAmdhsaKernelDescriptor(
163       const MCSubtargetInfo &STI, StringRef KernelName,
164       const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR,
165       uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr,
166       bool ReserveXNACK) override;
167 };
168 
169 }
170 #endif
171