blob: edeb485518dbe1fbc41e1eda5b2fc55462a87561 [file] [log] [blame]
Tom Stellard347ac792015-06-26 21:15:07 +00001//===-- AMDGPUTargetStreamer.cpp - Mips Target Streamer Methods -----------===//
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// This file provides AMDGPU specific target streamer methods.
11//
12//===----------------------------------------------------------------------===//
13
Yaxun Liud6fbe652016-11-10 21:18:49 +000014#include "AMDGPU.h"
Tom Stellard347ac792015-06-26 21:15:07 +000015#include "AMDGPUTargetStreamer.h"
Tom Stellardff7416b2015-06-26 21:58:31 +000016#include "SIDefines.h"
Tom Stellarde135ffd2015-09-25 21:41:28 +000017#include "Utils/AMDGPUBaseInfo.h"
Sam Koltona2e5c882016-09-09 10:08:02 +000018#include "Utils/AMDKernelCodeTUtils.h"
Tom Stellard347ac792015-06-26 21:15:07 +000019#include "llvm/ADT/Twine.h"
Yaxun Liud6fbe652016-11-10 21:18:49 +000020#include "llvm/IR/Constants.h"
21#include "llvm/IR/Function.h"
22#include "llvm/IR/Metadata.h"
23#include "llvm/IR/Module.h"
Tom Stellard347ac792015-06-26 21:15:07 +000024#include "llvm/MC/MCContext.h"
25#include "llvm/MC/MCELFStreamer.h"
Tom Stellardff7416b2015-06-26 21:58:31 +000026#include "llvm/MC/MCObjectFileInfo.h"
Tom Stellard347ac792015-06-26 21:15:07 +000027#include "llvm/MC/MCSectionELF.h"
28#include "llvm/Support/ELF.h"
29#include "llvm/Support/FormattedStream.h"
Yaxun Liu07d659b2016-12-14 17:16:52 +000030#include "AMDGPURuntimeMD.h"
Tom Stellard347ac792015-06-26 21:15:07 +000031
Yaxun Liud6fbe652016-11-10 21:18:49 +000032namespace llvm {
33#include "AMDGPUPTNote.h"
34}
35
Tom Stellard347ac792015-06-26 21:15:07 +000036using namespace llvm;
Yaxun Liud6fbe652016-11-10 21:18:49 +000037using namespace llvm::AMDGPU;
Tom Stellard347ac792015-06-26 21:15:07 +000038
39AMDGPUTargetStreamer::AMDGPUTargetStreamer(MCStreamer &S)
Yaxun Liud6fbe652016-11-10 21:18:49 +000040 : MCTargetStreamer(S) {}
Tom Stellard347ac792015-06-26 21:15:07 +000041
42//===----------------------------------------------------------------------===//
43// AMDGPUTargetAsmStreamer
44//===----------------------------------------------------------------------===//
45
46AMDGPUTargetAsmStreamer::AMDGPUTargetAsmStreamer(MCStreamer &S,
47 formatted_raw_ostream &OS)
48 : AMDGPUTargetStreamer(S), OS(OS) { }
49
50void
51AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
52 uint32_t Minor) {
53 OS << "\t.hsa_code_object_version " <<
54 Twine(Major) << "," << Twine(Minor) << '\n';
55}
56
57void
58AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
59 uint32_t Minor,
60 uint32_t Stepping,
61 StringRef VendorName,
62 StringRef ArchName) {
63 OS << "\t.hsa_code_object_isa " <<
64 Twine(Major) << "," << Twine(Minor) << "," << Twine(Stepping) <<
65 ",\"" << VendorName << "\",\"" << ArchName << "\"\n";
66
67}
68
Tom Stellardff7416b2015-06-26 21:58:31 +000069void
70AMDGPUTargetAsmStreamer::EmitAMDKernelCodeT(const amd_kernel_code_t &Header) {
Sam Koltona2e5c882016-09-09 10:08:02 +000071 OS << "\t.amd_kernel_code_t\n";
72 dumpAmdKernelCode(&Header, OS, "\t\t");
73 OS << "\t.end_amd_kernel_code_t\n";
Tom Stellardff7416b2015-06-26 21:58:31 +000074}
75
Tom Stellard1e1b05d2015-11-06 11:45:14 +000076void AMDGPUTargetAsmStreamer::EmitAMDGPUSymbolType(StringRef SymbolName,
77 unsigned Type) {
78 switch (Type) {
79 default: llvm_unreachable("Invalid AMDGPU symbol type");
80 case ELF::STT_AMDGPU_HSA_KERNEL:
81 OS << "\t.amdgpu_hsa_kernel " << SymbolName << '\n' ;
82 break;
83 }
84}
85
Tom Stellard00f2f912015-12-02 19:47:57 +000086void AMDGPUTargetAsmStreamer::EmitAMDGPUHsaModuleScopeGlobal(
87 StringRef GlobalName) {
88 OS << "\t.amdgpu_hsa_module_global " << GlobalName << '\n';
89}
90
91void AMDGPUTargetAsmStreamer::EmitAMDGPUHsaProgramScopeGlobal(
92 StringRef GlobalName) {
93 OS << "\t.amdgpu_hsa_program_global " << GlobalName << '\n';
94}
95
Konstantin Zhuravlyov9f89ede2017-02-08 14:05:23 +000096void AMDGPUTargetAsmStreamer::EmitRuntimeMetadata(const FeatureBitset &Features,
97 const Module &M) {
Sam Kolton69c8aa22016-12-19 11:43:15 +000098 OS << "\t.amdgpu_runtime_metadata\n";
Konstantin Zhuravlyov9f89ede2017-02-08 14:05:23 +000099 OS << getRuntimeMDYAMLString(Features, M);
Sam Kolton69c8aa22016-12-19 11:43:15 +0000100 OS << "\n\t.end_amdgpu_runtime_metadata\n";
101}
102
103void AMDGPUTargetAsmStreamer::EmitRuntimeMetadata(StringRef Metadata) {
104 OS << "\t.amdgpu_runtime_metadata";
105 OS << Metadata;
106 OS << "\t.end_amdgpu_runtime_metadata\n";
107}
108
Tom Stellard347ac792015-06-26 21:15:07 +0000109//===----------------------------------------------------------------------===//
110// AMDGPUTargetELFStreamer
111//===----------------------------------------------------------------------===//
112
113AMDGPUTargetELFStreamer::AMDGPUTargetELFStreamer(MCStreamer &S)
Yaxun Liud6fbe652016-11-10 21:18:49 +0000114 : AMDGPUTargetStreamer(S), Streamer(S) {}
Tom Stellard347ac792015-06-26 21:15:07 +0000115
116MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
117 return static_cast<MCELFStreamer &>(Streamer);
118}
119
Benjamin Kramer061f4a52017-01-13 14:39:03 +0000120void AMDGPUTargetELFStreamer::EmitAMDGPUNote(
121 const MCExpr *DescSZ, PT_NOTE::NoteType Type,
122 function_ref<void(MCELFStreamer &)> EmitDesc) {
Sam Kolton69c8aa22016-12-19 11:43:15 +0000123 auto &S = getStreamer();
124 auto &Context = S.getContext();
Tom Stellard347ac792015-06-26 21:15:07 +0000125
Yaxun Liud6fbe652016-11-10 21:18:49 +0000126 auto NameSZ = sizeof(PT_NOTE::NoteName);
Sam Kolton69c8aa22016-12-19 11:43:15 +0000127
128 S.PushSection();
129 S.SwitchSection(Context.getELFSection(
130 PT_NOTE::SectionName, ELF::SHT_NOTE, ELF::SHF_ALLOC));
131 S.EmitIntValue(NameSZ, 4); // namesz
132 S.EmitValue(DescSZ, 4); // descz
133 S.EmitIntValue(Type, 4); // type
134 S.EmitBytes(StringRef(PT_NOTE::NoteName, NameSZ)); // name
135 S.EmitValueToAlignment(4, 0, 1, 0); // padding 0
136 EmitDesc(S); // desc
137 S.EmitValueToAlignment(4, 0, 1, 0); // padding 0
138 S.PopSection();
139}
140
141void
142AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
143 uint32_t Minor) {
144
145 EmitAMDGPUNote(
146 MCConstantExpr::create(8, getContext()),
147 PT_NOTE::NT_AMDGPU_HSA_CODE_OBJECT_VERSION,
148 [&](MCELFStreamer &OS){
149 OS.EmitIntValue(Major, 4);
150 OS.EmitIntValue(Minor, 4);
151 }
152 );
Tom Stellard347ac792015-06-26 21:15:07 +0000153}
154
155void
156AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
157 uint32_t Minor,
158 uint32_t Stepping,
159 StringRef VendorName,
160 StringRef ArchName) {
Tom Stellard347ac792015-06-26 21:15:07 +0000161 uint16_t VendorNameSize = VendorName.size() + 1;
162 uint16_t ArchNameSize = ArchName.size() + 1;
Sam Kolton69c8aa22016-12-19 11:43:15 +0000163
Tom Stellard347ac792015-06-26 21:15:07 +0000164 unsigned DescSZ = sizeof(VendorNameSize) + sizeof(ArchNameSize) +
Sam Kolton69c8aa22016-12-19 11:43:15 +0000165 sizeof(Major) + sizeof(Minor) + sizeof(Stepping) +
166 VendorNameSize + ArchNameSize;
Tom Stellard347ac792015-06-26 21:15:07 +0000167
Sam Kolton69c8aa22016-12-19 11:43:15 +0000168 EmitAMDGPUNote(
169 MCConstantExpr::create(DescSZ, getContext()),
170 PT_NOTE::NT_AMDGPU_HSA_ISA,
171 [&](MCELFStreamer &OS) {
172 OS.EmitIntValue(VendorNameSize, 2);
173 OS.EmitIntValue(ArchNameSize, 2);
174 OS.EmitIntValue(Major, 4);
175 OS.EmitIntValue(Minor, 4);
176 OS.EmitIntValue(Stepping, 4);
177 OS.EmitBytes(VendorName);
178 OS.EmitIntValue(0, 1); // NULL terminate VendorName
179 OS.EmitBytes(ArchName);
180 OS.EmitIntValue(0, 1); // NULL terminte ArchName
181 }
182 );
Tom Stellard347ac792015-06-26 21:15:07 +0000183}
Tom Stellardff7416b2015-06-26 21:58:31 +0000184
185void
186AMDGPUTargetELFStreamer::EmitAMDKernelCodeT(const amd_kernel_code_t &Header) {
187
188 MCStreamer &OS = getStreamer();
189 OS.PushSection();
Tom Stellardff7416b2015-06-26 21:58:31 +0000190 OS.EmitBytes(StringRef((const char*)&Header, sizeof(Header)));
191 OS.PopSection();
192}
Tom Stellard1e1b05d2015-11-06 11:45:14 +0000193
194void AMDGPUTargetELFStreamer::EmitAMDGPUSymbolType(StringRef SymbolName,
195 unsigned Type) {
196 MCSymbolELF *Symbol = cast<MCSymbolELF>(
197 getStreamer().getContext().getOrCreateSymbol(SymbolName));
198 Symbol->setType(ELF::STT_AMDGPU_HSA_KERNEL);
199}
Tom Stellard00f2f912015-12-02 19:47:57 +0000200
201void AMDGPUTargetELFStreamer::EmitAMDGPUHsaModuleScopeGlobal(
202 StringRef GlobalName) {
203
204 MCSymbolELF *Symbol = cast<MCSymbolELF>(
205 getStreamer().getContext().getOrCreateSymbol(GlobalName));
206 Symbol->setType(ELF::STT_OBJECT);
207 Symbol->setBinding(ELF::STB_LOCAL);
208}
209
210void AMDGPUTargetELFStreamer::EmitAMDGPUHsaProgramScopeGlobal(
211 StringRef GlobalName) {
212
213 MCSymbolELF *Symbol = cast<MCSymbolELF>(
214 getStreamer().getContext().getOrCreateSymbol(GlobalName));
215 Symbol->setType(ELF::STT_OBJECT);
216 Symbol->setBinding(ELF::STB_GLOBAL);
217}
Yaxun Liud6fbe652016-11-10 21:18:49 +0000218
Sam Kolton69c8aa22016-12-19 11:43:15 +0000219void AMDGPUTargetELFStreamer::EmitRuntimeMetadata(StringRef Metadata) {
Yaxun Liud6fbe652016-11-10 21:18:49 +0000220 // Create two labels to mark the beginning and end of the desc field
221 // and a MCExpr to calculate the size of the desc field.
Sam Kolton69c8aa22016-12-19 11:43:15 +0000222 auto &Context = getContext();
Yaxun Liud6fbe652016-11-10 21:18:49 +0000223 auto *DescBegin = Context.createTempSymbol();
224 auto *DescEnd = Context.createTempSymbol();
225 auto *DescSZ = MCBinaryExpr::createSub(
Sam Kolton69c8aa22016-12-19 11:43:15 +0000226 MCSymbolRefExpr::create(DescEnd, Context),
227 MCSymbolRefExpr::create(DescBegin, Context), Context);
Yaxun Liud6fbe652016-11-10 21:18:49 +0000228
Sam Kolton69c8aa22016-12-19 11:43:15 +0000229 EmitAMDGPUNote(
230 DescSZ,
231 PT_NOTE::NT_AMDGPU_HSA_RUNTIME_METADATA,
232 [&](MCELFStreamer &OS) {
233 OS.EmitLabel(DescBegin);
234 OS.EmitBytes(Metadata);
235 OS.EmitLabel(DescEnd);
236 }
237 );
238}
239
Konstantin Zhuravlyov9f89ede2017-02-08 14:05:23 +0000240void AMDGPUTargetELFStreamer::EmitRuntimeMetadata(const FeatureBitset &Features,
241 const Module &M) {
242 EmitRuntimeMetadata(getRuntimeMDYAMLString(Features, M));
Yaxun Liud6fbe652016-11-10 21:18:49 +0000243}