blob: c8938648b0efb8402c78729cf3e96f0363afbc21 [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
14#include "AMDGPUTargetStreamer.h"
Tom Stellardff7416b2015-06-26 21:58:31 +000015#include "SIDefines.h"
Tom Stellarde135ffd2015-09-25 21:41:28 +000016#include "Utils/AMDGPUBaseInfo.h"
Sam Koltona2e5c882016-09-09 10:08:02 +000017#include "Utils/AMDKernelCodeTUtils.h"
Tom Stellard347ac792015-06-26 21:15:07 +000018#include "llvm/ADT/Twine.h"
19#include "llvm/MC/MCContext.h"
20#include "llvm/MC/MCELFStreamer.h"
Tom Stellardff7416b2015-06-26 21:58:31 +000021#include "llvm/MC/MCObjectFileInfo.h"
Tom Stellard347ac792015-06-26 21:15:07 +000022#include "llvm/MC/MCSectionELF.h"
23#include "llvm/Support/ELF.h"
24#include "llvm/Support/FormattedStream.h"
25
26using namespace llvm;
27
28AMDGPUTargetStreamer::AMDGPUTargetStreamer(MCStreamer &S)
29 : MCTargetStreamer(S) { }
30
31//===----------------------------------------------------------------------===//
32// AMDGPUTargetAsmStreamer
33//===----------------------------------------------------------------------===//
34
35AMDGPUTargetAsmStreamer::AMDGPUTargetAsmStreamer(MCStreamer &S,
36 formatted_raw_ostream &OS)
37 : AMDGPUTargetStreamer(S), OS(OS) { }
38
39void
40AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
41 uint32_t Minor) {
42 OS << "\t.hsa_code_object_version " <<
43 Twine(Major) << "," << Twine(Minor) << '\n';
44}
45
46void
47AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
48 uint32_t Minor,
49 uint32_t Stepping,
50 StringRef VendorName,
51 StringRef ArchName) {
52 OS << "\t.hsa_code_object_isa " <<
53 Twine(Major) << "," << Twine(Minor) << "," << Twine(Stepping) <<
54 ",\"" << VendorName << "\",\"" << ArchName << "\"\n";
55
56}
57
Tom Stellardff7416b2015-06-26 21:58:31 +000058void
59AMDGPUTargetAsmStreamer::EmitAMDKernelCodeT(const amd_kernel_code_t &Header) {
Sam Koltona2e5c882016-09-09 10:08:02 +000060 OS << "\t.amd_kernel_code_t\n";
61 dumpAmdKernelCode(&Header, OS, "\t\t");
62 OS << "\t.end_amd_kernel_code_t\n";
Tom Stellardff7416b2015-06-26 21:58:31 +000063}
64
Tom Stellard1e1b05d2015-11-06 11:45:14 +000065void AMDGPUTargetAsmStreamer::EmitAMDGPUSymbolType(StringRef SymbolName,
66 unsigned Type) {
67 switch (Type) {
68 default: llvm_unreachable("Invalid AMDGPU symbol type");
69 case ELF::STT_AMDGPU_HSA_KERNEL:
70 OS << "\t.amdgpu_hsa_kernel " << SymbolName << '\n' ;
71 break;
72 }
73}
74
Tom Stellard00f2f912015-12-02 19:47:57 +000075void AMDGPUTargetAsmStreamer::EmitAMDGPUHsaModuleScopeGlobal(
76 StringRef GlobalName) {
77 OS << "\t.amdgpu_hsa_module_global " << GlobalName << '\n';
78}
79
80void AMDGPUTargetAsmStreamer::EmitAMDGPUHsaProgramScopeGlobal(
81 StringRef GlobalName) {
82 OS << "\t.amdgpu_hsa_program_global " << GlobalName << '\n';
83}
84
Tom Stellard347ac792015-06-26 21:15:07 +000085//===----------------------------------------------------------------------===//
86// AMDGPUTargetELFStreamer
87//===----------------------------------------------------------------------===//
88
89AMDGPUTargetELFStreamer::AMDGPUTargetELFStreamer(MCStreamer &S)
90 : AMDGPUTargetStreamer(S), Streamer(S) { }
91
92MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
93 return static_cast<MCELFStreamer &>(Streamer);
94}
95
96void
97AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
98 uint32_t Minor) {
99 MCStreamer &OS = getStreamer();
Konstantin Zhuravlyov98a3ac72016-10-17 22:40:15 +0000100 MCSectionELF *Note =
101 OS.getContext().getELFSection(".note", ELF::SHT_NOTE, ELF::SHF_ALLOC);
Tom Stellard347ac792015-06-26 21:15:07 +0000102
103 unsigned NameSZ = 4;
104
105 OS.PushSection();
106 OS.SwitchSection(Note);
107 OS.EmitIntValue(NameSZ, 4); // namesz
108 OS.EmitIntValue(8, 4); // descz
109 OS.EmitIntValue(NT_AMDGPU_HSA_CODE_OBJECT_VERSION, 4); // type
110 OS.EmitBytes(StringRef("AMD", NameSZ)); // name
111 OS.EmitIntValue(Major, 4); // desc
112 OS.EmitIntValue(Minor, 4);
113 OS.EmitValueToAlignment(4);
114 OS.PopSection();
115}
116
117void
118AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
119 uint32_t Minor,
120 uint32_t Stepping,
121 StringRef VendorName,
122 StringRef ArchName) {
123 MCStreamer &OS = getStreamer();
Konstantin Zhuravlyov98a3ac72016-10-17 22:40:15 +0000124 MCSectionELF *Note =
125 OS.getContext().getELFSection(".note", ELF::SHT_NOTE, ELF::SHF_ALLOC);
Tom Stellard347ac792015-06-26 21:15:07 +0000126
127 unsigned NameSZ = 4;
128 uint16_t VendorNameSize = VendorName.size() + 1;
129 uint16_t ArchNameSize = ArchName.size() + 1;
130 unsigned DescSZ = sizeof(VendorNameSize) + sizeof(ArchNameSize) +
131 sizeof(Major) + sizeof(Minor) + sizeof(Stepping) +
132 VendorNameSize + ArchNameSize;
133
134 OS.PushSection();
135 OS.SwitchSection(Note);
136 OS.EmitIntValue(NameSZ, 4); // namesz
137 OS.EmitIntValue(DescSZ, 4); // descsz
138 OS.EmitIntValue(NT_AMDGPU_HSA_ISA, 4); // type
139 OS.EmitBytes(StringRef("AMD", 4)); // name
140 OS.EmitIntValue(VendorNameSize, 2); // desc
141 OS.EmitIntValue(ArchNameSize, 2);
142 OS.EmitIntValue(Major, 4);
143 OS.EmitIntValue(Minor, 4);
144 OS.EmitIntValue(Stepping, 4);
145 OS.EmitBytes(VendorName);
146 OS.EmitIntValue(0, 1); // NULL terminate VendorName
147 OS.EmitBytes(ArchName);
148 OS.EmitIntValue(0, 1); // NULL terminte ArchName
149 OS.EmitValueToAlignment(4);
150 OS.PopSection();
151}
Tom Stellardff7416b2015-06-26 21:58:31 +0000152
153void
154AMDGPUTargetELFStreamer::EmitAMDKernelCodeT(const amd_kernel_code_t &Header) {
155
156 MCStreamer &OS = getStreamer();
157 OS.PushSection();
Tom Stellardff7416b2015-06-26 21:58:31 +0000158 OS.EmitBytes(StringRef((const char*)&Header, sizeof(Header)));
159 OS.PopSection();
160}
Tom Stellard1e1b05d2015-11-06 11:45:14 +0000161
162void AMDGPUTargetELFStreamer::EmitAMDGPUSymbolType(StringRef SymbolName,
163 unsigned Type) {
164 MCSymbolELF *Symbol = cast<MCSymbolELF>(
165 getStreamer().getContext().getOrCreateSymbol(SymbolName));
166 Symbol->setType(ELF::STT_AMDGPU_HSA_KERNEL);
167}
Tom Stellard00f2f912015-12-02 19:47:57 +0000168
169void AMDGPUTargetELFStreamer::EmitAMDGPUHsaModuleScopeGlobal(
170 StringRef GlobalName) {
171
172 MCSymbolELF *Symbol = cast<MCSymbolELF>(
173 getStreamer().getContext().getOrCreateSymbol(GlobalName));
174 Symbol->setType(ELF::STT_OBJECT);
175 Symbol->setBinding(ELF::STB_LOCAL);
176}
177
178void AMDGPUTargetELFStreamer::EmitAMDGPUHsaProgramScopeGlobal(
179 StringRef GlobalName) {
180
181 MCSymbolELF *Symbol = cast<MCSymbolELF>(
182 getStreamer().getContext().getOrCreateSymbol(GlobalName));
183 Symbol->setType(ELF::STT_OBJECT);
184 Symbol->setBinding(ELF::STB_GLOBAL);
185}