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/MC/MCStreamer.h"
15 
16 namespace llvm {
17 #include "AMDGPURuntimeMetadata.h"
18 
19 class DataLayout;
20 class Function;
21 class MCELFStreamer;
22 class MCSymbol;
23 class MDNode;
24 class Module;
25 class Type;
26 
27 class AMDGPUTargetStreamer : public MCTargetStreamer {
28 public:
29   AMDGPUTargetStreamer(MCStreamer &S);
30   virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
31                                                  uint32_t Minor) = 0;
32 
33   virtual void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
34                                              uint32_t Stepping,
35                                              StringRef VendorName,
36                                              StringRef ArchName) = 0;
37 
38   virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) = 0;
39 
40   virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) = 0;
41 
42   virtual void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) = 0;
43 
44   virtual void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) = 0;
45 
46   /// Emit runtime metadata as a note element.
47   void emitRuntimeMetadataAsNoteElement(Module &M);
48 
49 private:
50   void emitRuntimeMetadata(Module &M);
51   void emitStartOfRuntimeMetadata(const Module &M);
52 
53   /// Emit runtime metadata for a kernel function.
54   void emitRuntimeMetadata(const Function &F);
55 
56   // Emit runtime metadata for a kernel argument.
57   void emitRuntimeMetadataForKernelArg(const DataLayout &DL,
58       Type *T, AMDGPU::RuntimeMD::KernelArg::Kind Kind,
59       StringRef BaseTypeName = "", StringRef TypeName = "",
60       StringRef ArgName = "", StringRef TypeQual = "",
61       StringRef AccQual = "");
62 
63   /// Emit a key and an integer value for runtime metadata.
64   void emitRuntimeMDIntValue(AMDGPU::RuntimeMD::Key K,
65       uint64_t V, unsigned Size);
66 
67   /// Emit a key and a string value for runtime metadata.
68   void emitRuntimeMDStringValue(AMDGPU::RuntimeMD::Key K,
69       StringRef S);
70 
71   /// Emit a key and three integer values for runtime metadata.
72   /// The three integer values are obtained from MDNode \p Node;
73   void emitRuntimeMDThreeIntValues(AMDGPU::RuntimeMD::Key K, MDNode *Node,
74                                    unsigned Size);
75 };
76 
77 class AMDGPUTargetAsmStreamer : public AMDGPUTargetStreamer {
78   formatted_raw_ostream &OS;
79 public:
80   AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
81   void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
82                                          uint32_t Minor) override;
83 
84   void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
85                                      uint32_t Stepping, StringRef VendorName,
86                                      StringRef ArchName) override;
87 
88   void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
89 
90   void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
91 
92   void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) override;
93 
94   void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) override;
95 };
96 
97 class AMDGPUTargetELFStreamer : public AMDGPUTargetStreamer {
98   MCStreamer &Streamer;
99 
100 public:
101   AMDGPUTargetELFStreamer(MCStreamer &S);
102 
103   MCELFStreamer &getStreamer();
104 
105   void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
106                                          uint32_t Minor) override;
107 
108   void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
109                                      uint32_t Stepping, StringRef VendorName,
110                                      StringRef ArchName) override;
111 
112   void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
113 
114   void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
115 
116   void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) override;
117 
118   void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) override;
119 };
120 
121 }
122 #endif
123