blob: 1dd54dd828645d2b66843135c689e3e94d4029f1 [file] [log] [blame]
Tom Stellard347ac792015-06-26 21:15:07 +00001//===-- 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
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000010#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
11#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
Yaron Keren178c4652015-08-16 07:55:08 +000012
Tom Stellardff7416b2015-06-26 21:58:31 +000013#include "AMDKernelCodeT.h"
Tom Stellard347ac792015-06-26 21:15:07 +000014#include "llvm/MC/MCStreamer.h"
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000015
Tom Stellard347ac792015-06-26 21:15:07 +000016namespace llvm {
Yaxun Liud6fbe652016-11-10 21:18:49 +000017#include "AMDGPURuntimeMetadata.h"
Tom Stellard347ac792015-06-26 21:15:07 +000018
Yaxun Liud6fbe652016-11-10 21:18:49 +000019class DataLayout;
20class Function;
Tom Stellard347ac792015-06-26 21:15:07 +000021class MCELFStreamer;
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000022class MCSymbol;
Yaxun Liud6fbe652016-11-10 21:18:49 +000023class MDNode;
24class Module;
25class Type;
Tom Stellard347ac792015-06-26 21:15:07 +000026
27class AMDGPUTargetStreamer : public MCTargetStreamer {
28public:
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;
Tom Stellardff7416b2015-06-26 21:58:31 +000037
38 virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) = 0;
Tom Stellard1e1b05d2015-11-06 11:45:14 +000039
40 virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) = 0;
Tom Stellard00f2f912015-12-02 19:47:57 +000041
42 virtual void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) = 0;
43
44 virtual void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) = 0;
Yaxun Liud6fbe652016-11-10 21:18:49 +000045
46 /// Emit runtime metadata as a note element.
47 void emitRuntimeMetadataAsNoteElement(Module &M);
48
49private:
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);
Tom Stellard347ac792015-06-26 21:15:07 +000075};
76
77class AMDGPUTargetAsmStreamer : public AMDGPUTargetStreamer {
78 formatted_raw_ostream &OS;
79public:
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;
Tom Stellardff7416b2015-06-26 21:58:31 +000087
88 void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
Tom Stellard1e1b05d2015-11-06 11:45:14 +000089
90 void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
Tom Stellard00f2f912015-12-02 19:47:57 +000091
92 void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) override;
93
94 void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) override;
Tom Stellard347ac792015-06-26 21:15:07 +000095};
96
97class AMDGPUTargetELFStreamer : public AMDGPUTargetStreamer {
Tom Stellard347ac792015-06-26 21:15:07 +000098 MCStreamer &Streamer;
99
100public:
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;
Tom Stellardff7416b2015-06-26 21:58:31 +0000111
112 void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override;
113
Tom Stellard1e1b05d2015-11-06 11:45:14 +0000114 void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;
Tom Stellard00f2f912015-12-02 19:47:57 +0000115
116 void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) override;
117
118 void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) override;
Tom Stellard347ac792015-06-26 21:15:07 +0000119};
120
121}
Yaron Keren178c4652015-08-16 07:55:08 +0000122#endif