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 "AMDGPUPTNote.h"
18 
19 class DataLayout;
20 class FeatureBitset;
21 class Function;
22 class MCELFStreamer;
23 class MCSymbol;
24 class MDNode;
25 class Module;
26 class Type;
27 
28 class AMDGPUTargetStreamer : public MCTargetStreamer {
29 protected:
30   MCContext &getContext() const { return Streamer.getContext(); }
31 
32 public:
33   AMDGPUTargetStreamer(MCStreamer &S);
34   virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
35                                                  uint32_t Minor) = 0;
36 
37   virtual void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
38                                              uint32_t Stepping,
39                                              StringRef VendorName,
40                                              StringRef ArchName) = 0;
41 
42   virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) = 0;
43 
44   virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) = 0;
45 
46   virtual void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) = 0;
47 
48   virtual void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) = 0;
49 
50   virtual void EmitRuntimeMetadata(const FeatureBitset &Features,
51                                    const Module &M) = 0;
52 
53   /// \returns False on success, true on failure.
54   virtual bool EmitRuntimeMetadata(const FeatureBitset &Features,
55                                    StringRef Metadata) = 0;
56 };
57 
58 class AMDGPUTargetAsmStreamer : public AMDGPUTargetStreamer {
59   formatted_raw_ostream &OS;
60 public:
61   AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
62   void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
63                                          uint32_t Minor) override;
64 
65   void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
66                                      uint32_t Stepping, StringRef VendorName,
67                                      StringRef ArchName) override;
68 
69   void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
70 
71   void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
72 
73   void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) override;
74 
75   void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) override;
76 
77   void EmitRuntimeMetadata(const FeatureBitset &Features,
78                            const Module &M) override;
79 
80   /// \returns False on success, true on failure.
81   bool EmitRuntimeMetadata(const FeatureBitset &Features,
82                            StringRef Metadata) override;
83 };
84 
85 class AMDGPUTargetELFStreamer : public AMDGPUTargetStreamer {
86   MCStreamer &Streamer;
87 
88   void EmitAMDGPUNote(const MCExpr *DescSize, AMDGPU::PT_NOTE::NoteType Type,
89                       function_ref<void(MCELFStreamer &)> EmitDesc);
90 
91 public:
92   AMDGPUTargetELFStreamer(MCStreamer &S);
93 
94   MCELFStreamer &getStreamer();
95 
96   void EmitDirectiveHSACodeObjectVersion(uint32_t Major,
97                                          uint32_t Minor) override;
98 
99   void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor,
100                                      uint32_t Stepping, StringRef VendorName,
101                                      StringRef ArchName) override;
102 
103   void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
104 
105   void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
106 
107   void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) override;
108 
109   void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) override;
110 
111   void EmitRuntimeMetadata(const FeatureBitset &Features,
112                            const Module &M) override;
113 
114   /// \returns False on success, true on failure.
115   bool EmitRuntimeMetadata(const FeatureBitset &Features,
116                            StringRef Metadata) override;
117 };
118 
119 }
120 #endif
121