39 ExceptionModel = TT.getDefaultExceptionHandling();
41 initLibcalls(TT, ExceptionModel,
FloatABI, EABIVersion, ABIName);
46 for (RTLIB::LibcallImpl Impl :
47 {RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,
48 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,
49 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,
50 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,
51 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,
52 RTLIB::impl__ZGVsNxvl4l4_sincospif,
53 RTLIB::impl__ZGVsNxvl8l8_sincospi})
57 for (RTLIB::LibcallImpl Impl :
58 {RTLIB::impl_armpl_vmodfq_f64, RTLIB::impl_armpl_vmodfq_f32,
59 RTLIB::impl_armpl_svmodf_f64_x, RTLIB::impl_armpl_svmodf_f32_x,
60 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
61 RTLIB::impl_armpl_svsincos_f64_x, RTLIB::impl_armpl_svsincos_f32_x,
62 RTLIB::impl_armpl_vsincospiq_f32, RTLIB::impl_armpl_vsincospiq_f64,
63 RTLIB::impl_armpl_svsincospi_f32_x,
64 RTLIB::impl_armpl_svsincospi_f64_x})
67 for (RTLIB::LibcallImpl Impl :
68 {RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32})
143 RTLIB::LibcallImpl LibcallImpl)
const {
146 Attribute::MustProgress, Attribute::NoCallback, Attribute::NoFree,
147 Attribute::NoSync, Attribute::NoUnwind, Attribute::WillReturn};
149 Attribute::MustProgress, Attribute::NoUnwind, Attribute::WillReturn};
151 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
153 switch (LibcallImpl) {
154 case RTLIB::impl___sincos_stret:
155 case RTLIB::impl___sincosf_stret: {
156 if (!darwinHasSinCosStret(TT))
159 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
163 AttrBuilder FuncAttrBuilder(Ctx);
165 FuncAttrBuilder.addAttribute(Attr);
168 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
175 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
178 AttrBuilder AttrBuilder(Ctx);
180 AttrBuilder.addStructRetAttr(StructTy);
181 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
185 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
189 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
195 case RTLIB::impl_malloc:
196 case RTLIB::impl_calloc: {
197 AttrBuilder FuncAttrBuilder(Ctx);
199 FuncAttrBuilder.addAttribute(Attr);
200 FuncAttrBuilder.addAttribute(Attribute::NoFree);
203 if (LibcallImpl == RTLIB::impl_malloc)
207 FuncAttrBuilder.addAllocKindAttr(AllocKind);
208 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
209 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
211 : std::make_optional(1));
214 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
217 AttrBuilder ArgAttrBuilder(Ctx);
219 ArgAttrBuilder.addAttribute(AK);
221 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
222 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
223 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
224 if (LibcallImpl == RTLIB::impl_calloc)
225 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
231 if (LibcallImpl == RTLIB::impl_calloc)
236 case RTLIB::impl_free: {
238 AttrBuilder FuncAttrBuilder(Ctx);
240 FuncAttrBuilder.addAttribute(Attr);
243 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
246 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
249 AttrBuilder ArgAttrBuilder(Ctx);
250 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
251 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
253 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
260 case RTLIB::impl_sqrtf:
261 case RTLIB::impl_sqrt: {
262 AttrBuilder FuncAttrBuilder(Ctx);
265 FuncAttrBuilder.addAttribute(Attr);
269 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
275 Attrs = Attrs.addRetAttribute(
278 return {FuncTy, Attrs};
280 case RTLIB::impl__ZGVnN2vl8_modf:
281 case RTLIB::impl__ZGVnN4vl4_modff:
282 case RTLIB::impl__ZGVsNxvl8_modf:
283 case RTLIB::impl__ZGVsNxvl4_modff:
284 case RTLIB::impl_armpl_vmodfq_f64:
285 case RTLIB::impl_armpl_vmodfq_f32:
286 case RTLIB::impl_armpl_svmodf_f64_x:
287 case RTLIB::impl_armpl_svmodf_f32_x: {
288 AttrBuilder FuncAttrBuilder(Ctx);
290 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
291 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
292 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
293 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
295 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
296 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
297 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
298 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
301 unsigned EC = IsF32 ? 4 : 2;
305 FuncAttrBuilder.addAttribute(Attr);
309 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
312 AttrBuilder ArgAttrBuilder(Ctx);
314 ArgAttrBuilder.addAttribute(AK);
315 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
316 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
326 case RTLIB::impl__ZGVnN2vl8l8_sincos:
327 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
328 case RTLIB::impl__ZGVsNxvl8l8_sincos:
329 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
330 case RTLIB::impl_armpl_vsincosq_f64:
331 case RTLIB::impl_armpl_vsincosq_f32:
332 case RTLIB::impl_armpl_svsincos_f64_x:
333 case RTLIB::impl_armpl_svsincos_f32_x:
334 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
335 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
336 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
337 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
338 case RTLIB::impl_armpl_vsincospiq_f32:
339 case RTLIB::impl_armpl_vsincospiq_f64:
340 case RTLIB::impl_armpl_svsincospi_f32_x:
341 case RTLIB::impl_armpl_svsincospi_f64_x: {
342 AttrBuilder FuncAttrBuilder(Ctx);
344 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
345 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
346 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
347 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
348 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
349 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
350 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
351 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
354 unsigned EC = IsF32 ? 4 : 2;
356 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
357 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
358 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
359 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
360 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
361 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
362 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
363 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
367 FuncAttrBuilder.addAttribute(Attr);
371 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
374 AttrBuilder ArgAttrBuilder(Ctx);
376 ArgAttrBuilder.addAttribute(AK);
377 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
378 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
379 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);