45 cl::desc(
"Force a specific generic_v<N> flag to be "
46 "added. For testing purposes only."),
50 bool ApplyFeatureString) {
51 assert(
TargetID == std::nullopt &&
"TargetID can only be initialized once");
60 if (!HSAMetadataDoc.
fromYAML(HSAMetadataString))
72 case GK_R600:
return ELF::EF_AMDGPU_MACH_R600_R600;
73 case GK_R630:
return ELF::EF_AMDGPU_MACH_R600_R630;
74 case GK_RS880:
return ELF::EF_AMDGPU_MACH_R600_RS880;
75 case GK_RV670:
return ELF::EF_AMDGPU_MACH_R600_RV670;
76 case GK_RV710:
return ELF::EF_AMDGPU_MACH_R600_RV710;
77 case GK_RV730:
return ELF::EF_AMDGPU_MACH_R600_RV730;
78 case GK_RV770:
return ELF::EF_AMDGPU_MACH_R600_RV770;
79 case GK_CEDAR:
return ELF::EF_AMDGPU_MACH_R600_CEDAR;
80 case GK_CYPRESS:
return ELF::EF_AMDGPU_MACH_R600_CYPRESS;
81 case GK_JUNIPER:
return ELF::EF_AMDGPU_MACH_R600_JUNIPER;
82 case GK_REDWOOD:
return ELF::EF_AMDGPU_MACH_R600_REDWOOD;
83 case GK_SUMO:
return ELF::EF_AMDGPU_MACH_R600_SUMO;
84 case GK_BARTS:
return ELF::EF_AMDGPU_MACH_R600_BARTS;
85 case GK_CAICOS:
return ELF::EF_AMDGPU_MACH_R600_CAICOS;
86 case GK_CAYMAN:
return ELF::EF_AMDGPU_MACH_R600_CAYMAN;
87 case GK_TURKS:
return ELF::EF_AMDGPU_MACH_R600_TURKS;
88 case GK_GFX600:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX600;
89 case GK_GFX601:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX601;
90 case GK_GFX602:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX602;
91 case GK_GFX700:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX700;
92 case GK_GFX701:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX701;
93 case GK_GFX702:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX702;
94 case GK_GFX703:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX703;
95 case GK_GFX704:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX704;
96 case GK_GFX705:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX705;
97 case GK_GFX801:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX801;
98 case GK_GFX802:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX802;
99 case GK_GFX803:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX803;
100 case GK_GFX805:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX805;
101 case GK_GFX810:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX810;
102 case GK_GFX900:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX900;
103 case GK_GFX902:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX902;
104 case GK_GFX904:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX904;
105 case GK_GFX906:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX906;
106 case GK_GFX908:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX908;
107 case GK_GFX909:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX909;
108 case GK_GFX90A:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A;
109 case GK_GFX90C:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C;
110 case GK_GFX942:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX942;
111 case GK_GFX950:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX950;
112 case GK_GFX1010:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010;
113 case GK_GFX1011:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011;
114 case GK_GFX1012:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012;
115 case GK_GFX1013:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013;
116 case GK_GFX1030:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030;
117 case GK_GFX1031:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031;
118 case GK_GFX1032:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032;
119 case GK_GFX1033:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033;
120 case GK_GFX1034:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034;
121 case GK_GFX1035:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035;
122 case GK_GFX1036:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036;
123 case GK_GFX1100:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100;
124 case GK_GFX1101:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101;
125 case GK_GFX1102:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102;
126 case GK_GFX1103:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103;
127 case GK_GFX1150:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150;
128 case GK_GFX1151:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151;
129 case GK_GFX1152:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152;
130 case GK_GFX1153:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153;
131 case GK_GFX1154:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1154;
132 case GK_GFX1170:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170;
133 case GK_GFX1171:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171;
134 case GK_GFX1172:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172;
135 case GK_GFX1200:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200;
136 case GK_GFX1201:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201;
137 case GK_GFX1250_STRICT:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250_STRICT;
138 case GK_GFX1250:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250;
139 case GK_GFX1251:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251;
140 case GK_GFX1310:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310;
141 case GK_GFX9_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC;
142 case GK_GFX9_4_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC;
143 case GK_GFX10_1_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC;
144 case GK_GFX10_3_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC;
145 case GK_GFX11_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC;
146 case GK_GFX11_7_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_7_GENERIC;
147 case GK_GFX12_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC;
148 case GK_GFX12_5_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC;
149 case GK_GFX13_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX13_GENERIC;
181 OS <<
"\t.amdgcn_target \"" << *
getTargetID() <<
"\"\n";
187 OS <<
"\t.amdhsa_code_object_version " << COV <<
'\n';
196 OS <<
"\t.amd_kernel_code_t\n";
197 Header.EmitKernelCodeT(OS,
getContext(), FoldAndPrint);
198 OS <<
"\t.end_amd_kernel_code_t\n";
207 OS <<
"\t.amdgpu_hsa_kernel " << SymbolName <<
'\n';
214 OS <<
"\t.amdgpu_lds " << Symbol->getName() <<
", " <<
Size <<
", "
215 << Alignment.value() <<
'\n';
224#define PRINT_RES_INFO(ARG) \
226 ARG->print(OS, &getContext().getAsmInfo()); \
228 getContext().getAsmInfo().printExpr(OS, *ARG->getVariableValue()); \
229 Streamer.addBlankLine();
247#define PRINT_RES_INFO(ARG) \
249 ARG->print(OS, &getContext().getAsmInfo()); \
251 getContext().getAsmInfo().printExpr(OS, *ARG->getVariableValue()); \
252 Streamer.addBlankLine();
262 OS <<
"\t.amd_amdgpu_isa \"" <<
getTargetID() <<
"\"\n";
269 if (!Verifier.verify(HSAMetadataDoc.
getRoot()))
272 std::string HSAMetadataString;
274 HSAMetadataDoc.
toYAML(StrOS);
277 OS << StrOS.
str() <<
'\n';
283 const uint32_t Encoded_s_code_end = 0xbf9f0000;
284 const uint32_t Encoded_s_nop = 0xbf800000;
285 uint32_t Encoded_pad = Encoded_s_code_end;
295 Encoded_pad = Encoded_s_nop;
299 OS <<
"\t.p2alignl " << Log2CacheLineSize <<
", " << Encoded_pad <<
'\n';
300 OS <<
"\t.fill " << (FillSize / 4) <<
", 4, " << Encoded_pad <<
'\n';
308 const MCExpr *ReserveFlatScr) {
312 OS <<
"\t.amdhsa_kernel " << KernelName <<
'\n';
317 const MCExpr *ShiftedAndMaskedExpr =
329 OS <<
"\t\t.amdhsa_group_segment_fixed_size ";
333 OS <<
"\t\t.amdhsa_private_segment_fixed_size ";
337 OS <<
"\t\t.amdhsa_kernarg_size ";
343 amdhsa::COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT_SHIFT,
344 amdhsa::COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT,
345 ".amdhsa_user_sgpr_count");
348 amdhsa::COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT_SHIFT,
349 amdhsa::COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT,
350 ".amdhsa_user_sgpr_count");
356 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT,
357 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER,
358 ".amdhsa_user_sgpr_private_segment_buffer");
360 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_SHIFT,
361 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR,
362 ".amdhsa_user_sgpr_dispatch_ptr");
364 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_SHIFT,
365 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR,
366 ".amdhsa_user_sgpr_queue_ptr");
368 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT,
369 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR,
370 ".amdhsa_user_sgpr_kernarg_segment_ptr");
372 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_SHIFT,
373 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID,
374 ".amdhsa_user_sgpr_dispatch_id");
377 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT,
378 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT,
379 ".amdhsa_user_sgpr_flat_scratch_init");
382 amdhsa::KERNARG_PRELOAD_SPEC_LENGTH,
383 ".amdhsa_user_sgpr_kernarg_preload_length");
385 amdhsa::KERNARG_PRELOAD_SPEC_OFFSET,
386 ".amdhsa_user_sgpr_kernarg_preload_offset");
390 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT,
391 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE,
392 ".amdhsa_user_sgpr_private_segment_size");
396 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_SHIFT,
397 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
398 ".amdhsa_wavefront_size32");
402 amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_SHIFT,
403 amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK,
404 ".amdhsa_uses_dynamic_stack");
406 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_SHIFT,
407 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT,
409 ?
".amdhsa_enable_private_segment"
410 :
".amdhsa_system_sgpr_private_segment_wavefront_offset"));
412 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT,
413 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X,
414 ".amdhsa_system_sgpr_workgroup_id_x");
416 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT,
417 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y,
418 ".amdhsa_system_sgpr_workgroup_id_y");
420 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT,
421 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z,
422 ".amdhsa_system_sgpr_workgroup_id_z");
424 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_SHIFT,
425 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO,
426 ".amdhsa_system_sgpr_workgroup_info");
428 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_SHIFT,
429 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID,
430 ".amdhsa_system_vgpr_workitem_id");
433 OS <<
"\t\t.amdhsa_next_free_vgpr ";
434 EmitMCExpr(NextVGPR);
437 OS <<
"\t\t.amdhsa_next_free_sgpr ";
438 EmitMCExpr(NextSGPR);
445 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT,
446 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET,
getContext());
451 OS <<
"\t\t.amdhsa_accum_offset ";
459 amdhsa::COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT_SHIFT,
460 amdhsa::COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT,
461 ".amdhsa_named_barrier_count");
463 OS <<
"\t\t.amdhsa_reserve_vcc ";
464 EmitMCExpr(ReserveVCC);
468 OS <<
"\t\t.amdhsa_reserve_flat_scratch ";
469 EmitMCExpr(ReserveFlatScr);
478 if (STI.
hasFeature(AMDGPU::FeatureSupportsXNACK)) {
480 OS <<
"\t\t.amdhsa_reserve_xnack_mask " << XnackOn <<
'\n';
486 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_SHIFT,
487 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32,
488 ".amdhsa_float_round_mode_32");
490 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_SHIFT,
491 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64,
492 ".amdhsa_float_round_mode_16_64");
494 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_SHIFT,
495 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32,
496 ".amdhsa_float_denorm_mode_32");
498 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_SHIFT,
499 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64,
500 ".amdhsa_float_denorm_mode_16_64");
501 if (STI.
hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode)) {
503 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_SHIFT,
504 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP,
505 ".amdhsa_dx10_clamp");
507 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_SHIFT,
508 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE,
509 ".amdhsa_ieee_mode");
511 if (IVersion.
Major >= 9) {
513 amdhsa::COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_SHIFT,
514 amdhsa::COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL,
515 ".amdhsa_fp16_overflow");
519 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_SHIFT,
520 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT,
".amdhsa_tg_split");
523 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_SHIFT,
524 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE,
525 ".amdhsa_workgroup_processor_mode");
526 if (IVersion.
Major >= 10) {
528 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_SHIFT,
529 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED,
530 ".amdhsa_memory_ordered");
532 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_SHIFT,
533 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS,
534 ".amdhsa_forward_progress");
536 if (IVersion.
Major >= 10 && IVersion.
Major < 12) {
538 amdhsa::COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_SHIFT,
539 amdhsa::COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT,
540 ".amdhsa_shared_vgpr_count");
542 if (IVersion.
Major == 11) {
544 amdhsa::COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_SHIFT,
545 amdhsa::COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE,
546 ".amdhsa_inst_pref_size");
548 if (IVersion.
Major >= 12) {
550 amdhsa::COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_SHIFT,
551 amdhsa::COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE,
552 ".amdhsa_inst_pref_size");
554 amdhsa::COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_SHIFT,
555 amdhsa::COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN,
556 ".amdhsa_round_robin_scheduling");
561 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT,
562 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION,
563 ".amdhsa_exception_fp_ieee_invalid_op");
566 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT,
567 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE,
568 ".amdhsa_exception_fp_denorm_src");
572 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT,
573 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO,
574 ".amdhsa_exception_fp_ieee_div_zero");
577 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT,
578 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW,
579 ".amdhsa_exception_fp_ieee_overflow");
582 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT,
583 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW,
584 ".amdhsa_exception_fp_ieee_underflow");
587 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT,
588 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT,
589 ".amdhsa_exception_fp_ieee_inexact");
592 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_SHIFT,
593 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO,
594 ".amdhsa_exception_int_div_zero");
596 OS <<
"\t.end_amdhsa_kernel\n";
614 InfoScopeEmitter Emit) {
619 for (
const auto &[Func, Res] :
Data.Uses)
620 FuncUses[Func].push_back(Res);
621 for (
const auto &[Src, Dst] :
Data.Calls)
622 FuncCalls[Src].push_back(Dst);
623 for (
const auto &[Func, TypeId] :
Data.IndirectCalls)
624 FuncIndirectCalls[Func].push_back(TypeId);
625 for (
const auto &[Sym, TypeId] :
Data.TypeIds)
626 FuncTypeIds[Sym].push_back(TypeId);
630 if (!Emitted.insert(Sym).second)
634 if (
auto It = FuncUses.
find(Sym); It != FuncUses.
end())
636 if (
auto It = FuncCalls.
find(Sym); It != FuncCalls.
end())
638 if (
auto It = FuncIndirectCalls.
find(Sym); It != FuncIndirectCalls.
end())
639 IndirectCallTypeIds = It->second;
640 if (
auto It = FuncTypeIds.
find(Sym); It != FuncTypeIds.
end())
641 TypeIds = It->second;
642 Emit(Sym, Info,
Uses, Calls, IndirectCallTypeIds, TypeIds);
646 EmitIfNew(Func.Sym, &Func);
649 for (
const auto &[Sym, TypeId] :
Data.TypeIds)
650 EmitIfNew(Sym,
nullptr);
651 for (
const auto &[Sym, Res] :
Data.Uses)
652 EmitIfNew(Sym,
nullptr);
653 for (
const auto &[Sym, Dst] :
Data.Calls)
654 EmitIfNew(Sym,
nullptr);
655 for (
const auto &[Sym, TypeId] :
Data.IndirectCalls)
656 EmitIfNew(Sym,
nullptr);
667 OS <<
"\t.amdgpu_info " << Sym->
getName() <<
'\n';
672 if (Info->UsesFlatScratch)
674 if (Info->HasDynStack)
677 OS <<
"\t\t.amdgpu_num_sgpr " << Info->NumSGPR <<
'\n';
678 OS <<
"\t\t.amdgpu_num_vgpr " << Info->NumArchVGPR <<
'\n';
679 if (Info->NumAccVGPR)
680 OS <<
"\t\t.amdgpu_num_agpr " << Info->NumAccVGPR <<
'\n';
681 OS <<
"\t\t.amdgpu_private_segment_size " << Info->PrivateSegmentSize
685 OS <<
"\t\t.amdgpu_use " << Res->getName() <<
'\n';
687 OS <<
"\t\t.amdgpu_call " << Dst->getName() <<
'\n';
688 for (
StringRef TypeId : IndirectCallTypeIds)
689 OS <<
"\t\t.amdgpu_indirect_call \"" << TypeId <<
"\"\n";
691 OS <<
"\t\t.amdgpu_typeid \"" << TypeId <<
"\"\n";
692 OS <<
"\t.end_amdgpu_info\n\n";
713 W.setELFHeaderEFlags(getEFlags());
714 W.setOverrideABIVersion(
731void AMDGPUTargetELFStreamer::EmitNote(
735 auto &Context = S.getContext();
737 auto NameSZ = Name.size() + 1;
739 unsigned NoteFlags = 0;
749 S.emitValue(DescSZ, 4);
750 S.emitInt32(NoteType);
753 S.emitValueToAlignment(
Align(4), 0, 1, 0);
755 S.emitValueToAlignment(
Align(4), 0, 1, 0);
759unsigned AMDGPUTargetELFStreamer::getEFlags() {
764 return getEFlagsR600();
766 return getEFlagsAMDGCN();
770unsigned AMDGPUTargetELFStreamer::getEFlagsR600() {
776unsigned AMDGPUTargetELFStreamer::getEFlagsAMDGCN() {
777 assert(STI.getTargetTriple().isAMDGCN());
779 switch (STI.getTargetTriple().getOS()) {
784 return getEFlagsUnknownOS();
786 return getEFlagsAMDHSA();
788 return getEFlagsAMDPAL();
790 return getEFlagsMesa3D();
794unsigned AMDGPUTargetELFStreamer::getEFlagsUnknownOS() {
798 return getEFlagsV3();
801unsigned AMDGPUTargetELFStreamer::getEFlagsAMDHSA() {
805 return getEFlagsV6();
806 return getEFlagsV4();
809unsigned AMDGPUTargetELFStreamer::getEFlagsAMDPAL() {
812 return getEFlagsV3();
815unsigned AMDGPUTargetELFStreamer::getEFlagsMesa3D() {
818 return getEFlagsV3();
821unsigned AMDGPUTargetELFStreamer::getEFlagsV3() {
822 unsigned EFlagsV3 = 0;
837unsigned AMDGPUTargetELFStreamer::getEFlagsV4() {
838 unsigned EFlagsV4 = 0;
846 STI.hasFeature(AMDGPU::FeatureXNACKOnOffModes)
848 : AMDGPU::TargetIDSetting::Unsupported;
850 case AMDGPU::TargetIDSetting::Unsupported:
852 case AMDGPU::TargetIDSetting::Any:
855 case AMDGPU::TargetIDSetting::Off:
858 case AMDGPU::TargetIDSetting::On:
865 STI.hasFeature(AMDGPU::FeatureSRAMECCOnOffModes)
867 : AMDGPU::TargetIDSetting::Unsupported;
869 case AMDGPU::TargetIDSetting::Unsupported:
871 case AMDGPU::TargetIDSetting::Any:
874 case AMDGPU::TargetIDSetting::Off:
877 case AMDGPU::TargetIDSetting::On:
885unsigned AMDGPUTargetELFStreamer::getEFlagsV6() {
886 unsigned Flags = getEFlagsV4();
891 case AMDGPU::GK_GFX9_GENERIC:
894 case AMDGPU::GK_GFX9_4_GENERIC:
897 case AMDGPU::GK_GFX10_1_GENERIC:
900 case AMDGPU::GK_GFX10_3_GENERIC:
903 case AMDGPU::GK_GFX11_GENERIC:
906 case AMDGPU::GK_GFX11_7_GENERIC:
909 case AMDGPU::GK_GFX12_GENERIC:
912 case AMDGPU::GK_GFX12_5_GENERIC:
915 case AMDGPU::GK_GFX13_GENERIC:
928 " - no ELF flag can represent this version!");
953 auto *SymbolELF =
static_cast<MCSymbolELF *
>(Symbol);
956 if (!SymbolELF->isBindingSet())
959 if (SymbolELF->declareCommon(
Size, Alignment)) {
961 " redeclared as different type");
972 auto *DescBegin = Context.createTempSymbol();
973 auto *DescEnd = Context.createTempSymbol();
995 if (!Verifier.verify(HSAMetadataDoc.
getRoot()))
998 std::string HSAMetadataString;
1004 auto *DescBegin = Context.createTempSymbol();
1005 auto *DescEnd = Context.createTempSymbol();
1020 const uint32_t Encoded_s_code_end = 0xbf9f0000;
1021 const uint32_t Encoded_s_nop = 0xbf800000;
1022 uint32_t Encoded_pad = Encoded_s_code_end;
1032 Encoded_pad = Encoded_s_nop;
1039 for (
unsigned I = 0;
I < FillSize;
I += 4)
1049 const MCExpr *ReserveFlatScr) {
1051 auto &Context = Streamer.getContext();
1053 auto *KernelCodeSymbol =
1055 auto *KernelDescriptorSymbol =
static_cast<MCSymbolELF *
>(
1056 Context.getOrCreateSymbol(
Twine(KernelName) +
Twine(
".kd")));
1060 KernelDescriptorSymbol->
setBinding(KernelCodeSymbol->getBinding());
1061 KernelDescriptorSymbol->setOther(KernelCodeSymbol->getOther());
1062 KernelDescriptorSymbol->setVisibility(KernelCodeSymbol->getVisibility());
1065 KernelDescriptorSymbol->setSize(
1073 Streamer.emitLabel(KernelDescriptorSymbol);
1084 Streamer.emitInt8(0u);
1097 Streamer.emitInt8(0u);
1110 Streamer.emitInt8(0u);
1122 return StrTab.
add(Str);
1152 if (Info->UsesFlatScratch)
1154 if (Info->HasDynStack)
1161 if (Info->NumAccVGPR)
1164 Info->PrivateSegmentSize);
1171 for (
StringRef TypeId : IndirectCallTypeIds) {
1173 getOrAddString(TypeId));
1179 if (!StrTab.
empty()) {
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 shared between the AMDGPU backend (LLVM) and the ELF linker (LLD) for the .amdgpu....
Enums and constants for AMDGPU PT_NOTE sections.
static cl::opt< bool > SramEccSetting("amdgpu-sramecc", cl::desc("Force amdgpu.sramecc for testing"), cl::ReallyHidden)
static cl::opt< bool > XnackSetting("amdgpu-xnack", cl::desc("Force amdgpu.xnack value for testing"), cl::ReallyHidden)
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.
Remove Loads Into Fake Uses
verify safepoint Safepoint IR Verifier
void emitAMDGPUInfo(const AMDGPU::InfoSectionData &Data) override
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
void emitAMDGPUInfo(const AMDGPU::InfoSectionData &Data) override
bool EmitISAVersion() override
virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict)
Emit HSA Metadata.
AMDGPUPALMetadata * getPALMetadata()
void initializeTargetID(const MCSubtargetInfo &STI, bool ApplyFeatureString=false)
AMDGPUTargetStreamer(MCStreamer &S)
virtual void EmitDirectiveAMDHSACodeObjectVersion(unsigned COV)
virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString)
static unsigned getElfMach(StringRef GPU)
const std::optional< AMDGPU::TargetID > & getTargetID() const
std::optional< AMDGPU::TargetID > TargetID
MCContext & getContext() const
unsigned CodeObjectVersion
Represent a constant reference to an array (0 or more elements consecutively in memory),...
iterator find(const_arg_type_t< KeyT > Val)
Implements a dense probed hash-table based set.
constexpr bool test(unsigned I) const
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)
Context object for machine code objects.
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
const MCAsmInfo & getAsmInfo() const
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.
This represents a section on linux, lots of unix variants and some bare metal systems.
Streaming machine code generation interface.
virtual bool popSection()
Restore the current and previous section from the section stack.
MCContext & getContext() const
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
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.
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
void emitInt32(uint64_t Value)
void emitInt8(uint64_t Value)
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
StringRef getFeatureString() const
const Triple & getTargetTriple() const
const FeatureBitset & getFeatureBits() const
LLVM_ABI void setBinding(unsigned Binding) const
LLVM_ABI 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 ...
StringRef getName() const
getName - Get the symbol name.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Represent a constant reference to a string, i.e.
Utility for building string tables with deduplicated suffixes.
LLVM_ABI void finalizeInOrder()
Finalize the string table without reording it.
LLVM_ABI size_t add(CachedHashStringRef S, uint8_t Priority=0)
Add a string to the builder.
LLVM_ABI void write(raw_ostream &OS) const
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
static constexpr unsigned GFX13
static constexpr unsigned GFX11_7
constexpr char AssemblerDirectiveBegin[]
HSA metadata beginning assembler directive.
constexpr char AssemblerDirectiveEnd[]
HSA metadata ending assembler directive.
FuncInfoFlags
Per-function flags packed into INFO_FLAGS entries.
void printAMDGPUMCExpr(const MCExpr *Expr, raw_ostream &OS, const MCAsmInfo *MAI)
bool isHsaAbi(const MCSubtargetInfo &STI)
TargetID createAMDGPUTargetID(const MCSubtargetInfo &STI, StringRef FeatureString)
Construct TargetID from MCSubtargetInfo.
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
GPUKind
GPU kinds supported by the AMDGPU target.
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)
InfoKind
Entry kind values for the .amdgpu.info section.
@ INFO_INDIRECT_CALL
Indirect call edge: the function contains an indirect call whose callee is expected to match the type...
@ INFO_FLAGS
Bitfield of FuncInfoFlags properties for the function. [u32].
@ INFO_FUNC
Opens a new function scope.
@ INFO_NUM_SGPR
Number of SGPRs explicitly used by the function. [u32].
@ INFO_NUM_VGPR
Number of architectural VGPRs used by the function. [u32].
@ INFO_CALL
Direct call edge: the function calls the callee identified by the 8-byte relocated symbol.
@ INFO_NUM_AGPR
Number of accumulator VGPRs (AGPRs) used by the function. [u32].
@ INFO_TYPEID
Function type ID: tags an address-taken function with a type-ID string (at the given ....
@ INFO_PRIVATE_SEGMENT_SIZE
Private (scratch) memory size in bytes required by the function. [u32].
@ INFO_USE
Dependency edge: the function uses the resource identified by the 8-byte relocated symbol (e....
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_OFF_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.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
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.
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