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