1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPUTargetStreamer.cpp - Mips Target Streamer Methods -----------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file provides AMDGPU specific target streamer methods.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "AMDGPUTargetStreamer.h"
15*9880d681SAndroid Build Coastguard Worker #include "SIDefines.h"
16*9880d681SAndroid Build Coastguard Worker #include "Utils/AMDGPUBaseInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCELFStreamer.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCObjectFileInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionELF.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ELF.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FormattedStream.h"
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker using namespace llvm;
26*9880d681SAndroid Build Coastguard Worker
AMDGPUTargetStreamer(MCStreamer & S)27*9880d681SAndroid Build Coastguard Worker AMDGPUTargetStreamer::AMDGPUTargetStreamer(MCStreamer &S)
28*9880d681SAndroid Build Coastguard Worker : MCTargetStreamer(S) { }
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
31*9880d681SAndroid Build Coastguard Worker // AMDGPUTargetAsmStreamer
32*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
33*9880d681SAndroid Build Coastguard Worker
AMDGPUTargetAsmStreamer(MCStreamer & S,formatted_raw_ostream & OS)34*9880d681SAndroid Build Coastguard Worker AMDGPUTargetAsmStreamer::AMDGPUTargetAsmStreamer(MCStreamer &S,
35*9880d681SAndroid Build Coastguard Worker formatted_raw_ostream &OS)
36*9880d681SAndroid Build Coastguard Worker : AMDGPUTargetStreamer(S), OS(OS) { }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker void
EmitDirectiveHSACodeObjectVersion(uint32_t Major,uint32_t Minor)39*9880d681SAndroid Build Coastguard Worker AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
40*9880d681SAndroid Build Coastguard Worker uint32_t Minor) {
41*9880d681SAndroid Build Coastguard Worker OS << "\t.hsa_code_object_version " <<
42*9880d681SAndroid Build Coastguard Worker Twine(Major) << "," << Twine(Minor) << '\n';
43*9880d681SAndroid Build Coastguard Worker }
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker void
EmitDirectiveHSACodeObjectISA(uint32_t Major,uint32_t Minor,uint32_t Stepping,StringRef VendorName,StringRef ArchName)46*9880d681SAndroid Build Coastguard Worker AMDGPUTargetAsmStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
47*9880d681SAndroid Build Coastguard Worker uint32_t Minor,
48*9880d681SAndroid Build Coastguard Worker uint32_t Stepping,
49*9880d681SAndroid Build Coastguard Worker StringRef VendorName,
50*9880d681SAndroid Build Coastguard Worker StringRef ArchName) {
51*9880d681SAndroid Build Coastguard Worker OS << "\t.hsa_code_object_isa " <<
52*9880d681SAndroid Build Coastguard Worker Twine(Major) << "," << Twine(Minor) << "," << Twine(Stepping) <<
53*9880d681SAndroid Build Coastguard Worker ",\"" << VendorName << "\",\"" << ArchName << "\"\n";
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker }
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker void
EmitAMDKernelCodeT(const amd_kernel_code_t & Header)58*9880d681SAndroid Build Coastguard Worker AMDGPUTargetAsmStreamer::EmitAMDKernelCodeT(const amd_kernel_code_t &Header) {
59*9880d681SAndroid Build Coastguard Worker uint64_t ComputePgmRsrc2 = (Header.compute_pgm_resource_registers >> 32);
60*9880d681SAndroid Build Coastguard Worker bool EnableSGPRPrivateSegmentBuffer = (Header.code_properties &
61*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
62*9880d681SAndroid Build Coastguard Worker bool EnableSGPRDispatchPtr = (Header.code_properties &
63*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
64*9880d681SAndroid Build Coastguard Worker bool EnableSGPRQueuePtr = (Header.code_properties &
65*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
66*9880d681SAndroid Build Coastguard Worker bool EnableSGPRKernargSegmentPtr = (Header.code_properties &
67*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
68*9880d681SAndroid Build Coastguard Worker bool EnableSGPRDispatchID = (Header.code_properties &
69*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
70*9880d681SAndroid Build Coastguard Worker bool EnableSGPRFlatScratchInit = (Header.code_properties &
71*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
72*9880d681SAndroid Build Coastguard Worker bool EnableSGPRPrivateSegmentSize = (Header.code_properties &
73*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
74*9880d681SAndroid Build Coastguard Worker bool EnableSGPRGridWorkgroupCountX = (Header.code_properties &
75*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X);
76*9880d681SAndroid Build Coastguard Worker bool EnableSGPRGridWorkgroupCountY = (Header.code_properties &
77*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y);
78*9880d681SAndroid Build Coastguard Worker bool EnableSGPRGridWorkgroupCountZ = (Header.code_properties &
79*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z);
80*9880d681SAndroid Build Coastguard Worker bool EnableOrderedAppendGDS = (Header.code_properties &
81*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_ENABLE_ORDERED_APPEND_GDS);
82*9880d681SAndroid Build Coastguard Worker uint32_t PrivateElementSize = (Header.code_properties &
83*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_PRIVATE_ELEMENT_SIZE) >>
84*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_PRIVATE_ELEMENT_SIZE_SHIFT;
85*9880d681SAndroid Build Coastguard Worker bool IsPtr64 = (Header.code_properties & AMD_CODE_PROPERTY_IS_PTR64);
86*9880d681SAndroid Build Coastguard Worker bool IsDynamicCallstack = (Header.code_properties &
87*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_IS_DYNAMIC_CALLSTACK);
88*9880d681SAndroid Build Coastguard Worker bool IsDebugEnabled = (Header.code_properties &
89*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_IS_DEBUG_SUPPORTED);
90*9880d681SAndroid Build Coastguard Worker bool IsXNackEnabled = (Header.code_properties &
91*9880d681SAndroid Build Coastguard Worker AMD_CODE_PROPERTY_IS_XNACK_SUPPORTED);
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker OS << "\t.amd_kernel_code_t\n" <<
94*9880d681SAndroid Build Coastguard Worker "\t\tkernel_code_version_major = " <<
95*9880d681SAndroid Build Coastguard Worker Header.amd_kernel_code_version_major << '\n' <<
96*9880d681SAndroid Build Coastguard Worker "\t\tkernel_code_version_minor = " <<
97*9880d681SAndroid Build Coastguard Worker Header.amd_kernel_code_version_minor << '\n' <<
98*9880d681SAndroid Build Coastguard Worker "\t\tmachine_kind = " <<
99*9880d681SAndroid Build Coastguard Worker Header.amd_machine_kind << '\n' <<
100*9880d681SAndroid Build Coastguard Worker "\t\tmachine_version_major = " <<
101*9880d681SAndroid Build Coastguard Worker Header.amd_machine_version_major << '\n' <<
102*9880d681SAndroid Build Coastguard Worker "\t\tmachine_version_minor = " <<
103*9880d681SAndroid Build Coastguard Worker Header.amd_machine_version_minor << '\n' <<
104*9880d681SAndroid Build Coastguard Worker "\t\tmachine_version_stepping = " <<
105*9880d681SAndroid Build Coastguard Worker Header.amd_machine_version_stepping << '\n' <<
106*9880d681SAndroid Build Coastguard Worker "\t\tkernel_code_entry_byte_offset = " <<
107*9880d681SAndroid Build Coastguard Worker Header.kernel_code_entry_byte_offset << '\n' <<
108*9880d681SAndroid Build Coastguard Worker "\t\tkernel_code_prefetch_byte_size = " <<
109*9880d681SAndroid Build Coastguard Worker Header.kernel_code_prefetch_byte_size << '\n' <<
110*9880d681SAndroid Build Coastguard Worker "\t\tmax_scratch_backing_memory_byte_size = " <<
111*9880d681SAndroid Build Coastguard Worker Header.max_scratch_backing_memory_byte_size << '\n' <<
112*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_vgprs = " <<
113*9880d681SAndroid Build Coastguard Worker G_00B848_VGPRS(Header.compute_pgm_resource_registers) << '\n' <<
114*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_sgprs = " <<
115*9880d681SAndroid Build Coastguard Worker G_00B848_SGPRS(Header.compute_pgm_resource_registers) << '\n' <<
116*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_priority = " <<
117*9880d681SAndroid Build Coastguard Worker G_00B848_PRIORITY(Header.compute_pgm_resource_registers) << '\n' <<
118*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_float_mode = " <<
119*9880d681SAndroid Build Coastguard Worker G_00B848_FLOAT_MODE(Header.compute_pgm_resource_registers) << '\n' <<
120*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_priv = " <<
121*9880d681SAndroid Build Coastguard Worker G_00B848_PRIV(Header.compute_pgm_resource_registers) << '\n' <<
122*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_dx10_clamp = " <<
123*9880d681SAndroid Build Coastguard Worker G_00B848_DX10_CLAMP(Header.compute_pgm_resource_registers) << '\n' <<
124*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_debug_mode = " <<
125*9880d681SAndroid Build Coastguard Worker G_00B848_DEBUG_MODE(Header.compute_pgm_resource_registers) << '\n' <<
126*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc1_ieee_mode = " <<
127*9880d681SAndroid Build Coastguard Worker G_00B848_IEEE_MODE(Header.compute_pgm_resource_registers) << '\n' <<
128*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_scratch_en = " <<
129*9880d681SAndroid Build Coastguard Worker G_00B84C_SCRATCH_EN(ComputePgmRsrc2) << '\n' <<
130*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_user_sgpr = " <<
131*9880d681SAndroid Build Coastguard Worker G_00B84C_USER_SGPR(ComputePgmRsrc2) << '\n' <<
132*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_tgid_x_en = " <<
133*9880d681SAndroid Build Coastguard Worker G_00B84C_TGID_X_EN(ComputePgmRsrc2) << '\n' <<
134*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_tgid_y_en = " <<
135*9880d681SAndroid Build Coastguard Worker G_00B84C_TGID_Y_EN(ComputePgmRsrc2) << '\n' <<
136*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_tgid_z_en = " <<
137*9880d681SAndroid Build Coastguard Worker G_00B84C_TGID_Z_EN(ComputePgmRsrc2) << '\n' <<
138*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_tg_size_en = " <<
139*9880d681SAndroid Build Coastguard Worker G_00B84C_TG_SIZE_EN(ComputePgmRsrc2) << '\n' <<
140*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_tidig_comp_cnt = " <<
141*9880d681SAndroid Build Coastguard Worker G_00B84C_TIDIG_COMP_CNT(ComputePgmRsrc2) << '\n' <<
142*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_excp_en_msb = " <<
143*9880d681SAndroid Build Coastguard Worker G_00B84C_EXCP_EN_MSB(ComputePgmRsrc2) << '\n' <<
144*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_lds_size = " <<
145*9880d681SAndroid Build Coastguard Worker G_00B84C_LDS_SIZE(ComputePgmRsrc2) << '\n' <<
146*9880d681SAndroid Build Coastguard Worker "\t\tcompute_pgm_rsrc2_excp_en = " <<
147*9880d681SAndroid Build Coastguard Worker G_00B84C_EXCP_EN(ComputePgmRsrc2) << '\n' <<
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_private_segment_buffer = " <<
150*9880d681SAndroid Build Coastguard Worker EnableSGPRPrivateSegmentBuffer << '\n' <<
151*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_dispatch_ptr = " <<
152*9880d681SAndroid Build Coastguard Worker EnableSGPRDispatchPtr << '\n' <<
153*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_queue_ptr = " <<
154*9880d681SAndroid Build Coastguard Worker EnableSGPRQueuePtr << '\n' <<
155*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_kernarg_segment_ptr = " <<
156*9880d681SAndroid Build Coastguard Worker EnableSGPRKernargSegmentPtr << '\n' <<
157*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_dispatch_id = " <<
158*9880d681SAndroid Build Coastguard Worker EnableSGPRDispatchID << '\n' <<
159*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_flat_scratch_init = " <<
160*9880d681SAndroid Build Coastguard Worker EnableSGPRFlatScratchInit << '\n' <<
161*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_private_segment_size = " <<
162*9880d681SAndroid Build Coastguard Worker EnableSGPRPrivateSegmentSize << '\n' <<
163*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_grid_workgroup_count_x = " <<
164*9880d681SAndroid Build Coastguard Worker EnableSGPRGridWorkgroupCountX << '\n' <<
165*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_grid_workgroup_count_y = " <<
166*9880d681SAndroid Build Coastguard Worker EnableSGPRGridWorkgroupCountY << '\n' <<
167*9880d681SAndroid Build Coastguard Worker "\t\tenable_sgpr_grid_workgroup_count_z = " <<
168*9880d681SAndroid Build Coastguard Worker EnableSGPRGridWorkgroupCountZ << '\n' <<
169*9880d681SAndroid Build Coastguard Worker "\t\tenable_ordered_append_gds = " <<
170*9880d681SAndroid Build Coastguard Worker EnableOrderedAppendGDS << '\n' <<
171*9880d681SAndroid Build Coastguard Worker "\t\tprivate_element_size = " <<
172*9880d681SAndroid Build Coastguard Worker PrivateElementSize << '\n' <<
173*9880d681SAndroid Build Coastguard Worker "\t\tis_ptr64 = " <<
174*9880d681SAndroid Build Coastguard Worker IsPtr64 << '\n' <<
175*9880d681SAndroid Build Coastguard Worker "\t\tis_dynamic_callstack = " <<
176*9880d681SAndroid Build Coastguard Worker IsDynamicCallstack << '\n' <<
177*9880d681SAndroid Build Coastguard Worker "\t\tis_debug_enabled = " <<
178*9880d681SAndroid Build Coastguard Worker IsDebugEnabled << '\n' <<
179*9880d681SAndroid Build Coastguard Worker "\t\tis_xnack_enabled = " <<
180*9880d681SAndroid Build Coastguard Worker IsXNackEnabled << '\n' <<
181*9880d681SAndroid Build Coastguard Worker "\t\tworkitem_private_segment_byte_size = " <<
182*9880d681SAndroid Build Coastguard Worker Header.workitem_private_segment_byte_size << '\n' <<
183*9880d681SAndroid Build Coastguard Worker "\t\tworkgroup_group_segment_byte_size = " <<
184*9880d681SAndroid Build Coastguard Worker Header.workgroup_group_segment_byte_size << '\n' <<
185*9880d681SAndroid Build Coastguard Worker "\t\tgds_segment_byte_size = " <<
186*9880d681SAndroid Build Coastguard Worker Header.gds_segment_byte_size << '\n' <<
187*9880d681SAndroid Build Coastguard Worker "\t\tkernarg_segment_byte_size = " <<
188*9880d681SAndroid Build Coastguard Worker Header.kernarg_segment_byte_size << '\n' <<
189*9880d681SAndroid Build Coastguard Worker "\t\tworkgroup_fbarrier_count = " <<
190*9880d681SAndroid Build Coastguard Worker Header.workgroup_fbarrier_count << '\n' <<
191*9880d681SAndroid Build Coastguard Worker "\t\twavefront_sgpr_count = " <<
192*9880d681SAndroid Build Coastguard Worker Header.wavefront_sgpr_count << '\n' <<
193*9880d681SAndroid Build Coastguard Worker "\t\tworkitem_vgpr_count = " <<
194*9880d681SAndroid Build Coastguard Worker Header.workitem_vgpr_count << '\n' <<
195*9880d681SAndroid Build Coastguard Worker "\t\treserved_vgpr_first = " <<
196*9880d681SAndroid Build Coastguard Worker Header.reserved_vgpr_first << '\n' <<
197*9880d681SAndroid Build Coastguard Worker "\t\treserved_vgpr_count = " <<
198*9880d681SAndroid Build Coastguard Worker Header.reserved_vgpr_count << '\n' <<
199*9880d681SAndroid Build Coastguard Worker "\t\treserved_sgpr_first = " <<
200*9880d681SAndroid Build Coastguard Worker Header.reserved_sgpr_first << '\n' <<
201*9880d681SAndroid Build Coastguard Worker "\t\treserved_sgpr_count = " <<
202*9880d681SAndroid Build Coastguard Worker Header.reserved_sgpr_count << '\n' <<
203*9880d681SAndroid Build Coastguard Worker "\t\tdebug_wavefront_private_segment_offset_sgpr = " <<
204*9880d681SAndroid Build Coastguard Worker Header.debug_wavefront_private_segment_offset_sgpr << '\n' <<
205*9880d681SAndroid Build Coastguard Worker "\t\tdebug_private_segment_buffer_sgpr = " <<
206*9880d681SAndroid Build Coastguard Worker Header.debug_private_segment_buffer_sgpr << '\n' <<
207*9880d681SAndroid Build Coastguard Worker "\t\tkernarg_segment_alignment = " <<
208*9880d681SAndroid Build Coastguard Worker (uint32_t)Header.kernarg_segment_alignment << '\n' <<
209*9880d681SAndroid Build Coastguard Worker "\t\tgroup_segment_alignment = " <<
210*9880d681SAndroid Build Coastguard Worker (uint32_t)Header.group_segment_alignment << '\n' <<
211*9880d681SAndroid Build Coastguard Worker "\t\tprivate_segment_alignment = " <<
212*9880d681SAndroid Build Coastguard Worker (uint32_t)Header.private_segment_alignment << '\n' <<
213*9880d681SAndroid Build Coastguard Worker "\t\twavefront_size = " <<
214*9880d681SAndroid Build Coastguard Worker (uint32_t)Header.wavefront_size << '\n' <<
215*9880d681SAndroid Build Coastguard Worker "\t\tcall_convention = " <<
216*9880d681SAndroid Build Coastguard Worker Header.call_convention << '\n' <<
217*9880d681SAndroid Build Coastguard Worker "\t\truntime_loader_kernel_symbol = " <<
218*9880d681SAndroid Build Coastguard Worker Header.runtime_loader_kernel_symbol << '\n' <<
219*9880d681SAndroid Build Coastguard Worker // TODO: control_directives
220*9880d681SAndroid Build Coastguard Worker "\t.end_amd_kernel_code_t\n";
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker }
223*9880d681SAndroid Build Coastguard Worker
EmitAMDGPUSymbolType(StringRef SymbolName,unsigned Type)224*9880d681SAndroid Build Coastguard Worker void AMDGPUTargetAsmStreamer::EmitAMDGPUSymbolType(StringRef SymbolName,
225*9880d681SAndroid Build Coastguard Worker unsigned Type) {
226*9880d681SAndroid Build Coastguard Worker switch (Type) {
227*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Invalid AMDGPU symbol type");
228*9880d681SAndroid Build Coastguard Worker case ELF::STT_AMDGPU_HSA_KERNEL:
229*9880d681SAndroid Build Coastguard Worker OS << "\t.amdgpu_hsa_kernel " << SymbolName << '\n' ;
230*9880d681SAndroid Build Coastguard Worker break;
231*9880d681SAndroid Build Coastguard Worker }
232*9880d681SAndroid Build Coastguard Worker }
233*9880d681SAndroid Build Coastguard Worker
EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName)234*9880d681SAndroid Build Coastguard Worker void AMDGPUTargetAsmStreamer::EmitAMDGPUHsaModuleScopeGlobal(
235*9880d681SAndroid Build Coastguard Worker StringRef GlobalName) {
236*9880d681SAndroid Build Coastguard Worker OS << "\t.amdgpu_hsa_module_global " << GlobalName << '\n';
237*9880d681SAndroid Build Coastguard Worker }
238*9880d681SAndroid Build Coastguard Worker
EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName)239*9880d681SAndroid Build Coastguard Worker void AMDGPUTargetAsmStreamer::EmitAMDGPUHsaProgramScopeGlobal(
240*9880d681SAndroid Build Coastguard Worker StringRef GlobalName) {
241*9880d681SAndroid Build Coastguard Worker OS << "\t.amdgpu_hsa_program_global " << GlobalName << '\n';
242*9880d681SAndroid Build Coastguard Worker }
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
245*9880d681SAndroid Build Coastguard Worker // AMDGPUTargetELFStreamer
246*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
247*9880d681SAndroid Build Coastguard Worker
AMDGPUTargetELFStreamer(MCStreamer & S)248*9880d681SAndroid Build Coastguard Worker AMDGPUTargetELFStreamer::AMDGPUTargetELFStreamer(MCStreamer &S)
249*9880d681SAndroid Build Coastguard Worker : AMDGPUTargetStreamer(S), Streamer(S) { }
250*9880d681SAndroid Build Coastguard Worker
getStreamer()251*9880d681SAndroid Build Coastguard Worker MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
252*9880d681SAndroid Build Coastguard Worker return static_cast<MCELFStreamer &>(Streamer);
253*9880d681SAndroid Build Coastguard Worker }
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker void
EmitDirectiveHSACodeObjectVersion(uint32_t Major,uint32_t Minor)256*9880d681SAndroid Build Coastguard Worker AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectVersion(uint32_t Major,
257*9880d681SAndroid Build Coastguard Worker uint32_t Minor) {
258*9880d681SAndroid Build Coastguard Worker MCStreamer &OS = getStreamer();
259*9880d681SAndroid Build Coastguard Worker MCSectionELF *Note = OS.getContext().getELFSection(".note", ELF::SHT_NOTE, 0);
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker unsigned NameSZ = 4;
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker OS.PushSection();
264*9880d681SAndroid Build Coastguard Worker OS.SwitchSection(Note);
265*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(NameSZ, 4); // namesz
266*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(8, 4); // descz
267*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(NT_AMDGPU_HSA_CODE_OBJECT_VERSION, 4); // type
268*9880d681SAndroid Build Coastguard Worker OS.EmitBytes(StringRef("AMD", NameSZ)); // name
269*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(Major, 4); // desc
270*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(Minor, 4);
271*9880d681SAndroid Build Coastguard Worker OS.EmitValueToAlignment(4);
272*9880d681SAndroid Build Coastguard Worker OS.PopSection();
273*9880d681SAndroid Build Coastguard Worker }
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker void
EmitDirectiveHSACodeObjectISA(uint32_t Major,uint32_t Minor,uint32_t Stepping,StringRef VendorName,StringRef ArchName)276*9880d681SAndroid Build Coastguard Worker AMDGPUTargetELFStreamer::EmitDirectiveHSACodeObjectISA(uint32_t Major,
277*9880d681SAndroid Build Coastguard Worker uint32_t Minor,
278*9880d681SAndroid Build Coastguard Worker uint32_t Stepping,
279*9880d681SAndroid Build Coastguard Worker StringRef VendorName,
280*9880d681SAndroid Build Coastguard Worker StringRef ArchName) {
281*9880d681SAndroid Build Coastguard Worker MCStreamer &OS = getStreamer();
282*9880d681SAndroid Build Coastguard Worker MCSectionELF *Note = OS.getContext().getELFSection(".note", ELF::SHT_NOTE, 0);
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker unsigned NameSZ = 4;
285*9880d681SAndroid Build Coastguard Worker uint16_t VendorNameSize = VendorName.size() + 1;
286*9880d681SAndroid Build Coastguard Worker uint16_t ArchNameSize = ArchName.size() + 1;
287*9880d681SAndroid Build Coastguard Worker unsigned DescSZ = sizeof(VendorNameSize) + sizeof(ArchNameSize) +
288*9880d681SAndroid Build Coastguard Worker sizeof(Major) + sizeof(Minor) + sizeof(Stepping) +
289*9880d681SAndroid Build Coastguard Worker VendorNameSize + ArchNameSize;
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker OS.PushSection();
292*9880d681SAndroid Build Coastguard Worker OS.SwitchSection(Note);
293*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(NameSZ, 4); // namesz
294*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(DescSZ, 4); // descsz
295*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(NT_AMDGPU_HSA_ISA, 4); // type
296*9880d681SAndroid Build Coastguard Worker OS.EmitBytes(StringRef("AMD", 4)); // name
297*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(VendorNameSize, 2); // desc
298*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(ArchNameSize, 2);
299*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(Major, 4);
300*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(Minor, 4);
301*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(Stepping, 4);
302*9880d681SAndroid Build Coastguard Worker OS.EmitBytes(VendorName);
303*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(0, 1); // NULL terminate VendorName
304*9880d681SAndroid Build Coastguard Worker OS.EmitBytes(ArchName);
305*9880d681SAndroid Build Coastguard Worker OS.EmitIntValue(0, 1); // NULL terminte ArchName
306*9880d681SAndroid Build Coastguard Worker OS.EmitValueToAlignment(4);
307*9880d681SAndroid Build Coastguard Worker OS.PopSection();
308*9880d681SAndroid Build Coastguard Worker }
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker void
EmitAMDKernelCodeT(const amd_kernel_code_t & Header)311*9880d681SAndroid Build Coastguard Worker AMDGPUTargetELFStreamer::EmitAMDKernelCodeT(const amd_kernel_code_t &Header) {
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker MCStreamer &OS = getStreamer();
314*9880d681SAndroid Build Coastguard Worker OS.PushSection();
315*9880d681SAndroid Build Coastguard Worker OS.EmitBytes(StringRef((const char*)&Header, sizeof(Header)));
316*9880d681SAndroid Build Coastguard Worker OS.PopSection();
317*9880d681SAndroid Build Coastguard Worker }
318*9880d681SAndroid Build Coastguard Worker
EmitAMDGPUSymbolType(StringRef SymbolName,unsigned Type)319*9880d681SAndroid Build Coastguard Worker void AMDGPUTargetELFStreamer::EmitAMDGPUSymbolType(StringRef SymbolName,
320*9880d681SAndroid Build Coastguard Worker unsigned Type) {
321*9880d681SAndroid Build Coastguard Worker MCSymbolELF *Symbol = cast<MCSymbolELF>(
322*9880d681SAndroid Build Coastguard Worker getStreamer().getContext().getOrCreateSymbol(SymbolName));
323*9880d681SAndroid Build Coastguard Worker Symbol->setType(ELF::STT_AMDGPU_HSA_KERNEL);
324*9880d681SAndroid Build Coastguard Worker }
325*9880d681SAndroid Build Coastguard Worker
EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName)326*9880d681SAndroid Build Coastguard Worker void AMDGPUTargetELFStreamer::EmitAMDGPUHsaModuleScopeGlobal(
327*9880d681SAndroid Build Coastguard Worker StringRef GlobalName) {
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker MCSymbolELF *Symbol = cast<MCSymbolELF>(
330*9880d681SAndroid Build Coastguard Worker getStreamer().getContext().getOrCreateSymbol(GlobalName));
331*9880d681SAndroid Build Coastguard Worker Symbol->setType(ELF::STT_OBJECT);
332*9880d681SAndroid Build Coastguard Worker Symbol->setBinding(ELF::STB_LOCAL);
333*9880d681SAndroid Build Coastguard Worker }
334*9880d681SAndroid Build Coastguard Worker
EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName)335*9880d681SAndroid Build Coastguard Worker void AMDGPUTargetELFStreamer::EmitAMDGPUHsaProgramScopeGlobal(
336*9880d681SAndroid Build Coastguard Worker StringRef GlobalName) {
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Worker MCSymbolELF *Symbol = cast<MCSymbolELF>(
339*9880d681SAndroid Build Coastguard Worker getStreamer().getContext().getOrCreateSymbol(GlobalName));
340*9880d681SAndroid Build Coastguard Worker Symbol->setType(ELF::STT_OBJECT);
341*9880d681SAndroid Build Coastguard Worker Symbol->setBinding(ELF::STB_GLOBAL);
342*9880d681SAndroid Build Coastguard Worker }
343