43 cl::desc(
"Force a specific generic_v<N> flag to be "
44 "added. For testing purposes only."),
49 if (!HSAMetadataDoc.
fromYAML(HSAMetadataString))
59 case ELF::EF_AMDGPU_MACH_R600_R600: AK = GK_R600;
break;
60 case ELF::EF_AMDGPU_MACH_R600_R630: AK = GK_R630;
break;
61 case ELF::EF_AMDGPU_MACH_R600_RS880: AK = GK_RS880;
break;
62 case ELF::EF_AMDGPU_MACH_R600_RV670: AK = GK_RV670;
break;
63 case ELF::EF_AMDGPU_MACH_R600_RV710: AK = GK_RV710;
break;
64 case ELF::EF_AMDGPU_MACH_R600_RV730: AK = GK_RV730;
break;
65 case ELF::EF_AMDGPU_MACH_R600_RV770: AK = GK_RV770;
break;
66 case ELF::EF_AMDGPU_MACH_R600_CEDAR: AK = GK_CEDAR;
break;
67 case ELF::EF_AMDGPU_MACH_R600_CYPRESS: AK = GK_CYPRESS;
break;
68 case ELF::EF_AMDGPU_MACH_R600_JUNIPER: AK = GK_JUNIPER;
break;
69 case ELF::EF_AMDGPU_MACH_R600_REDWOOD: AK = GK_REDWOOD;
break;
70 case ELF::EF_AMDGPU_MACH_R600_SUMO: AK = GK_SUMO;
break;
71 case ELF::EF_AMDGPU_MACH_R600_BARTS: AK = GK_BARTS;
break;
72 case ELF::EF_AMDGPU_MACH_R600_CAICOS: AK = GK_CAICOS;
break;
73 case ELF::EF_AMDGPU_MACH_R600_CAYMAN: AK = GK_CAYMAN;
break;
74 case ELF::EF_AMDGPU_MACH_R600_TURKS: AK = GK_TURKS;
break;
75 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX600: AK = GK_GFX600;
break;
76 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX601: AK = GK_GFX601;
break;
77 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX602: AK = GK_GFX602;
break;
78 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX700: AK = GK_GFX700;
break;
79 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX701: AK = GK_GFX701;
break;
80 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX702: AK = GK_GFX702;
break;
81 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX703: AK = GK_GFX703;
break;
82 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX704: AK = GK_GFX704;
break;
83 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX705: AK = GK_GFX705;
break;
84 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX801: AK = GK_GFX801;
break;
85 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX802: AK = GK_GFX802;
break;
86 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX803: AK = GK_GFX803;
break;
87 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX805: AK = GK_GFX805;
break;
88 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX810: AK = GK_GFX810;
break;
89 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX900: AK = GK_GFX900;
break;
90 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX902: AK = GK_GFX902;
break;
91 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX904: AK = GK_GFX904;
break;
92 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX906: AK = GK_GFX906;
break;
93 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX908: AK = GK_GFX908;
break;
94 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX909: AK = GK_GFX909;
break;
95 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A: AK = GK_GFX90A;
break;
96 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C: AK = GK_GFX90C;
break;
97 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX942: AK = GK_GFX942;
break;
98 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX950: AK = GK_GFX950;
break;
99 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010: AK = GK_GFX1010;
break;
100 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011: AK = GK_GFX1011;
break;
101 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012: AK = GK_GFX1012;
break;
102 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013: AK = GK_GFX1013;
break;
103 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030: AK = GK_GFX1030;
break;
104 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031: AK = GK_GFX1031;
break;
105 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032: AK = GK_GFX1032;
break;
106 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033: AK = GK_GFX1033;
break;
107 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034: AK = GK_GFX1034;
break;
108 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035: AK = GK_GFX1035;
break;
109 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036: AK = GK_GFX1036;
break;
110 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100: AK = GK_GFX1100;
break;
111 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101: AK = GK_GFX1101;
break;
112 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102: AK = GK_GFX1102;
break;
113 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103: AK = GK_GFX1103;
break;
114 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150: AK = GK_GFX1150;
break;
115 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151: AK = GK_GFX1151;
break;
116 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152: AK = GK_GFX1152;
break;
117 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153: AK = GK_GFX1153;
break;
118 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170: AK = GK_GFX1170;
break;
119 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171: AK = GK_GFX1171;
break;
120 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172: AK = GK_GFX1172;
break;
121 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200: AK = GK_GFX1200;
break;
122 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201: AK = GK_GFX1201;
break;
123 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250: AK = GK_GFX1250;
break;
124 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251: AK = GK_GFX1251;
break;
125 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310: AK = GK_GFX1310;
break;
126 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC: AK = GK_GFX9_GENERIC;
break;
127 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC: AK = GK_GFX9_4_GENERIC;
break;
128 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC: AK = GK_GFX10_1_GENERIC;
break;
129 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC: AK = GK_GFX10_3_GENERIC;
break;
130 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC: AK = GK_GFX11_GENERIC;
break;
131 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC: AK = GK_GFX12_GENERIC;
break;
132 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC: AK = GK_GFX12_5_GENERIC;
break;
151 case GK_R600:
return ELF::EF_AMDGPU_MACH_R600_R600;
152 case GK_R630:
return ELF::EF_AMDGPU_MACH_R600_R630;
153 case GK_RS880:
return ELF::EF_AMDGPU_MACH_R600_RS880;
154 case GK_RV670:
return ELF::EF_AMDGPU_MACH_R600_RV670;
155 case GK_RV710:
return ELF::EF_AMDGPU_MACH_R600_RV710;
156 case GK_RV730:
return ELF::EF_AMDGPU_MACH_R600_RV730;
157 case GK_RV770:
return ELF::EF_AMDGPU_MACH_R600_RV770;
158 case GK_CEDAR:
return ELF::EF_AMDGPU_MACH_R600_CEDAR;
159 case GK_CYPRESS:
return ELF::EF_AMDGPU_MACH_R600_CYPRESS;
160 case GK_JUNIPER:
return ELF::EF_AMDGPU_MACH_R600_JUNIPER;
161 case GK_REDWOOD:
return ELF::EF_AMDGPU_MACH_R600_REDWOOD;
162 case GK_SUMO:
return ELF::EF_AMDGPU_MACH_R600_SUMO;
163 case GK_BARTS:
return ELF::EF_AMDGPU_MACH_R600_BARTS;
164 case GK_CAICOS:
return ELF::EF_AMDGPU_MACH_R600_CAICOS;
165 case GK_CAYMAN:
return ELF::EF_AMDGPU_MACH_R600_CAYMAN;
166 case GK_TURKS:
return ELF::EF_AMDGPU_MACH_R600_TURKS;
167 case GK_GFX600:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX600;
168 case GK_GFX601:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX601;
169 case GK_GFX602:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX602;
170 case GK_GFX700:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX700;
171 case GK_GFX701:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX701;
172 case GK_GFX702:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX702;
173 case GK_GFX703:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX703;
174 case GK_GFX704:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX704;
175 case GK_GFX705:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX705;
176 case GK_GFX801:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX801;
177 case GK_GFX802:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX802;
178 case GK_GFX803:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX803;
179 case GK_GFX805:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX805;
180 case GK_GFX810:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX810;
181 case GK_GFX900:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX900;
182 case GK_GFX902:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX902;
183 case GK_GFX904:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX904;
184 case GK_GFX906:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX906;
185 case GK_GFX908:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX908;
186 case GK_GFX909:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX909;
187 case GK_GFX90A:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A;
188 case GK_GFX90C:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C;
189 case GK_GFX942:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX942;
190 case GK_GFX950:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX950;
191 case GK_GFX1010:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010;
192 case GK_GFX1011:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011;
193 case GK_GFX1012:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012;
194 case GK_GFX1013:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013;
195 case GK_GFX1030:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030;
196 case GK_GFX1031:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031;
197 case GK_GFX1032:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032;
198 case GK_GFX1033:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033;
199 case GK_GFX1034:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034;
200 case GK_GFX1035:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035;
201 case GK_GFX1036:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036;
202 case GK_GFX1100:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100;
203 case GK_GFX1101:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101;
204 case GK_GFX1102:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102;
205 case GK_GFX1103:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103;
206 case GK_GFX1150:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150;
207 case GK_GFX1151:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151;
208 case GK_GFX1152:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152;
209 case GK_GFX1153:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153;
210 case GK_GFX1170:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170;
211 case GK_GFX1171:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171;
212 case GK_GFX1172:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172;
213 case GK_GFX1200:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200;
214 case GK_GFX1201:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201;
215 case GK_GFX1250:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250;
216 case GK_GFX1251:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251;
217 case GK_GFX1310:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310;
218 case GK_GFX9_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC;
219 case GK_GFX9_4_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC;
220 case GK_GFX10_1_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC;
221 case GK_GFX10_3_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC;
222 case GK_GFX11_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC;
223 case GK_GFX12_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC;
224 case GK_GFX12_5_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC;
254 OS <<
"\t.amdgcn_target \"" << *
getTargetID() <<
"\"\n";
260 OS <<
"\t.amdhsa_code_object_version " << COV <<
'\n';
269 OS <<
"\t.amd_kernel_code_t\n";
270 Header.EmitKernelCodeT(OS,
getContext(), FoldAndPrint);
271 OS <<
"\t.end_amd_kernel_code_t\n";
279 OS <<
"\t.amdgpu_hsa_kernel " << SymbolName <<
'\n' ;
286 OS <<
"\t.amdgpu_lds " << Symbol->getName() <<
", " <<
Size <<
", "
287 << Alignment.
value() <<
'\n';
296#define PRINT_RES_INFO(ARG) \
298 ARG->print(OS, getContext().getAsmInfo()); \
300 getContext().getAsmInfo()->printExpr(OS, *ARG->getVariableValue()); \
301 Streamer.addBlankLine();
319#define PRINT_RES_INFO(ARG) \
321 ARG->print(OS, getContext().getAsmInfo()); \
323 getContext().getAsmInfo()->printExpr(OS, *ARG->getVariableValue()); \
324 Streamer.addBlankLine();
334 OS <<
"\t.amd_amdgpu_isa \"" <<
getTargetID() <<
"\"\n";
341 if (!Verifier.verify(HSAMetadataDoc.
getRoot()))
344 std::string HSAMetadataString;
346 HSAMetadataDoc.
toYAML(StrOS);
349 OS << StrOS.
str() <<
'\n';
355 const uint32_t Encoded_s_code_end = 0xbf9f0000;
356 const uint32_t Encoded_s_nop = 0xbf800000;
357 uint32_t Encoded_pad = Encoded_s_code_end;
367 Encoded_pad = Encoded_s_nop;
371 OS <<
"\t.p2alignl " << Log2CacheLineSize <<
", " << Encoded_pad <<
'\n';
372 OS <<
"\t.fill " << (FillSize / 4) <<
", 4, " << Encoded_pad <<
'\n';
380 const MCExpr *ReserveFlatScr) {
384 OS <<
"\t.amdhsa_kernel " << KernelName <<
'\n';
389 const MCExpr *ShiftedAndMaskedExpr =
401 OS <<
"\t\t.amdhsa_group_segment_fixed_size ";
405 OS <<
"\t\t.amdhsa_private_segment_fixed_size ";
409 OS <<
"\t\t.amdhsa_kernarg_size ";
415 amdhsa::COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT_SHIFT,
416 amdhsa::COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT,
417 ".amdhsa_user_sgpr_count");
420 amdhsa::COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT_SHIFT,
421 amdhsa::COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT,
422 ".amdhsa_user_sgpr_count");
428 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT,
429 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER,
430 ".amdhsa_user_sgpr_private_segment_buffer");
432 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_SHIFT,
433 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR,
434 ".amdhsa_user_sgpr_dispatch_ptr");
436 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_SHIFT,
437 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR,
438 ".amdhsa_user_sgpr_queue_ptr");
440 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT,
441 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR,
442 ".amdhsa_user_sgpr_kernarg_segment_ptr");
444 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_SHIFT,
445 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID,
446 ".amdhsa_user_sgpr_dispatch_id");
449 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT,
450 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT,
451 ".amdhsa_user_sgpr_flat_scratch_init");
454 amdhsa::KERNARG_PRELOAD_SPEC_LENGTH,
455 ".amdhsa_user_sgpr_kernarg_preload_length");
457 amdhsa::KERNARG_PRELOAD_SPEC_OFFSET,
458 ".amdhsa_user_sgpr_kernarg_preload_offset");
462 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT,
463 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE,
464 ".amdhsa_user_sgpr_private_segment_size");
465 if (IVersion.
Major >= 10)
467 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_SHIFT,
468 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
469 ".amdhsa_wavefront_size32");
472 amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_SHIFT,
473 amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK,
474 ".amdhsa_uses_dynamic_stack");
476 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_SHIFT,
477 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT,
479 ?
".amdhsa_enable_private_segment"
480 :
".amdhsa_system_sgpr_private_segment_wavefront_offset"));
482 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT,
483 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X,
484 ".amdhsa_system_sgpr_workgroup_id_x");
486 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT,
487 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y,
488 ".amdhsa_system_sgpr_workgroup_id_y");
490 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT,
491 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z,
492 ".amdhsa_system_sgpr_workgroup_id_z");
494 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_SHIFT,
495 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO,
496 ".amdhsa_system_sgpr_workgroup_info");
498 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_SHIFT,
499 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID,
500 ".amdhsa_system_vgpr_workitem_id");
503 OS <<
"\t\t.amdhsa_next_free_vgpr ";
504 EmitMCExpr(NextVGPR);
507 OS <<
"\t\t.amdhsa_next_free_sgpr ";
508 EmitMCExpr(NextSGPR);
515 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT,
516 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET,
getContext());
521 OS <<
"\t\t.amdhsa_accum_offset ";
529 amdhsa::COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT_SHIFT,
530 amdhsa::COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT,
531 ".amdhsa_named_barrier_count");
533 OS <<
"\t\t.amdhsa_reserve_vcc ";
534 EmitMCExpr(ReserveVCC);
538 OS <<
"\t\t.amdhsa_reserve_flat_scratch ";
539 EmitMCExpr(ReserveFlatScr);
549 OS <<
"\t\t.amdhsa_reserve_xnack_mask " <<
getTargetID()->isXnackOnOrAny() <<
'\n';
554 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_SHIFT,
555 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32,
556 ".amdhsa_float_round_mode_32");
558 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_SHIFT,
559 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64,
560 ".amdhsa_float_round_mode_16_64");
562 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_SHIFT,
563 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32,
564 ".amdhsa_float_denorm_mode_32");
566 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_SHIFT,
567 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64,
568 ".amdhsa_float_denorm_mode_16_64");
569 if (STI.
hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode)) {
571 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_SHIFT,
572 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP,
573 ".amdhsa_dx10_clamp");
575 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_SHIFT,
576 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE,
577 ".amdhsa_ieee_mode");
579 if (IVersion.
Major >= 9) {
581 amdhsa::COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_SHIFT,
582 amdhsa::COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL,
583 ".amdhsa_fp16_overflow");
587 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_SHIFT,
588 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT,
".amdhsa_tg_split");
591 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_SHIFT,
592 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE,
593 ".amdhsa_workgroup_processor_mode");
594 if (IVersion.
Major >= 10) {
596 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_SHIFT,
597 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED,
598 ".amdhsa_memory_ordered");
600 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_SHIFT,
601 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS,
602 ".amdhsa_forward_progress");
604 if (IVersion.
Major >= 10 && IVersion.
Major < 12) {
606 amdhsa::COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_SHIFT,
607 amdhsa::COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT,
608 ".amdhsa_shared_vgpr_count");
610 if (IVersion.
Major == 11) {
612 amdhsa::COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_SHIFT,
613 amdhsa::COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE,
614 ".amdhsa_inst_pref_size");
616 if (IVersion.
Major >= 12) {
618 amdhsa::COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_SHIFT,
619 amdhsa::COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE,
620 ".amdhsa_inst_pref_size");
622 amdhsa::COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_SHIFT,
623 amdhsa::COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN,
624 ".amdhsa_round_robin_scheduling");
629 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT,
630 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION,
631 ".amdhsa_exception_fp_ieee_invalid_op");
634 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT,
635 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE,
636 ".amdhsa_exception_fp_denorm_src");
640 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT,
641 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO,
642 ".amdhsa_exception_fp_ieee_div_zero");
645 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT,
646 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW,
647 ".amdhsa_exception_fp_ieee_overflow");
650 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT,
651 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW,
652 ".amdhsa_exception_fp_ieee_underflow");
655 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT,
656 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT,
657 ".amdhsa_exception_fp_ieee_inexact");
660 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_SHIFT,
661 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO,
662 ".amdhsa_exception_int_div_zero");
664 OS <<
"\t.end_amdhsa_kernel\n";
684 W.setELFHeaderEFlags(getEFlags());
685 W.setOverrideABIVersion(
702void AMDGPUTargetELFStreamer::EmitNote(
706 auto &Context = S.getContext();
708 auto NameSZ = Name.size() + 1;
710 unsigned NoteFlags = 0;
720 S.emitValue(DescSZ, 4);
721 S.emitInt32(NoteType);
723 S.emitValueToAlignment(
Align(4), 0, 1, 0);
725 S.emitValueToAlignment(
Align(4), 0, 1, 0);
729unsigned AMDGPUTargetELFStreamer::getEFlags() {
734 return getEFlagsR600();
736 return getEFlagsAMDGCN();
740unsigned AMDGPUTargetELFStreamer::getEFlagsR600() {
746unsigned AMDGPUTargetELFStreamer::getEFlagsAMDGCN() {
747 assert(STI.getTargetTriple().isAMDGCN());
749 switch (STI.getTargetTriple().getOS()) {
754 return getEFlagsUnknownOS();
756 return getEFlagsAMDHSA();
758 return getEFlagsAMDPAL();
760 return getEFlagsMesa3D();
764unsigned AMDGPUTargetELFStreamer::getEFlagsUnknownOS() {
768 return getEFlagsV3();
771unsigned AMDGPUTargetELFStreamer::getEFlagsAMDHSA() {
775 return getEFlagsV6();
776 return getEFlagsV4();
779unsigned AMDGPUTargetELFStreamer::getEFlagsAMDPAL() {
782 return getEFlagsV3();
785unsigned AMDGPUTargetELFStreamer::getEFlagsMesa3D() {
788 return getEFlagsV3();
791unsigned AMDGPUTargetELFStreamer::getEFlagsV3() {
792 unsigned EFlagsV3 = 0;
807unsigned AMDGPUTargetELFStreamer::getEFlagsV4() {
808 unsigned EFlagsV4 = 0;
847unsigned AMDGPUTargetELFStreamer::getEFlagsV6() {
848 unsigned Flags = getEFlagsV4();
853 case AMDGPU::GK_GFX9_GENERIC:
856 case AMDGPU::GK_GFX9_4_GENERIC:
859 case AMDGPU::GK_GFX10_1_GENERIC:
862 case AMDGPU::GK_GFX10_3_GENERIC:
865 case AMDGPU::GK_GFX11_GENERIC:
868 case AMDGPU::GK_GFX12_GENERIC:
871 case AMDGPU::GK_GFX12_5_GENERIC:
884 " - no ELF flag can represent this version!");
909 auto *SymbolELF =
static_cast<MCSymbolELF *
>(Symbol);
912 if (!SymbolELF->isBindingSet())
915 if (SymbolELF->declareCommon(
Size, Alignment)) {
917 " redeclared as different type");
928 auto *DescBegin = Context.createTempSymbol();
929 auto *DescEnd = Context.createTempSymbol();
951 if (!Verifier.verify(HSAMetadataDoc.
getRoot()))
954 std::string HSAMetadataString;
960 auto *DescBegin = Context.createTempSymbol();
961 auto *DescEnd = Context.createTempSymbol();
976 const uint32_t Encoded_s_code_end = 0xbf9f0000;
977 const uint32_t Encoded_s_nop = 0xbf800000;
978 uint32_t Encoded_pad = Encoded_s_code_end;
988 Encoded_pad = Encoded_s_nop;
995 for (
unsigned I = 0;
I < FillSize;
I += 4)
1005 const MCExpr *ReserveFlatScr) {
1007 auto &Context = Streamer.getContext();
1009 auto *KernelCodeSymbol =
1011 auto *KernelDescriptorSymbol =
static_cast<MCSymbolELF *
>(
1012 Context.getOrCreateSymbol(
Twine(KernelName) +
Twine(
".kd")));
1016 KernelDescriptorSymbol->
setBinding(KernelCodeSymbol->getBinding());
1017 KernelDescriptorSymbol->setOther(KernelCodeSymbol->getOther());
1018 KernelDescriptorSymbol->setVisibility(KernelCodeSymbol->getVisibility());
1021 KernelDescriptorSymbol->setSize(
1029 Streamer.emitLabel(KernelDescriptorSymbol);
1040 Streamer.emitInt8(0u);
1053 Streamer.emitInt8(0u);
1066 Streamer.emitInt8(0u);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDHSA kernel descriptor MCExpr struct for use in MC layer.
Provides AMDGPU specific target descriptions.
Enums and constants for AMDGPU PT_NOTE sections.
static cl::opt< unsigned > ForceGenericVersion("amdgpu-force-generic-version", cl::desc("Force a specific generic_v<N> flag to be " "added. For testing purposes only."), cl::ReallyHidden, cl::init(0))
#define PRINT_RES_INFO(ARG)
AMDHSA kernel descriptor definitions.
MC layer struct for AMDGPUMCKernelCodeT, provides MCExpr functionality where required.
verify safepoint Safepoint IR Verifier
AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS)
bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override
void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override
bool EmitISAVersion() override
void EmitDirectiveAMDHSACodeObjectVersion(unsigned COV) override
void EmitDirectiveAMDGCNTarget() override
void EmitMCResourceMaximums(const MCSymbol *MaxVGPR, const MCSymbol *MaxAGPR, const MCSymbol *MaxSGPR, const MCSymbol *MaxNamedBarrier) override
void EmitAMDKernelCodeT(AMDGPU::AMDGPUMCKernelCodeT &Header) override
void EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName, const AMDGPU::MCKernelDescriptor &KernelDescriptor, const MCExpr *NextVGPR, const MCExpr *NextSGPR, const MCExpr *ReserveVCC, const MCExpr *ReserveFlatScr) override
void EmitMCResourceInfo(const MCSymbol *NumVGPR, const MCSymbol *NumAGPR, const MCSymbol *NumExplicitSGPR, const MCSymbol *NumNamedBarrier, const MCSymbol *PrivateSegmentSize, const MCSymbol *UsesVCC, const MCSymbol *UsesFlatScratch, const MCSymbol *HasDynamicallySizedStack, const MCSymbol *HasRecursion, const MCSymbol *HasIndirectCall) override
bool EmitCodeEnd(const MCSubtargetInfo &STI) override
void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override
void EmitDirectiveAMDGCNTarget() override
bool EmitCodeEnd(const MCSubtargetInfo &STI) override
void EmitAMDKernelCodeT(AMDGPU::AMDGPUMCKernelCodeT &Header) override
bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override
AMDGPUTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override
void EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName, const AMDGPU::MCKernelDescriptor &KernelDescriptor, const MCExpr *NextVGPR, const MCExpr *NextSGPR, const MCExpr *ReserveVCC, const MCExpr *ReserveFlatScr) override
MCELFStreamer & getStreamer()
void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override
bool EmitISAVersion() override
virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict)
Emit HSA Metadata.
AMDGPUPALMetadata * getPALMetadata()
AMDGPUTargetStreamer(MCStreamer &S)
virtual void EmitDirectiveAMDHSACodeObjectVersion(unsigned COV)
virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString)
static unsigned getElfMach(StringRef GPU)
MCContext & getContext() const
static StringRef getArchNameFromElfMach(unsigned ElfMach)
const std::optional< AMDGPU::IsaInfo::AMDGPUTargetID > & getTargetID() const
unsigned CodeObjectVersion
This class is intended to be used as a base class for asm properties and features specific to the tar...
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCBinaryExpr * createMul(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
const MCAsmInfo * getAsmInfo() const
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
ELFObjectWriter & getWriter()
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
Base class for the full range of assembler expressions which are needed for parsing.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
Streaming machine code generation interface.
virtual bool popSection()
Restore the current and previous section from the section stack.
MCContext & getContext() const
virtual void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
void pushSection()
Save the current and previous section on the section stack.
void emitInt32(uint64_t Value)
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
void setBinding(unsigned Binding) const
void setType(unsigned Type) const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef - Represent a constant reference to a string, i.e.
ArchType getArch() const
Get the parsed architecture type of this triple.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
An efficient, type-erasing, non-owning reference to a callable.
Simple in-memory representation of a document of msgpack objects with ability to find and create arra...
DocNode & getRoot()
Get ref to the document's root element.
LLVM_ABI void toYAML(raw_ostream &OS)
Convert MsgPack Document to YAML text.
LLVM_ABI void writeToBlob(std::string &Blob)
Write a MsgPack document to a binary MsgPack blob.
LLVM_ABI bool fromYAML(StringRef S)
Read YAML text into the MsgPack document. Returns false on failure.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static constexpr unsigned GFX12_5
static constexpr unsigned GFX9_4
static constexpr unsigned GFX10_1
static constexpr unsigned GFX10_3
static constexpr unsigned GFX11
static constexpr unsigned GFX9
static constexpr unsigned GFX12
constexpr char AssemblerDirectiveBegin[]
HSA metadata beginning assembler directive.
constexpr char AssemblerDirectiveEnd[]
HSA metadata ending assembler directive.
LLVM_ABI StringRef getArchNameR600(GPUKind AK)
GPUKind
GPU kinds supported by the AMDGPU target.
void printAMDGPUMCExpr(const MCExpr *Expr, raw_ostream &OS, const MCAsmInfo *MAI)
bool isHsaAbi(const MCSubtargetInfo &STI)
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
bool isGFX90A(const MCSubtargetInfo &STI)
LLVM_ABI GPUKind parseArchAMDGCN(StringRef CPU)
bool hasArchitectedFlatScratch(const MCSubtargetInfo &STI)
bool isGFX11Plus(const MCSubtargetInfo &STI)
const MCExpr * foldAMDGPUMCExpr(const MCExpr *Expr, MCContext &Ctx)
LLVM_ABI StringRef getArchNameAMDGCN(GPUKind AK)
unsigned hasKernargPreload(const MCSubtargetInfo &STI)
bool supportsWGP(const MCSubtargetInfo &STI)
bool isGFX1250Plus(const MCSubtargetInfo &STI)
uint8_t getELFABIVersion(const Triple &T, unsigned CodeObjectVersion)
LLVM_ABI GPUKind parseArchR600(StringRef CPU)
@ EF_AMDGPU_GENERIC_VERSION_MAX
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
@ EF_AMDGPU_FEATURE_SRAMECC_V3
@ EF_AMDGPU_GENERIC_VERSION_OFFSET
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
@ EF_AMDGPU_FEATURE_XNACK_V3
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Instruction set architecture version.
const MCExpr * compute_pgm_rsrc2
const MCExpr * kernarg_size
const MCExpr * kernarg_preload
const MCExpr * compute_pgm_rsrc3
const MCExpr * private_segment_fixed_size
static const MCExpr * bits_get(const MCExpr *Src, uint32_t Shift, uint32_t Mask, MCContext &Ctx)
const MCExpr * compute_pgm_rsrc1
const MCExpr * group_segment_fixed_size
const MCExpr * kernel_code_properties
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
uint32_t group_segment_fixed_size
uint32_t compute_pgm_rsrc1
uint32_t private_segment_fixed_size
uint32_t compute_pgm_rsrc2
uint16_t kernel_code_properties
uint32_t compute_pgm_rsrc3
int64_t kernel_code_entry_byte_offset