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))
70 case ELF::EF_AMDGPU_MACH_R600_R600: AK = GK_R600;
break;
71 case ELF::EF_AMDGPU_MACH_R600_R630: AK = GK_R630;
break;
72 case ELF::EF_AMDGPU_MACH_R600_RS880: AK = GK_RS880;
break;
73 case ELF::EF_AMDGPU_MACH_R600_RV670: AK = GK_RV670;
break;
74 case ELF::EF_AMDGPU_MACH_R600_RV710: AK = GK_RV710;
break;
75 case ELF::EF_AMDGPU_MACH_R600_RV730: AK = GK_RV730;
break;
76 case ELF::EF_AMDGPU_MACH_R600_RV770: AK = GK_RV770;
break;
77 case ELF::EF_AMDGPU_MACH_R600_CEDAR: AK = GK_CEDAR;
break;
78 case ELF::EF_AMDGPU_MACH_R600_CYPRESS: AK = GK_CYPRESS;
break;
79 case ELF::EF_AMDGPU_MACH_R600_JUNIPER: AK = GK_JUNIPER;
break;
80 case ELF::EF_AMDGPU_MACH_R600_REDWOOD: AK = GK_REDWOOD;
break;
81 case ELF::EF_AMDGPU_MACH_R600_SUMO: AK = GK_SUMO;
break;
82 case ELF::EF_AMDGPU_MACH_R600_BARTS: AK = GK_BARTS;
break;
83 case ELF::EF_AMDGPU_MACH_R600_CAICOS: AK = GK_CAICOS;
break;
84 case ELF::EF_AMDGPU_MACH_R600_CAYMAN: AK = GK_CAYMAN;
break;
85 case ELF::EF_AMDGPU_MACH_R600_TURKS: AK = GK_TURKS;
break;
86 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX600: AK = GK_GFX600;
break;
87 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX601: AK = GK_GFX601;
break;
88 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX602: AK = GK_GFX602;
break;
89 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX700: AK = GK_GFX700;
break;
90 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX701: AK = GK_GFX701;
break;
91 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX702: AK = GK_GFX702;
break;
92 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX703: AK = GK_GFX703;
break;
93 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX704: AK = GK_GFX704;
break;
94 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX705: AK = GK_GFX705;
break;
95 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX801: AK = GK_GFX801;
break;
96 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX802: AK = GK_GFX802;
break;
97 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX803: AK = GK_GFX803;
break;
98 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX805: AK = GK_GFX805;
break;
99 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX810: AK = GK_GFX810;
break;
100 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX900: AK = GK_GFX900;
break;
101 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX902: AK = GK_GFX902;
break;
102 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX904: AK = GK_GFX904;
break;
103 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX906: AK = GK_GFX906;
break;
104 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX908: AK = GK_GFX908;
break;
105 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX909: AK = GK_GFX909;
break;
106 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A: AK = GK_GFX90A;
break;
107 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C: AK = GK_GFX90C;
break;
108 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX942: AK = GK_GFX942;
break;
109 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX950: AK = GK_GFX950;
break;
110 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010: AK = GK_GFX1010;
break;
111 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011: AK = GK_GFX1011;
break;
112 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012: AK = GK_GFX1012;
break;
113 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013: AK = GK_GFX1013;
break;
114 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030: AK = GK_GFX1030;
break;
115 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031: AK = GK_GFX1031;
break;
116 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032: AK = GK_GFX1032;
break;
117 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033: AK = GK_GFX1033;
break;
118 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034: AK = GK_GFX1034;
break;
119 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035: AK = GK_GFX1035;
break;
120 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036: AK = GK_GFX1036;
break;
121 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100: AK = GK_GFX1100;
break;
122 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101: AK = GK_GFX1101;
break;
123 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102: AK = GK_GFX1102;
break;
124 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103: AK = GK_GFX1103;
break;
125 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150: AK = GK_GFX1150;
break;
126 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151: AK = GK_GFX1151;
break;
127 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152: AK = GK_GFX1152;
break;
128 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153: AK = GK_GFX1153;
break;
129 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1154: AK = GK_GFX1154;
break;
130 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170: AK = GK_GFX1170;
break;
131 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171: AK = GK_GFX1171;
break;
132 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172: AK = GK_GFX1172;
break;
133 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200: AK = GK_GFX1200;
break;
134 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201: AK = GK_GFX1201;
break;
135 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250: AK = GK_GFX1250;
break;
136 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251: AK = GK_GFX1251;
break;
137 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310: AK = GK_GFX1310;
break;
138 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC: AK = GK_GFX9_GENERIC;
break;
139 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC: AK = GK_GFX9_4_GENERIC;
break;
140 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC: AK = GK_GFX10_1_GENERIC;
break;
141 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC: AK = GK_GFX10_3_GENERIC;
break;
142 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC: AK = GK_GFX11_GENERIC;
break;
143 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_7_GENERIC: AK = GK_GFX11_7_GENERIC;
break;
144 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC: AK = GK_GFX12_GENERIC;
break;
145 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC: AK = GK_GFX12_5_GENERIC;
break;
146 case ELF::EF_AMDGPU_MACH_AMDGCN_GFX13_GENERIC: AK = GK_GFX13_GENERIC;
break;
165 case GK_R600:
return ELF::EF_AMDGPU_MACH_R600_R600;
166 case GK_R630:
return ELF::EF_AMDGPU_MACH_R600_R630;
167 case GK_RS880:
return ELF::EF_AMDGPU_MACH_R600_RS880;
168 case GK_RV670:
return ELF::EF_AMDGPU_MACH_R600_RV670;
169 case GK_RV710:
return ELF::EF_AMDGPU_MACH_R600_RV710;
170 case GK_RV730:
return ELF::EF_AMDGPU_MACH_R600_RV730;
171 case GK_RV770:
return ELF::EF_AMDGPU_MACH_R600_RV770;
172 case GK_CEDAR:
return ELF::EF_AMDGPU_MACH_R600_CEDAR;
173 case GK_CYPRESS:
return ELF::EF_AMDGPU_MACH_R600_CYPRESS;
174 case GK_JUNIPER:
return ELF::EF_AMDGPU_MACH_R600_JUNIPER;
175 case GK_REDWOOD:
return ELF::EF_AMDGPU_MACH_R600_REDWOOD;
176 case GK_SUMO:
return ELF::EF_AMDGPU_MACH_R600_SUMO;
177 case GK_BARTS:
return ELF::EF_AMDGPU_MACH_R600_BARTS;
178 case GK_CAICOS:
return ELF::EF_AMDGPU_MACH_R600_CAICOS;
179 case GK_CAYMAN:
return ELF::EF_AMDGPU_MACH_R600_CAYMAN;
180 case GK_TURKS:
return ELF::EF_AMDGPU_MACH_R600_TURKS;
181 case GK_GFX600:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX600;
182 case GK_GFX601:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX601;
183 case GK_GFX602:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX602;
184 case GK_GFX700:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX700;
185 case GK_GFX701:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX701;
186 case GK_GFX702:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX702;
187 case GK_GFX703:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX703;
188 case GK_GFX704:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX704;
189 case GK_GFX705:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX705;
190 case GK_GFX801:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX801;
191 case GK_GFX802:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX802;
192 case GK_GFX803:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX803;
193 case GK_GFX805:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX805;
194 case GK_GFX810:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX810;
195 case GK_GFX900:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX900;
196 case GK_GFX902:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX902;
197 case GK_GFX904:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX904;
198 case GK_GFX906:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX906;
199 case GK_GFX908:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX908;
200 case GK_GFX909:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX909;
201 case GK_GFX90A:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A;
202 case GK_GFX90C:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C;
203 case GK_GFX942:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX942;
204 case GK_GFX950:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX950;
205 case GK_GFX1010:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010;
206 case GK_GFX1011:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011;
207 case GK_GFX1012:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012;
208 case GK_GFX1013:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013;
209 case GK_GFX1030:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030;
210 case GK_GFX1031:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031;
211 case GK_GFX1032:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032;
212 case GK_GFX1033:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033;
213 case GK_GFX1034:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034;
214 case GK_GFX1035:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035;
215 case GK_GFX1036:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036;
216 case GK_GFX1100:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100;
217 case GK_GFX1101:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101;
218 case GK_GFX1102:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102;
219 case GK_GFX1103:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103;
220 case GK_GFX1150:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150;
221 case GK_GFX1151:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151;
222 case GK_GFX1152:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152;
223 case GK_GFX1153:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153;
224 case GK_GFX1154:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1154;
225 case GK_GFX1170:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170;
226 case GK_GFX1171:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171;
227 case GK_GFX1172:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172;
228 case GK_GFX1200:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200;
229 case GK_GFX1201:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201;
230 case GK_GFX1250:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250;
231 case GK_GFX1251:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251;
232 case GK_GFX1310:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310;
233 case GK_GFX9_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC;
234 case GK_GFX9_4_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC;
235 case GK_GFX10_1_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC;
236 case GK_GFX10_3_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC;
237 case GK_GFX11_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC;
238 case GK_GFX11_7_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_7_GENERIC;
239 case GK_GFX12_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC;
240 case GK_GFX12_5_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC;
241 case GK_GFX13_GENERIC:
return ELF::EF_AMDGPU_MACH_AMDGCN_GFX13_GENERIC;
273 OS <<
"\t.amdgcn_target \"" << *
getTargetID() <<
"\"\n";
279 OS <<
"\t.amdhsa_code_object_version " << COV <<
'\n';
288 OS <<
"\t.amd_kernel_code_t\n";
289 Header.EmitKernelCodeT(OS,
getContext(), FoldAndPrint);
290 OS <<
"\t.end_amd_kernel_code_t\n";
299 OS <<
"\t.amdgpu_hsa_kernel " << SymbolName <<
'\n';
306 OS <<
"\t.amdgpu_lds " << Symbol->getName() <<
", " <<
Size <<
", "
307 << Alignment.
value() <<
'\n';
316#define PRINT_RES_INFO(ARG) \
318 ARG->print(OS, &getContext().getAsmInfo()); \
320 getContext().getAsmInfo().printExpr(OS, *ARG->getVariableValue()); \
321 Streamer.addBlankLine();
339#define PRINT_RES_INFO(ARG) \
341 ARG->print(OS, &getContext().getAsmInfo()); \
343 getContext().getAsmInfo().printExpr(OS, *ARG->getVariableValue()); \
344 Streamer.addBlankLine();
354 OS <<
"\t.amd_amdgpu_isa \"" <<
getTargetID() <<
"\"\n";
361 if (!Verifier.verify(HSAMetadataDoc.
getRoot()))
364 std::string HSAMetadataString;
366 HSAMetadataDoc.
toYAML(StrOS);
369 OS << StrOS.
str() <<
'\n';
375 const uint32_t Encoded_s_code_end = 0xbf9f0000;
376 const uint32_t Encoded_s_nop = 0xbf800000;
377 uint32_t Encoded_pad = Encoded_s_code_end;
387 Encoded_pad = Encoded_s_nop;
391 OS <<
"\t.p2alignl " << Log2CacheLineSize <<
", " << Encoded_pad <<
'\n';
392 OS <<
"\t.fill " << (FillSize / 4) <<
", 4, " << Encoded_pad <<
'\n';
400 const MCExpr *ReserveFlatScr) {
404 OS <<
"\t.amdhsa_kernel " << KernelName <<
'\n';
409 const MCExpr *ShiftedAndMaskedExpr =
421 OS <<
"\t\t.amdhsa_group_segment_fixed_size ";
425 OS <<
"\t\t.amdhsa_private_segment_fixed_size ";
429 OS <<
"\t\t.amdhsa_kernarg_size ";
435 amdhsa::COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT_SHIFT,
436 amdhsa::COMPUTE_PGM_RSRC2_GFX125_USER_SGPR_COUNT,
437 ".amdhsa_user_sgpr_count");
440 amdhsa::COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT_SHIFT,
441 amdhsa::COMPUTE_PGM_RSRC2_GFX6_GFX120_USER_SGPR_COUNT,
442 ".amdhsa_user_sgpr_count");
448 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT,
449 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER,
450 ".amdhsa_user_sgpr_private_segment_buffer");
452 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_SHIFT,
453 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR,
454 ".amdhsa_user_sgpr_dispatch_ptr");
456 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_SHIFT,
457 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR,
458 ".amdhsa_user_sgpr_queue_ptr");
460 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT,
461 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR,
462 ".amdhsa_user_sgpr_kernarg_segment_ptr");
464 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_SHIFT,
465 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID,
466 ".amdhsa_user_sgpr_dispatch_id");
469 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT,
470 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT,
471 ".amdhsa_user_sgpr_flat_scratch_init");
474 amdhsa::KERNARG_PRELOAD_SPEC_LENGTH,
475 ".amdhsa_user_sgpr_kernarg_preload_length");
477 amdhsa::KERNARG_PRELOAD_SPEC_OFFSET,
478 ".amdhsa_user_sgpr_kernarg_preload_offset");
482 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT,
483 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE,
484 ".amdhsa_user_sgpr_private_segment_size");
485 if (IVersion.
Major >= 10)
487 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_SHIFT,
488 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
489 ".amdhsa_wavefront_size32");
492 amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_SHIFT,
493 amdhsa::KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK,
494 ".amdhsa_uses_dynamic_stack");
496 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_SHIFT,
497 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT,
499 ?
".amdhsa_enable_private_segment"
500 :
".amdhsa_system_sgpr_private_segment_wavefront_offset"));
502 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT,
503 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X,
504 ".amdhsa_system_sgpr_workgroup_id_x");
506 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT,
507 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y,
508 ".amdhsa_system_sgpr_workgroup_id_y");
510 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT,
511 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z,
512 ".amdhsa_system_sgpr_workgroup_id_z");
514 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_SHIFT,
515 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO,
516 ".amdhsa_system_sgpr_workgroup_info");
518 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_SHIFT,
519 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID,
520 ".amdhsa_system_vgpr_workitem_id");
523 OS <<
"\t\t.amdhsa_next_free_vgpr ";
524 EmitMCExpr(NextVGPR);
527 OS <<
"\t\t.amdhsa_next_free_sgpr ";
528 EmitMCExpr(NextSGPR);
535 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT,
536 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET,
getContext());
541 OS <<
"\t\t.amdhsa_accum_offset ";
549 amdhsa::COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT_SHIFT,
550 amdhsa::COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT,
551 ".amdhsa_named_barrier_count");
553 OS <<
"\t\t.amdhsa_reserve_vcc ";
554 EmitMCExpr(ReserveVCC);
558 OS <<
"\t\t.amdhsa_reserve_flat_scratch ";
559 EmitMCExpr(ReserveFlatScr);
568 if (STI.
hasFeature(AMDGPU::FeatureSupportsXNACK)) {
571 OS <<
"\t\t.amdhsa_reserve_xnack_mask " << XnackOn <<
'\n';
577 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_SHIFT,
578 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32,
579 ".amdhsa_float_round_mode_32");
581 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_SHIFT,
582 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64,
583 ".amdhsa_float_round_mode_16_64");
585 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_SHIFT,
586 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32,
587 ".amdhsa_float_denorm_mode_32");
589 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_SHIFT,
590 amdhsa::COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64,
591 ".amdhsa_float_denorm_mode_16_64");
592 if (STI.
hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode)) {
594 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_SHIFT,
595 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP,
596 ".amdhsa_dx10_clamp");
598 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_SHIFT,
599 amdhsa::COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE,
600 ".amdhsa_ieee_mode");
602 if (IVersion.
Major >= 9) {
604 amdhsa::COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_SHIFT,
605 amdhsa::COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL,
606 ".amdhsa_fp16_overflow");
610 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_SHIFT,
611 amdhsa::COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT,
".amdhsa_tg_split");
614 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_SHIFT,
615 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE,
616 ".amdhsa_workgroup_processor_mode");
617 if (IVersion.
Major >= 10) {
619 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_SHIFT,
620 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED,
621 ".amdhsa_memory_ordered");
623 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_SHIFT,
624 amdhsa::COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS,
625 ".amdhsa_forward_progress");
627 if (IVersion.
Major >= 10 && IVersion.
Major < 12) {
629 amdhsa::COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_SHIFT,
630 amdhsa::COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT,
631 ".amdhsa_shared_vgpr_count");
633 if (IVersion.
Major == 11) {
635 amdhsa::COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_SHIFT,
636 amdhsa::COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE,
637 ".amdhsa_inst_pref_size");
639 if (IVersion.
Major >= 12) {
641 amdhsa::COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_SHIFT,
642 amdhsa::COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE,
643 ".amdhsa_inst_pref_size");
645 amdhsa::COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_SHIFT,
646 amdhsa::COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN,
647 ".amdhsa_round_robin_scheduling");
652 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT,
653 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION,
654 ".amdhsa_exception_fp_ieee_invalid_op");
657 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT,
658 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE,
659 ".amdhsa_exception_fp_denorm_src");
663 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT,
664 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO,
665 ".amdhsa_exception_fp_ieee_div_zero");
668 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT,
669 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW,
670 ".amdhsa_exception_fp_ieee_overflow");
673 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT,
674 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW,
675 ".amdhsa_exception_fp_ieee_underflow");
678 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT,
679 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT,
680 ".amdhsa_exception_fp_ieee_inexact");
683 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_SHIFT,
684 amdhsa::COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO,
685 ".amdhsa_exception_int_div_zero");
687 OS <<
"\t.end_amdhsa_kernel\n";
705 InfoScopeEmitter Emit) {
710 for (
const auto &[Func, Res] :
Data.Uses)
711 FuncUses[Func].push_back(Res);
712 for (
const auto &[Src, Dst] :
Data.Calls)
713 FuncCalls[Src].push_back(Dst);
714 for (
const auto &[Func, TypeId] :
Data.IndirectCalls)
715 FuncIndirectCalls[Func].push_back(TypeId);
716 for (
const auto &[Sym, TypeId] :
Data.TypeIds)
717 FuncTypeIds[Sym].push_back(TypeId);
721 if (!Emitted.insert(Sym).second)
725 if (
auto It = FuncUses.
find(Sym); It != FuncUses.
end())
727 if (
auto It = FuncCalls.
find(Sym); It != FuncCalls.
end())
729 if (
auto It = FuncIndirectCalls.
find(Sym); It != FuncIndirectCalls.
end())
730 IndirectCallTypeIds = It->second;
731 if (
auto It = FuncTypeIds.
find(Sym); It != FuncTypeIds.
end())
732 TypeIds = It->second;
733 Emit(Sym, Info,
Uses, Calls, IndirectCallTypeIds, TypeIds);
737 EmitIfNew(Func.Sym, &Func);
740 for (
const auto &[Sym, TypeId] :
Data.TypeIds)
741 EmitIfNew(Sym,
nullptr);
742 for (
const auto &[Sym, Res] :
Data.Uses)
743 EmitIfNew(Sym,
nullptr);
744 for (
const auto &[Sym, Dst] :
Data.Calls)
745 EmitIfNew(Sym,
nullptr);
746 for (
const auto &[Sym, TypeId] :
Data.IndirectCalls)
747 EmitIfNew(Sym,
nullptr);
758 OS <<
"\t.amdgpu_info " << Sym->
getName() <<
'\n';
763 if (Info->UsesFlatScratch)
765 if (Info->HasDynStack)
768 OS <<
"\t\t.amdgpu_num_sgpr " << Info->NumSGPR <<
'\n';
769 OS <<
"\t\t.amdgpu_num_vgpr " << Info->NumArchVGPR <<
'\n';
770 if (Info->NumAccVGPR)
771 OS <<
"\t\t.amdgpu_num_agpr " << Info->NumAccVGPR <<
'\n';
772 OS <<
"\t\t.amdgpu_private_segment_size " << Info->PrivateSegmentSize
776 OS <<
"\t\t.amdgpu_use " << Res->getName() <<
'\n';
778 OS <<
"\t\t.amdgpu_call " << Dst->getName() <<
'\n';
779 for (
StringRef TypeId : IndirectCallTypeIds)
780 OS <<
"\t\t.amdgpu_indirect_call \"" << TypeId <<
"\"\n";
782 OS <<
"\t\t.amdgpu_typeid \"" << TypeId <<
"\"\n";
783 OS <<
"\t.end_amdgpu_info\n\n";
804 W.setELFHeaderEFlags(getEFlags());
805 W.setOverrideABIVersion(
822void AMDGPUTargetELFStreamer::EmitNote(
826 auto &Context = S.getContext();
828 auto NameSZ = Name.size() + 1;
830 unsigned NoteFlags = 0;
840 S.emitValue(DescSZ, 4);
841 S.emitInt32(NoteType);
844 S.emitValueToAlignment(
Align(4), 0, 1, 0);
846 S.emitValueToAlignment(
Align(4), 0, 1, 0);
850unsigned AMDGPUTargetELFStreamer::getEFlags() {
855 return getEFlagsR600();
857 return getEFlagsAMDGCN();
861unsigned AMDGPUTargetELFStreamer::getEFlagsR600() {
867unsigned AMDGPUTargetELFStreamer::getEFlagsAMDGCN() {
868 assert(STI.getTargetTriple().isAMDGCN());
870 switch (STI.getTargetTriple().getOS()) {
875 return getEFlagsUnknownOS();
877 return getEFlagsAMDHSA();
879 return getEFlagsAMDPAL();
881 return getEFlagsMesa3D();
885unsigned AMDGPUTargetELFStreamer::getEFlagsUnknownOS() {
889 return getEFlagsV3();
892unsigned AMDGPUTargetELFStreamer::getEFlagsAMDHSA() {
896 return getEFlagsV6();
897 return getEFlagsV4();
900unsigned AMDGPUTargetELFStreamer::getEFlagsAMDPAL() {
903 return getEFlagsV3();
906unsigned AMDGPUTargetELFStreamer::getEFlagsMesa3D() {
909 return getEFlagsV3();
912unsigned AMDGPUTargetELFStreamer::getEFlagsV3() {
913 unsigned EFlagsV3 = 0;
928unsigned AMDGPUTargetELFStreamer::getEFlagsV4() {
929 unsigned EFlagsV4 = 0;
936 case AMDGPU::TargetIDSetting::Unsupported:
939 case AMDGPU::TargetIDSetting::Any:
942 case AMDGPU::TargetIDSetting::Off:
945 case AMDGPU::TargetIDSetting::On:
951 case AMDGPU::TargetIDSetting::Unsupported:
954 case AMDGPU::TargetIDSetting::Any:
957 case AMDGPU::TargetIDSetting::Off:
960 case AMDGPU::TargetIDSetting::On:
968unsigned AMDGPUTargetELFStreamer::getEFlagsV6() {
969 unsigned Flags = getEFlagsV4();
974 case AMDGPU::GK_GFX9_GENERIC:
977 case AMDGPU::GK_GFX9_4_GENERIC:
980 case AMDGPU::GK_GFX10_1_GENERIC:
983 case AMDGPU::GK_GFX10_3_GENERIC:
986 case AMDGPU::GK_GFX11_GENERIC:
989 case AMDGPU::GK_GFX11_7_GENERIC:
992 case AMDGPU::GK_GFX12_GENERIC:
995 case AMDGPU::GK_GFX12_5_GENERIC:
998 case AMDGPU::GK_GFX13_GENERIC:
1011 " - no ELF flag can represent this version!");
1036 auto *SymbolELF =
static_cast<MCSymbolELF *
>(Symbol);
1039 if (!SymbolELF->isBindingSet())
1042 if (SymbolELF->declareCommon(
Size, Alignment)) {
1044 " redeclared as different type");
1055 auto *DescBegin = Context.createTempSymbol();
1056 auto *DescEnd = Context.createTempSymbol();
1078 if (!Verifier.verify(HSAMetadataDoc.
getRoot()))
1081 std::string HSAMetadataString;
1087 auto *DescBegin = Context.createTempSymbol();
1088 auto *DescEnd = Context.createTempSymbol();
1103 const uint32_t Encoded_s_code_end = 0xbf9f0000;
1104 const uint32_t Encoded_s_nop = 0xbf800000;
1105 uint32_t Encoded_pad = Encoded_s_code_end;
1115 Encoded_pad = Encoded_s_nop;
1122 for (
unsigned I = 0;
I < FillSize;
I += 4)
1132 const MCExpr *ReserveFlatScr) {
1134 auto &Context = Streamer.getContext();
1136 auto *KernelCodeSymbol =
1138 auto *KernelDescriptorSymbol =
static_cast<MCSymbolELF *
>(
1139 Context.getOrCreateSymbol(
Twine(KernelName) +
Twine(
".kd")));
1143 KernelDescriptorSymbol->
setBinding(KernelCodeSymbol->getBinding());
1144 KernelDescriptorSymbol->setOther(KernelCodeSymbol->getOther());
1145 KernelDescriptorSymbol->setVisibility(KernelCodeSymbol->getVisibility());
1148 KernelDescriptorSymbol->setSize(
1156 Streamer.emitLabel(KernelDescriptorSymbol);
1167 Streamer.emitInt8(0u);
1180 Streamer.emitInt8(0u);
1193 Streamer.emitInt8(0u);
1205 return StrTab.
add(Str);
1235 if (Info->UsesFlatScratch)
1237 if (Info->HasDynStack)
1244 if (Info->NumAccVGPR)
1247 Info->PrivateSegmentSize);
1254 for (
StringRef TypeId : IndirectCallTypeIds) {
1256 getOrAddString(TypeId));
1262 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< 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
static StringRef getArchNameFromElfMach(unsigned ElfMach)
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.
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
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.
LLVM_ABI StringRef getArchNameR600(GPUKind AK)
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....
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.
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.
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