LLVM 24.0.0git
TargetLibraryInfo.cpp
Go to the documentation of this file.
1//===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the TargetLibraryInfo class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/DenseMap.h"
17#include "llvm/IR/Module.h"
22using namespace llvm;
23
24#define GET_TARGET_LIBRARY_INFO_STRING_TABLE
25#include "llvm/Analysis/TargetLibraryInfo.inc"
26
28 assert(!VectorFnName.empty() && "Vector function name must not be empty.");
29 SmallString<256> Buffer;
30 llvm::raw_svector_ostream Out(Buffer);
31 Out << VABIPrefix << "_" << ScalarFnName << "(" << VectorFnName << ")";
32 return std::string(Out.str());
33}
34
35#define GET_TARGET_LIBRARY_INFO_SIGNATURE_TABLE
36#include "llvm/Analysis/TargetLibraryInfo.inc"
37
38static bool hasSinCosPiStret(const Triple &T) {
39 // Only Darwin variants have _stret versions of combined trig functions.
40 if (!T.isOSDarwin())
41 return false;
42
43 // The ABI is rather complicated on x86, so don't do anything special there.
44 if (T.getArch() == Triple::x86)
45 return false;
46
47 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
48 return false;
49
50 if (T.isiOS() && T.isOSVersionLT(7, 0))
51 return false;
52
53 return true;
54}
55
56static bool hasBcmp(const Triple &TT) {
57 // Posix removed support from bcmp() in 2001, but the glibc and several
58 // implementations of the libc still have it.
59 if (TT.isOSLinux())
60 return TT.isGNUEnvironment() || TT.isMusl();
61 // Both NetBSD and OpenBSD are planning to remove the function. Windows does
62 // not have it.
63 return TT.isOSFreeBSD() || TT.isOSSolaris();
64}
65
67 FunctionType *FuncTy) {
68 switch (CC) {
69 default:
70 return false;
72 return true;
76
77 // The iOS ABI diverges from the standard in some cases, so for now don't
78 // try to simplify those calls.
79 if (TT.isiOS())
80 return false;
81
82 if (!FuncTy->getReturnType()->isPointerTy() &&
83 !FuncTy->getReturnType()->isIntegerTy() &&
84 !FuncTy->getReturnType()->isVoidTy())
85 return false;
86
87 for (auto *Param : FuncTy->params()) {
88 if (!Param->isPointerTy() && !Param->isIntegerTy())
89 return false;
90 }
91 return true;
92 }
93 }
94 return false;
95}
96
98 return ::isCallingConvCCompatible(CI->getCallingConv(),
100 CI->getFunctionType());
101}
102
104 return ::isCallingConvCCompatible(F->getCallingConv(),
105 F->getParent()->getTargetTriple(),
106 F->getFunctionType());
107}
108
110 bool &ShouldExtI32Return,
111 bool &ShouldSignExtI32Param,
112 bool &ShouldSignExtI32Return,
113 const Triple &T) {
115 ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param,
116 ShouldSignExtI32Return, T);
117}
118
120 bool &ShouldZExtBoolReturn,
121 const Triple &T) {
123 ShouldZExtBoolParam, ShouldZExtBoolReturn, T);
124}
125
127 bool ShouldExtI32Param, ShouldExtI32Return;
128 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
130 ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param,
131 ShouldSignExtI32Return, T);
132 TLI.setShouldExtI32Param(ShouldExtI32Param);
133 TLI.setShouldExtI32Return(ShouldExtI32Return);
134 TLI.setShouldSignExtI32Param(ShouldSignExtI32Param);
135 TLI.setShouldSignExtI32Return(ShouldSignExtI32Return);
136
137 // Let's assume by default that the size of int is 32 bits, unless the target
138 // is a 16-bit architecture because then it most likely is 16 bits. If that
139 // isn't true for a target those defaults should be overridden below.
140 TLI.setIntSize(T.isArch16Bit() ? 16 : 32);
141}
142
143/// Initialize the set of available library functions based on the specified
144/// target triple. This should be carefully written so that a missing target
145/// triple gets a sane set of defaults.
147 const llvm::StringTable &StandardNames,
148 VectorLibrary VecLib) {
149 // Set IO unlocked variants as unavailable
150 // Set them as available per system below
151 TLI.setUnavailable(LibFunc_getc_unlocked);
152 TLI.setUnavailable(LibFunc_getchar_unlocked);
153 TLI.setUnavailable(LibFunc_putc_unlocked);
154 TLI.setUnavailable(LibFunc_putchar_unlocked);
155 TLI.setUnavailable(LibFunc_fputc_unlocked);
156 TLI.setUnavailable(LibFunc_fgetc_unlocked);
157 TLI.setUnavailable(LibFunc_fread_unlocked);
158 TLI.setUnavailable(LibFunc_fwrite_unlocked);
159 TLI.setUnavailable(LibFunc_fputs_unlocked);
160 TLI.setUnavailable(LibFunc_fgets_unlocked);
161
162 // There is really no runtime library on AMDGPU.
163 if (T.isAMDGPU()) {
164 TLI.disableAllFunctions();
165 return;
166 }
167
168 // DXIL does not support libcalls, and disabling them here prevents a number
169 // of passes from introducing libcalls into DXIL which would otherwise
170 // complicate lowering/legalization
171 if (T.isDXIL()) {
172 TLI.disableAllFunctions();
173 return;
174 }
175
176 // memset_pattern{4,8,16} is only available on iOS 3.0 and Mac OS X 10.5 and
177 // later. All versions of watchOS support it.
178 if (T.isMacOSX()) {
179 // available IO unlocked variants on Mac OS X
180 TLI.setAvailable(LibFunc_getc_unlocked);
181 TLI.setAvailable(LibFunc_getchar_unlocked);
182 TLI.setAvailable(LibFunc_putc_unlocked);
183 TLI.setAvailable(LibFunc_putchar_unlocked);
184 TLI.setUnavailable(LibFunc_memrchr);
185
186 if (T.isMacOSXVersionLT(10, 5)) {
187 TLI.setUnavailable(LibFunc_memset_pattern4);
188 TLI.setUnavailable(LibFunc_memset_pattern8);
189 TLI.setUnavailable(LibFunc_memset_pattern16);
190 }
191 } else if (T.isiOS()) {
192 if (T.isOSVersionLT(3, 0)) {
193 TLI.setUnavailable(LibFunc_memset_pattern4);
194 TLI.setUnavailable(LibFunc_memset_pattern8);
195 TLI.setUnavailable(LibFunc_memset_pattern16);
196 }
197 } else if (!T.isWatchOS()) {
198 TLI.setUnavailable(LibFunc_memset_pattern4);
199 TLI.setUnavailable(LibFunc_memset_pattern8);
200 TLI.setUnavailable(LibFunc_memset_pattern16);
201 }
202
203 if (!hasSinCosPiStret(T)) {
204 TLI.setUnavailable(LibFunc_sinpi);
205 TLI.setUnavailable(LibFunc_sinpif);
206 TLI.setUnavailable(LibFunc_cospi);
207 TLI.setUnavailable(LibFunc_cospif);
208 TLI.setUnavailable(LibFunc_sincos_stret);
209 TLI.setUnavailable(LibFunc_sincosf_stret);
210 TLI.setUnavailable(LibFunc_sincospi_stret);
211 TLI.setUnavailable(LibFunc_sincospif_stret);
212 }
213
214 if (!hasBcmp(T))
215 TLI.setUnavailable(LibFunc_bcmp);
216
217 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
218 !T.isMacOSXVersionLT(10, 7)) {
219 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
220 // we don't care about) have two versions; on recent OSX, the one we want
221 // has a $UNIX2003 suffix. The two implementations are identical except
222 // for the return value in some edge cases. However, we don't want to
223 // generate code that depends on the old symbols.
224 TLI.setAvailableWithName(LibFunc_fwrite, "fwrite$UNIX2003");
225 TLI.setAvailableWithName(LibFunc_fputs, "fputs$UNIX2003");
226 }
227
228 // iprintf and friends are only available on XCore, TCE, and Emscripten.
229 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce &&
230 T.getOS() != Triple::Emscripten) {
231 TLI.setUnavailable(LibFunc_iprintf);
232 TLI.setUnavailable(LibFunc_siprintf);
233 TLI.setUnavailable(LibFunc_fiprintf);
234 }
235
236 // __small_printf and friends are only available on Emscripten.
237 if (T.getOS() != Triple::Emscripten) {
238 TLI.setUnavailable(LibFunc_small_printf);
239 TLI.setUnavailable(LibFunc_small_sprintf);
240 TLI.setUnavailable(LibFunc_small_fprintf);
241 }
242
243 if (T.isOSWindows() && !T.isOSCygMing()) {
244 // XXX: The earliest documentation available at the moment is for VS2015/VC19:
245 // https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
246 // XXX: In order to use an MSVCRT older than VC19,
247 // the specific library version must be explicit in the target triple,
248 // e.g., x86_64-pc-windows-msvc18.
249 bool hasPartialC99 = true;
250 if (T.isKnownWindowsMSVCEnvironment()) {
251 VersionTuple Version = T.getEnvironmentVersion();
252 hasPartialC99 = (Version.getMajor() == 0 || Version.getMajor() >= 19);
253 }
254
255 // Latest targets support C89 math functions, in part.
256 bool isARM = (T.getArch() == Triple::aarch64 ||
257 T.getArch() == Triple::arm);
258 bool hasPartialFloat = (isARM ||
259 T.getArch() == Triple::x86_64);
260
261 // Win32 does not support float C89 math functions, in general.
262 if (!hasPartialFloat) {
263 TLI.setUnavailable(LibFunc_acosf);
264 TLI.setUnavailable(LibFunc_asinf);
265 TLI.setUnavailable(LibFunc_atan2f);
266 TLI.setUnavailable(LibFunc_atanf);
267 TLI.setUnavailable(LibFunc_ceilf);
268 TLI.setUnavailable(LibFunc_cosf);
269 TLI.setUnavailable(LibFunc_coshf);
270 TLI.setUnavailable(LibFunc_expf);
271 TLI.setUnavailable(LibFunc_floorf);
272 TLI.setUnavailable(LibFunc_fmodf);
273 TLI.setUnavailable(LibFunc_hypotf);
274 TLI.setUnavailable(LibFunc_log10f);
275 TLI.setUnavailable(LibFunc_logf);
276 TLI.setUnavailable(LibFunc_modff);
277 TLI.setUnavailable(LibFunc_powf);
278 TLI.setUnavailable(LibFunc_remainderf);
279 TLI.setUnavailable(LibFunc_remquof);
280 TLI.setUnavailable(LibFunc_fdimf);
281 TLI.setUnavailable(LibFunc_sinf);
282 TLI.setUnavailable(LibFunc_sinhf);
283 TLI.setUnavailable(LibFunc_sqrtf);
284 TLI.setUnavailable(LibFunc_tanf);
285 TLI.setUnavailable(LibFunc_tanhf);
286 }
287 if (!isARM)
288 TLI.setUnavailable(LibFunc_fabsf);
289 TLI.setUnavailable(LibFunc_frexpf);
290 TLI.setUnavailable(LibFunc_ldexpf);
291
292 // Win32 does not support long double C89 math functions.
293 TLI.setUnavailable(LibFunc_acosl);
294 TLI.setUnavailable(LibFunc_asinl);
295 TLI.setUnavailable(LibFunc_atan2l);
296 TLI.setUnavailable(LibFunc_atanl);
297 TLI.setUnavailable(LibFunc_ceill);
298 TLI.setUnavailable(LibFunc_cosl);
299 TLI.setUnavailable(LibFunc_coshl);
300 TLI.setUnavailable(LibFunc_expl);
301 TLI.setUnavailable(LibFunc_fabsl);
302 TLI.setUnavailable(LibFunc_floorl);
303 TLI.setUnavailable(LibFunc_fmodl);
304 TLI.setUnavailable(LibFunc_frexpl);
305 TLI.setUnavailable(LibFunc_hypotl);
306 TLI.setUnavailable(LibFunc_ldexpl);
307 TLI.setUnavailable(LibFunc_log10l);
308 TLI.setUnavailable(LibFunc_logl);
309 TLI.setUnavailable(LibFunc_modfl);
310 TLI.setUnavailable(LibFunc_powl);
311 TLI.setUnavailable(LibFunc_remainderl);
312 TLI.setUnavailable(LibFunc_remquol);
313 TLI.setUnavailable(LibFunc_fdiml);
314 TLI.setUnavailable(LibFunc_sinl);
315 TLI.setUnavailable(LibFunc_sinhl);
316 TLI.setUnavailable(LibFunc_sqrtl);
317 TLI.setUnavailable(LibFunc_tanl);
318 TLI.setUnavailable(LibFunc_tanhl);
319
320 // Win32 does not fully support C99 math functions.
321 if (!hasPartialC99) {
322 TLI.setUnavailable(LibFunc_acosh);
323 TLI.setUnavailable(LibFunc_acoshf);
324 TLI.setUnavailable(LibFunc_asinh);
325 TLI.setUnavailable(LibFunc_asinhf);
326 TLI.setUnavailable(LibFunc_atanh);
327 TLI.setUnavailable(LibFunc_atanhf);
328 TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
329 TLI.setUnavailable(LibFunc_cabsf);
330 TLI.setUnavailable(LibFunc_cbrt);
331 TLI.setUnavailable(LibFunc_cbrtf);
332 TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
333 TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
334 TLI.setUnavailable(LibFunc_exp2);
335 TLI.setUnavailable(LibFunc_exp2f);
336 TLI.setUnavailable(LibFunc_expm1);
337 TLI.setUnavailable(LibFunc_expm1f);
338 TLI.setUnavailable(LibFunc_fmax);
339 TLI.setUnavailable(LibFunc_fmaxf);
340 TLI.setUnavailable(LibFunc_fmin);
341 TLI.setUnavailable(LibFunc_fminf);
342 TLI.setUnavailable(LibFunc_log1p);
343 TLI.setUnavailable(LibFunc_log1pf);
344 TLI.setUnavailable(LibFunc_log2);
345 TLI.setUnavailable(LibFunc_log2f);
346 TLI.setAvailableWithName(LibFunc_logb, "_logb");
347 TLI.setUnavailable(LibFunc_ilogb);
348 TLI.setUnavailable(LibFunc_ilogbf);
349 if (hasPartialFloat)
350 TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
351 else
352 TLI.setUnavailable(LibFunc_logbf);
353 TLI.setUnavailable(LibFunc_nextafter);
354 TLI.setUnavailable(LibFunc_nextafterf);
355 TLI.setUnavailable(LibFunc_nexttoward);
356 TLI.setUnavailable(LibFunc_nexttowardf);
357 TLI.setUnavailable(LibFunc_rint);
358 TLI.setUnavailable(LibFunc_rintf);
359 TLI.setUnavailable(LibFunc_round);
360 TLI.setUnavailable(LibFunc_roundf);
361 TLI.setUnavailable(LibFunc_scalbln);
362 TLI.setUnavailable(LibFunc_scalblnf);
363 TLI.setUnavailable(LibFunc_scalblnl);
364 TLI.setUnavailable(LibFunc_scalbn);
365 TLI.setUnavailable(LibFunc_scalbnf);
366 TLI.setUnavailable(LibFunc_scalbnl);
367 TLI.setUnavailable(LibFunc_trunc);
368 TLI.setUnavailable(LibFunc_truncf);
369 }
370
371 // Win32 does not support long double C99 math functions.
372 TLI.setUnavailable(LibFunc_acoshl);
373 TLI.setUnavailable(LibFunc_asinhl);
374 TLI.setUnavailable(LibFunc_atanhl);
375 TLI.setUnavailable(LibFunc_cabsl);
376 TLI.setUnavailable(LibFunc_cbrtl);
377 TLI.setUnavailable(LibFunc_copysignl);
378 TLI.setUnavailable(LibFunc_exp2l);
379 TLI.setUnavailable(LibFunc_expm1l);
380 TLI.setUnavailable(LibFunc_fmaxl);
381 TLI.setUnavailable(LibFunc_fminl);
382 TLI.setUnavailable(LibFunc_log1pl);
383 TLI.setUnavailable(LibFunc_log2l);
384 TLI.setUnavailable(LibFunc_logbl);
385 TLI.setUnavailable(LibFunc_ilogbl);
386 TLI.setUnavailable(LibFunc_nearbyintl);
387 TLI.setUnavailable(LibFunc_nextafterl);
388 TLI.setUnavailable(LibFunc_nexttowardl);
389 TLI.setUnavailable(LibFunc_rintl);
390 TLI.setUnavailable(LibFunc_roundl);
391 TLI.setUnavailable(LibFunc_scalblnl);
392 TLI.setUnavailable(LibFunc_scalbnl);
393 TLI.setUnavailable(LibFunc_truncl);
394
395 // Win32 does not support these functions, but
396 // they are generally available on POSIX-compliant systems.
397 TLI.setUnavailable(LibFunc_access);
398 TLI.setUnavailable(LibFunc_chmod);
399 TLI.setUnavailable(LibFunc_closedir);
400 TLI.setUnavailable(LibFunc_fdopen);
401 TLI.setUnavailable(LibFunc_fileno);
402 TLI.setUnavailable(LibFunc_fseeko);
403 TLI.setUnavailable(LibFunc_fstat);
404 TLI.setUnavailable(LibFunc_ftello);
405 TLI.setUnavailable(LibFunc_gettimeofday);
406 TLI.setUnavailable(LibFunc_memccpy);
407 TLI.setUnavailable(LibFunc_mkdir);
408 TLI.setUnavailable(LibFunc_open);
409 TLI.setUnavailable(LibFunc_opendir);
410 TLI.setUnavailable(LibFunc_pclose);
411 TLI.setUnavailable(LibFunc_popen);
412 TLI.setUnavailable(LibFunc_read);
413 TLI.setUnavailable(LibFunc_rmdir);
414 TLI.setUnavailable(LibFunc_stat);
415 TLI.setUnavailable(LibFunc_strcasecmp);
416 TLI.setUnavailable(LibFunc_strncasecmp);
417 TLI.setUnavailable(LibFunc_unlink);
418 TLI.setUnavailable(LibFunc_utime);
419 TLI.setUnavailable(LibFunc_write);
420 }
421
422 if (T.isOSWindows() && !T.isWindowsCygwinEnvironment()) {
423 // These functions aren't available in either MSVC or MinGW environments.
424 TLI.setUnavailable(LibFunc_bcmp);
425 TLI.setUnavailable(LibFunc_bcopy);
426 TLI.setUnavailable(LibFunc_bzero);
427 TLI.setUnavailable(LibFunc_chown);
428 TLI.setUnavailable(LibFunc_ctermid);
429 TLI.setUnavailable(LibFunc_ffs);
430 TLI.setUnavailable(LibFunc_flockfile);
431 TLI.setUnavailable(LibFunc_fstatvfs);
432 TLI.setUnavailable(LibFunc_ftrylockfile);
433 TLI.setUnavailable(LibFunc_funlockfile);
434 TLI.setUnavailable(LibFunc_getitimer);
435 TLI.setUnavailable(LibFunc_getlogin_r);
436 TLI.setUnavailable(LibFunc_getpwnam);
437 TLI.setUnavailable(LibFunc_htonl);
438 TLI.setUnavailable(LibFunc_htons);
439 TLI.setUnavailable(LibFunc_lchown);
440 TLI.setUnavailable(LibFunc_lstat);
441 TLI.setUnavailable(LibFunc_memrchr);
442 TLI.setUnavailable(LibFunc_ntohl);
443 TLI.setUnavailable(LibFunc_ntohs);
444 TLI.setUnavailable(LibFunc_pread);
445 TLI.setUnavailable(LibFunc_pwrite);
446 TLI.setUnavailable(LibFunc_readlink);
447 TLI.setUnavailable(LibFunc_realpath);
448 TLI.setUnavailable(LibFunc_setitimer);
449 TLI.setUnavailable(LibFunc_statvfs);
450 TLI.setUnavailable(LibFunc_stpcpy);
451 TLI.setUnavailable(LibFunc_stpncpy);
452 TLI.setUnavailable(LibFunc_times);
453 TLI.setUnavailable(LibFunc_uname);
454 TLI.setUnavailable(LibFunc_unsetenv);
455 TLI.setUnavailable(LibFunc_utimes);
456
457 // MinGW does have ldexpf, but it is a plain wrapper over regular ldexp.
458 // Therefore it's not beneficial to transform code to use it, i.e.
459 // just pretend that the function is not available.
460 TLI.setUnavailable(LibFunc_ldexpf);
461 }
462
463 // Pick just one set of new/delete variants.
464 if (T.isOSMSVCRT()) {
465 // MSVC, doesn't have the Itanium new/delete.
466 TLI.setUnavailable(LibFunc_ZdaPv);
467 TLI.setUnavailable(LibFunc_ZdaPvRKSt9nothrow_t);
468 TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_t);
469 TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t);
470 TLI.setUnavailable(LibFunc_ZdaPvj);
471 TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
472 TLI.setUnavailable(LibFunc_ZdaPvm);
473 TLI.setUnavailable(LibFunc_ZdaPvmSt11align_val_t);
474 TLI.setUnavailable(LibFunc_ZdlPv);
475 TLI.setUnavailable(LibFunc_ZdlPvRKSt9nothrow_t);
476 TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_t);
477 TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t);
478 TLI.setUnavailable(LibFunc_ZdlPvj);
479 TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
480 TLI.setUnavailable(LibFunc_ZdlPvm);
481 TLI.setUnavailable(LibFunc_ZdlPvmSt11align_val_t);
482 TLI.setUnavailable(LibFunc_Znaj);
483 TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
484 TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
485 TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
486 TLI.setUnavailable(LibFunc_Znam);
487 TLI.setUnavailable(LibFunc_ZnamRKSt9nothrow_t);
488 TLI.setUnavailable(LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t);
489 TLI.setUnavailable(LibFunc_ZnamSt11align_val_t);
490 TLI.setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t);
491 TLI.setUnavailable(LibFunc_Znwj);
492 TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
493 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
494 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
495 TLI.setUnavailable(LibFunc_Znwm);
496 TLI.setUnavailable(LibFunc_ZnwmRKSt9nothrow_t);
497 TLI.setUnavailable(LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t);
498 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_t);
499 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t);
500 TLI.setUnavailable(LibFunc_Znwm12__hot_cold_t);
501 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_t12__hot_cold_t);
502 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t);
503 TLI.setUnavailable(LibFunc_Znam12__hot_cold_t);
504 TLI.setUnavailable(LibFunc_ZnamSt11align_val_t12__hot_cold_t);
505 TLI.setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t);
506 TLI.setUnavailable(LibFunc_size_returning_new);
507 TLI.setUnavailable(LibFunc_size_returning_new_hot_cold);
508 TLI.setUnavailable(LibFunc_size_returning_new_aligned);
509 TLI.setUnavailable(LibFunc_size_returning_new_aligned_hot_cold);
510 } else {
511 // Not MSVC, assume it's Itanium.
512 TLI.setUnavailable(LibFunc_msvc_new_int);
513 TLI.setUnavailable(LibFunc_msvc_new_int_nothrow);
514 TLI.setUnavailable(LibFunc_msvc_new_longlong);
515 TLI.setUnavailable(LibFunc_msvc_new_longlong_nothrow);
516 TLI.setUnavailable(LibFunc_msvc_delete_ptr32);
517 TLI.setUnavailable(LibFunc_msvc_delete_ptr32_nothrow);
518 TLI.setUnavailable(LibFunc_msvc_delete_ptr32_int);
519 TLI.setUnavailable(LibFunc_msvc_delete_ptr64);
520 TLI.setUnavailable(LibFunc_msvc_delete_ptr64_nothrow);
521 TLI.setUnavailable(LibFunc_msvc_delete_ptr64_longlong);
522 TLI.setUnavailable(LibFunc_msvc_new_array_int);
523 TLI.setUnavailable(LibFunc_msvc_new_array_int_nothrow);
524 TLI.setUnavailable(LibFunc_msvc_new_array_longlong);
525 TLI.setUnavailable(LibFunc_msvc_new_array_longlong_nothrow);
526 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32);
527 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_nothrow);
528 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_int);
529 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64);
530 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_nothrow);
531 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_longlong);
532 }
533
534 switch (T.getOS()) {
535 case Triple::MacOSX:
536 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
537 // and their names are __exp10 and __exp10f. exp10l is not available on
538 // OS X or iOS.
539 TLI.setUnavailable(LibFunc_exp10l);
540 if (T.isMacOSXVersionLT(10, 9)) {
541 TLI.setUnavailable(LibFunc_exp10);
542 TLI.setUnavailable(LibFunc_exp10f);
543 } else {
544 TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
545 TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
546 }
547 break;
548 case Triple::IOS:
549 case Triple::TvOS:
550 case Triple::WatchOS:
551 case Triple::XROS:
552 TLI.setUnavailable(LibFunc_exp10l);
553 if (!T.isWatchOS() &&
554 (T.isOSVersionLT(7, 0) || (T.isOSVersionLT(9, 0) && T.isX86()))) {
555 TLI.setUnavailable(LibFunc_exp10);
556 TLI.setUnavailable(LibFunc_exp10f);
557 } else {
558 TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
559 TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
560 }
561 break;
562 case Triple::Linux:
563 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
564 // buggy prior to glibc version 2.18. Until this version is widely deployed
565 // or we have a reasonable detection strategy, we cannot use exp10 reliably
566 // on Linux.
567 //
568 // Fall through to disable all of them.
569 [[fallthrough]];
570 default:
571 TLI.setUnavailable(LibFunc_exp10);
572 TLI.setUnavailable(LibFunc_exp10f);
573 TLI.setUnavailable(LibFunc_exp10l);
574 }
575
576 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
577 // Linux (GLIBC):
578 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
579 // http://svn.freebsd.org/base/head/lib/libc/string/ffsl.c
580 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
581 switch (T.getOS()) {
582 case Triple::Darwin:
583 case Triple::MacOSX:
584 case Triple::IOS:
585 case Triple::TvOS:
586 case Triple::WatchOS:
587 case Triple::XROS:
588 case Triple::FreeBSD:
589 case Triple::Linux:
590 break;
591 default:
592 TLI.setUnavailable(LibFunc_ffsl);
593 }
594
595 // ffsll is available on at least FreeBSD and Linux (GLIBC):
596 // http://svn.freebsd.org/base/head/lib/libc/string/ffsll.c
597 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
598 switch (T.getOS()) {
599 case Triple::Darwin:
600 case Triple::MacOSX:
601 case Triple::IOS:
602 case Triple::TvOS:
603 case Triple::WatchOS:
604 case Triple::XROS:
605 case Triple::FreeBSD:
606 case Triple::Linux:
607 break;
608 default:
609 TLI.setUnavailable(LibFunc_ffsll);
610 }
611
612 // The following functions are available on at least FreeBSD:
613 // http://svn.freebsd.org/base/head/lib/libc/string/fls.c
614 // http://svn.freebsd.org/base/head/lib/libc/string/flsl.c
615 // http://svn.freebsd.org/base/head/lib/libc/string/flsll.c
616 if (!T.isOSFreeBSD()) {
617 TLI.setUnavailable(LibFunc_fls);
618 TLI.setUnavailable(LibFunc_flsl);
619 TLI.setUnavailable(LibFunc_flsll);
620 }
621
622 // The following functions are only available on GNU/Linux (using glibc).
623 // Linux variants without glibc (eg: bionic, musl) may have some subset.
624 if (!T.isOSLinux() || !T.isGNUEnvironment()) {
625 TLI.setUnavailable(LibFunc_dunder_strdup);
626 TLI.setUnavailable(LibFunc_dunder_strtok_r);
627 TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
628 TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
629 TLI.setUnavailable(LibFunc_under_IO_getc);
630 TLI.setUnavailable(LibFunc_under_IO_putc);
631 // But, Android and musl have memalign.
632 if (!T.isAndroid() && !T.isMusl())
633 TLI.setUnavailable(LibFunc_memalign);
634 TLI.setUnavailable(LibFunc_fopen64);
635 TLI.setUnavailable(LibFunc_fseeko64);
636 TLI.setUnavailable(LibFunc_fstat64);
637 TLI.setUnavailable(LibFunc_fstatvfs64);
638 TLI.setUnavailable(LibFunc_ftello64);
639 TLI.setUnavailable(LibFunc_lstat64);
640 TLI.setUnavailable(LibFunc_open64);
641 TLI.setUnavailable(LibFunc_stat64);
642 TLI.setUnavailable(LibFunc_statvfs64);
643 TLI.setUnavailable(LibFunc_tmpfile64);
644
645 // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
646 // Note that math-finite.h is no longer supported by top-of-tree GLIBC,
647 // so we keep these functions around just so that they're recognized by
648 // the ConstantFolder.
649 TLI.setUnavailable(LibFunc_acos_finite);
650 TLI.setUnavailable(LibFunc_acosf_finite);
651 TLI.setUnavailable(LibFunc_acosl_finite);
652 TLI.setUnavailable(LibFunc_acosh_finite);
653 TLI.setUnavailable(LibFunc_acoshf_finite);
654 TLI.setUnavailable(LibFunc_acoshl_finite);
655 TLI.setUnavailable(LibFunc_asin_finite);
656 TLI.setUnavailable(LibFunc_asinf_finite);
657 TLI.setUnavailable(LibFunc_asinl_finite);
658 TLI.setUnavailable(LibFunc_atan2_finite);
659 TLI.setUnavailable(LibFunc_atan2f_finite);
660 TLI.setUnavailable(LibFunc_atan2l_finite);
661 TLI.setUnavailable(LibFunc_atanh_finite);
662 TLI.setUnavailable(LibFunc_atanhf_finite);
663 TLI.setUnavailable(LibFunc_atanhl_finite);
664 TLI.setUnavailable(LibFunc_cosh_finite);
665 TLI.setUnavailable(LibFunc_coshf_finite);
666 TLI.setUnavailable(LibFunc_coshl_finite);
667 TLI.setUnavailable(LibFunc_exp10_finite);
668 TLI.setUnavailable(LibFunc_exp10f_finite);
669 TLI.setUnavailable(LibFunc_exp10l_finite);
670 TLI.setUnavailable(LibFunc_exp2_finite);
671 TLI.setUnavailable(LibFunc_exp2f_finite);
672 TLI.setUnavailable(LibFunc_exp2l_finite);
673 TLI.setUnavailable(LibFunc_exp_finite);
674 TLI.setUnavailable(LibFunc_expf_finite);
675 TLI.setUnavailable(LibFunc_expl_finite);
676 TLI.setUnavailable(LibFunc_log10_finite);
677 TLI.setUnavailable(LibFunc_log10f_finite);
678 TLI.setUnavailable(LibFunc_log10l_finite);
679 TLI.setUnavailable(LibFunc_log2_finite);
680 TLI.setUnavailable(LibFunc_log2f_finite);
681 TLI.setUnavailable(LibFunc_log2l_finite);
682 TLI.setUnavailable(LibFunc_log_finite);
683 TLI.setUnavailable(LibFunc_logf_finite);
684 TLI.setUnavailable(LibFunc_logl_finite);
685 TLI.setUnavailable(LibFunc_pow_finite);
686 TLI.setUnavailable(LibFunc_powf_finite);
687 TLI.setUnavailable(LibFunc_powl_finite);
688 TLI.setUnavailable(LibFunc_sinh_finite);
689 TLI.setUnavailable(LibFunc_sinhf_finite);
690 TLI.setUnavailable(LibFunc_sinhl_finite);
691 TLI.setUnavailable(LibFunc_sqrt_finite);
692 TLI.setUnavailable(LibFunc_sqrtf_finite);
693 TLI.setUnavailable(LibFunc_sqrtl_finite);
694 }
695
696 if ((T.isOSLinux() && T.isGNUEnvironment()) ||
697 (T.isAndroid() && !T.isAndroidVersionLT(28))) {
698 // available IO unlocked variants on GNU/Linux and Android P or later
699 TLI.setAvailable(LibFunc_getc_unlocked);
700 TLI.setAvailable(LibFunc_getchar_unlocked);
701 TLI.setAvailable(LibFunc_putc_unlocked);
702 TLI.setAvailable(LibFunc_putchar_unlocked);
703 TLI.setAvailable(LibFunc_fputc_unlocked);
704 TLI.setAvailable(LibFunc_fgetc_unlocked);
705 TLI.setAvailable(LibFunc_fread_unlocked);
706 TLI.setAvailable(LibFunc_fwrite_unlocked);
707 TLI.setAvailable(LibFunc_fputs_unlocked);
708 TLI.setAvailable(LibFunc_fgets_unlocked);
709 }
710
711 if (T.isPS()) {
712 // PS4/PS5 do have memalign.
713 TLI.setAvailable(LibFunc_memalign);
714
715 // PS4/PS5 do not have new/delete with "unsigned int" size parameter;
716 // they only have the "unsigned long" versions.
717 TLI.setUnavailable(LibFunc_ZdaPvj);
718 TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
719 TLI.setUnavailable(LibFunc_ZdlPvj);
720 TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
721 TLI.setUnavailable(LibFunc_Znaj);
722 TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
723 TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
724 TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
725 TLI.setUnavailable(LibFunc_Znwj);
726 TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
727 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
728 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
729
730 // None of the *_chk functions.
731 TLI.setUnavailable(LibFunc_memccpy_chk);
732 TLI.setUnavailable(LibFunc_memcpy_chk);
733 TLI.setUnavailable(LibFunc_memmove_chk);
734 TLI.setUnavailable(LibFunc_mempcpy_chk);
735 TLI.setUnavailable(LibFunc_memset_chk);
736 TLI.setUnavailable(LibFunc_snprintf_chk);
737 TLI.setUnavailable(LibFunc_sprintf_chk);
738 TLI.setUnavailable(LibFunc_stpcpy_chk);
739 TLI.setUnavailable(LibFunc_stpncpy_chk);
740 TLI.setUnavailable(LibFunc_strcat_chk);
741 TLI.setUnavailable(LibFunc_strcpy_chk);
742 TLI.setUnavailable(LibFunc_strlcat_chk);
743 TLI.setUnavailable(LibFunc_strlcpy_chk);
744 TLI.setUnavailable(LibFunc_strlen_chk);
745 TLI.setUnavailable(LibFunc_strncat_chk);
746 TLI.setUnavailable(LibFunc_strncpy_chk);
747 TLI.setUnavailable(LibFunc_vsnprintf_chk);
748 TLI.setUnavailable(LibFunc_vsprintf_chk);
749
750 // Various Posix system functions.
751 TLI.setUnavailable(LibFunc_access);
752 TLI.setUnavailable(LibFunc_chmod);
753 TLI.setUnavailable(LibFunc_chown);
754 TLI.setUnavailable(LibFunc_closedir);
755 TLI.setUnavailable(LibFunc_ctermid);
756 TLI.setUnavailable(LibFunc_execl);
757 TLI.setUnavailable(LibFunc_execle);
758 TLI.setUnavailable(LibFunc_execlp);
759 TLI.setUnavailable(LibFunc_execv);
760 TLI.setUnavailable(LibFunc_execvP);
761 TLI.setUnavailable(LibFunc_execve);
762 TLI.setUnavailable(LibFunc_execvp);
763 TLI.setUnavailable(LibFunc_execvpe);
764 TLI.setUnavailable(LibFunc_fork);
765 TLI.setUnavailable(LibFunc_fstat);
766 TLI.setUnavailable(LibFunc_fstatvfs);
767 TLI.setUnavailable(LibFunc_getenv);
768 TLI.setUnavailable(LibFunc_getitimer);
769 TLI.setUnavailable(LibFunc_getlogin_r);
770 TLI.setUnavailable(LibFunc_getpwnam);
771 TLI.setUnavailable(LibFunc_gettimeofday);
772 TLI.setUnavailable(LibFunc_lchown);
773 TLI.setUnavailable(LibFunc_lstat);
774 TLI.setUnavailable(LibFunc_mkdir);
775 TLI.setUnavailable(LibFunc_open);
776 TLI.setUnavailable(LibFunc_opendir);
777 TLI.setUnavailable(LibFunc_pclose);
778 TLI.setUnavailable(LibFunc_popen);
779 TLI.setUnavailable(LibFunc_pread);
780 TLI.setUnavailable(LibFunc_pvalloc);
781 TLI.setUnavailable(LibFunc_pwrite);
782 TLI.setUnavailable(LibFunc_read);
783 TLI.setUnavailable(LibFunc_readlink);
784 TLI.setUnavailable(LibFunc_realpath);
785 TLI.setUnavailable(LibFunc_rename);
786 TLI.setUnavailable(LibFunc_rmdir);
787 TLI.setUnavailable(LibFunc_setitimer);
788 TLI.setUnavailable(LibFunc_stat);
789 TLI.setUnavailable(LibFunc_statvfs);
790 TLI.setUnavailable(LibFunc_system);
791 TLI.setUnavailable(LibFunc_times);
792 TLI.setUnavailable(LibFunc_tmpfile);
793 TLI.setUnavailable(LibFunc_unlink);
794 TLI.setUnavailable(LibFunc_uname);
795 TLI.setUnavailable(LibFunc_unsetenv);
796 TLI.setUnavailable(LibFunc_utime);
797 TLI.setUnavailable(LibFunc_utimes);
798 TLI.setUnavailable(LibFunc_valloc);
799 TLI.setUnavailable(LibFunc_write);
800
801 // Miscellaneous other functions not provided.
802 TLI.setUnavailable(LibFunc_atomic_load);
803 TLI.setUnavailable(LibFunc_atomic_store);
804 TLI.setUnavailable(LibFunc_dunder_strndup);
805 TLI.setUnavailable(LibFunc_bcmp);
806 TLI.setUnavailable(LibFunc_bcopy);
807 TLI.setUnavailable(LibFunc_bzero);
808 TLI.setUnavailable(LibFunc_cabs);
809 TLI.setUnavailable(LibFunc_cabsf);
810 TLI.setUnavailable(LibFunc_cabsl);
811 TLI.setUnavailable(LibFunc_ffs);
812 TLI.setUnavailable(LibFunc_flockfile);
813 TLI.setUnavailable(LibFunc_fseeko);
814 TLI.setUnavailable(LibFunc_ftello);
815 TLI.setUnavailable(LibFunc_ftrylockfile);
816 TLI.setUnavailable(LibFunc_funlockfile);
817 TLI.setUnavailable(LibFunc_htonl);
818 TLI.setUnavailable(LibFunc_htons);
819 TLI.setUnavailable(LibFunc_isascii);
820 TLI.setUnavailable(LibFunc_memccpy);
821 TLI.setUnavailable(LibFunc_mempcpy);
822 TLI.setUnavailable(LibFunc_memrchr);
823 TLI.setUnavailable(LibFunc_ntohl);
824 TLI.setUnavailable(LibFunc_ntohs);
825 TLI.setUnavailable(LibFunc_reallocarray);
826 TLI.setUnavailable(LibFunc_reallocf);
827 TLI.setUnavailable(LibFunc_roundeven);
828 TLI.setUnavailable(LibFunc_roundevenf);
829 TLI.setUnavailable(LibFunc_roundevenl);
830 TLI.setUnavailable(LibFunc_stpcpy);
831 TLI.setUnavailable(LibFunc_stpncpy);
832 TLI.setUnavailable(LibFunc_strlcat);
833 TLI.setUnavailable(LibFunc_strlcpy);
834 TLI.setUnavailable(LibFunc_strndup);
835 TLI.setUnavailable(LibFunc_strnlen);
836 TLI.setUnavailable(LibFunc_toascii);
837 }
838
839 if (T.isOSFreeBSD()) {
840 TLI.setAvailable(LibFunc_dunder_strtok_r);
841 TLI.setAvailable(LibFunc_memalign);
842 TLI.setAvailable(LibFunc_fputc_unlocked);
843 TLI.setAvailable(LibFunc_fputs_unlocked);
844 TLI.setAvailable(LibFunc_fread_unlocked);
845 TLI.setAvailable(LibFunc_fwrite_unlocked);
846 TLI.setAvailable(LibFunc_getc_unlocked);
847 TLI.setAvailable(LibFunc_getchar_unlocked);
848 TLI.setAvailable(LibFunc_putc_unlocked);
849 TLI.setAvailable(LibFunc_putchar_unlocked);
850
851 TLI.setUnavailable(LibFunc_dunder_strndup);
852 TLI.setUnavailable(LibFunc_memccpy_chk);
853 TLI.setUnavailable(LibFunc_strlen_chk);
854 TLI.setUnavailable(LibFunc_fmaximum_num);
855 TLI.setUnavailable(LibFunc_fmaximum_numf);
856 TLI.setUnavailable(LibFunc_fmaximum_numl);
857 TLI.setUnavailable(LibFunc_fminimum_num);
858 TLI.setUnavailable(LibFunc_fminimum_numf);
859 TLI.setUnavailable(LibFunc_fminimum_numl);
860 TLI.setUnavailable(LibFunc_roundeven);
861 TLI.setUnavailable(LibFunc_roundevenf);
862 TLI.setUnavailable(LibFunc_roundevenl);
863 }
864
865 // As currently implemented in clang, NVPTX code has no standard library to
866 // speak of. Headers provide a standard-ish library implementation, but many
867 // of the signatures are wrong -- for example, many libm functions are not
868 // extern "C".
869 //
870 // libdevice, an IR library provided by nvidia, is linked in by the front-end,
871 // but only used functions are provided to llvm. Moreover, most of the
872 // functions in libdevice don't map precisely to standard library functions.
873 //
874 // FIXME: Having no standard library prevents e.g. many fastmath
875 // optimizations, so this situation should be fixed.
876 if (T.isNVPTX()) {
877 TLI.disableAllFunctions();
878 TLI.setAvailable(LibFunc_nvvm_reflect);
879 TLI.setAvailable(llvm::LibFunc_malloc);
880 TLI.setAvailable(llvm::LibFunc_free);
881
882 // TODO: We could enable the following two according to [0] but we haven't
883 // done an evaluation wrt. the performance implications.
884 // [0]
885 // https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#dynamic-global-memory-allocation-and-operations
886 //
887 // TLI.setAvailable(llvm::LibFunc_memcpy);
888 // TLI.setAvailable(llvm::LibFunc_memset);
889
890 } else {
891 TLI.setUnavailable(LibFunc_nvvm_reflect);
892 }
893
894 // These vec_malloc/free routines are only available on AIX.
895 if (!T.isOSAIX()) {
896 TLI.setUnavailable(LibFunc_vec_calloc);
897 TLI.setUnavailable(LibFunc_vec_malloc);
898 TLI.setUnavailable(LibFunc_vec_realloc);
899 TLI.setUnavailable(LibFunc_vec_free);
900 }
901
902 if (T.isOSAIX())
903 TLI.setUnavailable(LibFunc_memrchr);
904
905 TLI.addVectorizableFunctionsFromVecLib(VecLib, T);
906}
907
908/// Initialize the set of available library functions based on the specified
909/// target triple. This should be carefully written so that a missing target
910/// triple gets a sane set of defaults.
912 const llvm::StringTable &StandardNames,
913 VectorLibrary VecLib) {
915 initializeLibCalls(TLI, T, StandardNames, VecLib);
916}
917
919 // Assume errno is implemented as a function call on the following
920 // known environments.
921 // TODO: Could refine them.
922 return T.isOSDarwin() || T.isAndroid() || T.isGNUEnvironment() ||
923 T.isMusl() || T.getEnvironment() == Triple::LLVM ||
924 T.getEnvironment() == Triple::Mlibc ||
925 T.getEnvironment() == Triple::MSVC;
926}
927
929 VectorLibrary VecLib)
930 : IsErrnoFunctionCall(initializeIsErrnoFunctionCall(T)) {
931 // Default to everything being available.
932 memset(AvailableArray, -1, sizeof(AvailableArray));
933
934 initialize(*this, T, StandardNamesStrTable, VecLib);
935}
936
938 : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
939 ShouldExtI32Return(TLI.ShouldExtI32Return),
940 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
941 ShouldSignExtI32Return(TLI.ShouldSignExtI32Return),
942 SizeOfInt(TLI.SizeOfInt), IsErrnoFunctionCall(TLI.IsErrnoFunctionCall) {
943 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
944 VectorDescs = TLI.VectorDescs;
945 ScalarDescs = TLI.ScalarDescs;
946}
947
949 : CustomNames(std::move(TLI.CustomNames)),
950 ShouldExtI32Param(TLI.ShouldExtI32Param),
951 ShouldExtI32Return(TLI.ShouldExtI32Return),
952 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
953 ShouldSignExtI32Return(TLI.ShouldSignExtI32Return),
954 SizeOfInt(TLI.SizeOfInt), IsErrnoFunctionCall(TLI.IsErrnoFunctionCall) {
955 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
956 AvailableArray);
957 VectorDescs = TLI.VectorDescs;
958 ScalarDescs = TLI.ScalarDescs;
959}
960
962 CustomNames = TLI.CustomNames;
963 ShouldExtI32Param = TLI.ShouldExtI32Param;
964 ShouldExtI32Return = TLI.ShouldExtI32Return;
965 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
966 ShouldSignExtI32Return = TLI.ShouldSignExtI32Return;
967 SizeOfInt = TLI.SizeOfInt;
968 IsErrnoFunctionCall = TLI.IsErrnoFunctionCall;
969 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
970 return *this;
971}
972
974 CustomNames = std::move(TLI.CustomNames);
975 ShouldExtI32Param = TLI.ShouldExtI32Param;
976 ShouldExtI32Return = TLI.ShouldExtI32Return;
977 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
978 ShouldSignExtI32Return = TLI.ShouldSignExtI32Return;
979 SizeOfInt = TLI.SizeOfInt;
980 IsErrnoFunctionCall = TLI.IsErrnoFunctionCall;
981 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
982 AvailableArray);
983 return *this;
984}
985
987 // Filter out empty names and names containing null bytes, those can't be in
988 // our table.
989 if (funcName.empty() || funcName.contains('\0'))
990 return StringRef();
991
992 // Check for \01 prefix that is used to mangle __asm declarations and
993 // strip it if present.
995}
996
998buildIndexMap(const llvm::StringTable &StandardNames) {
1000 unsigned Idx = 1; // 0 is NotLibFunc.
1001 Indices.reserve(LibFunc::NumLibFuncs);
1002 for (const auto &Func : StandardNames)
1003 Indices[Func] = static_cast<LibFunc>(Idx++);
1004 return Indices;
1005}
1006
1008 funcName = sanitizeFunctionName(funcName);
1009 if (funcName.empty())
1010 return NotLibFunc;
1011
1012 static const DenseMap<StringRef, LibFunc> Indices =
1013 buildIndexMap(StandardNamesStrTable);
1014
1015 if (auto Loc = Indices.find(funcName); Loc != Indices.end())
1016 return Loc->second;
1017 return NotLibFunc;
1018}
1019
1020// Return true if ArgTy matches Ty.
1021
1022static bool matchType(FuncArgTypeID ArgTy, const Type *Ty, unsigned IntBits,
1023 unsigned SizeTBits) {
1024 switch (ArgTy) {
1025 case Void:
1026 return Ty->isVoidTy();
1027 case Bool:
1028 return Ty->isIntegerTy(8);
1029 case Int16:
1030 return Ty->isIntegerTy(16);
1031 case Int32:
1032 return Ty->isIntegerTy(32);
1033 case Int:
1034 return Ty->isIntegerTy(IntBits);
1035 case IntPlus:
1036 return Ty->isIntegerTy() && Ty->getPrimitiveSizeInBits() >= IntBits;
1037 case IntX:
1038 return Ty->isIntegerTy();
1039 case Long:
1040 // TODO: Figure out and use long size.
1041 return Ty->isIntegerTy() && Ty->getPrimitiveSizeInBits() >= IntBits;
1042 case Int64:
1043 return Ty->isIntegerTy(64);
1044 case LLong:
1045 return Ty->isIntegerTy(64);
1046 case SizeT:
1047 case SSizeT:
1048 return Ty->isIntegerTy(SizeTBits);
1049 case Flt:
1050 return Ty->isFloatTy();
1051 case Dbl:
1052 return Ty->isDoubleTy();
1053 // TODO: Tighten this up.
1054 case LDbl:
1055 return Ty->isFloatingPointTy();
1056 case Floating:
1057 return Ty->isFloatingPointTy();
1058 case Ptr:
1059 return Ty->isPointerTy();
1060 case Struct:
1061 return Ty->isStructTy();
1062 default:
1063 break;
1064 }
1065
1066 llvm_unreachable("Invalid type");
1067}
1068
1069static bool isValidProtoForSizeReturningNew(const FunctionType &FTy, LibFunc F,
1070 const Module &M,
1071 int SizeTSizeBits) {
1072 switch (F) {
1073 case LibFunc_size_returning_new: {
1074 if (FTy.getNumParams() != 1 ||
1075 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits)) {
1076 return false;
1077 }
1078 } break;
1079 case LibFunc_size_returning_new_hot_cold: {
1080 if (FTy.getNumParams() != 2 ||
1081 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1082 !FTy.getParamType(1)->isIntegerTy(8)) {
1083 return false;
1084 }
1085 } break;
1086 case LibFunc_size_returning_new_aligned: {
1087 if (FTy.getNumParams() != 2 ||
1088 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1089 !FTy.getParamType(1)->isIntegerTy(SizeTSizeBits)) {
1090 return false;
1091 }
1092 } break;
1093 case LibFunc_size_returning_new_aligned_hot_cold:
1094 if (FTy.getNumParams() != 3 ||
1095 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1096 !FTy.getParamType(1)->isIntegerTy(SizeTSizeBits) ||
1097 !FTy.getParamType(2)->isIntegerTy(8)) {
1098 return false;
1099 }
1100 break;
1101 default:
1102 return false;
1103 }
1104
1105 auto &Context = M.getContext();
1106 PointerType *PtrTy = PointerType::get(Context, 0);
1107 Type *SizeTTy = Type::getIntNTy(Context, SizeTSizeBits);
1108 Type *RetTy = FTy.getReturnType();
1109 // Return type struct __sized_ptr_t { void*, size_t } is lowered to
1110 // { ptr, iN } on some targets (e.g. x86_64) and [2 x iN] on others (e.g.
1111 // AArch64).
1112 return RetTy == StructType::get(Context, {PtrTy, SizeTTy}) ||
1113 RetTy == ArrayType::get(SizeTTy, 2);
1114}
1115
1116bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
1117 LibFunc F,
1118 const Module &M) const {
1119 unsigned NumParams = FTy.getNumParams();
1120
1121 switch (F) {
1122 // Special handling for <complex.h> functions:
1123 case LibFunc_cabs:
1124 case LibFunc_cabsf:
1125 case LibFunc_cabsl: {
1126 Type *RetTy = FTy.getReturnType();
1127 if (!RetTy->isFloatingPointTy() || NumParams == 0)
1128 return false;
1129
1130 Type *ParamTy = FTy.getParamType(0);
1131 // NOTE: These prototypes are target specific and currently support
1132 // "complex" passed as an array or discrete real & imaginary parameters.
1133 // Add other calling conventions to enable libcall optimizations.
1134 if (NumParams == 1)
1135 return (ParamTy->isArrayTy() && ParamTy->getArrayNumElements() == 2 &&
1136 ParamTy->getArrayElementType() == RetTy);
1137 else if (NumParams == 2)
1138 return ParamTy == RetTy && FTy.getParamType(1) == RetTy;
1139
1140 return false;
1141 }
1142 // Special handling for the sincos and sincospi functions that return
1143 // either a struct or vector:
1144 case LibFunc_sincos_stret:
1145 case LibFunc_sincosf_stret:
1146 case LibFunc_sincospi_stret:
1147 case LibFunc_sincospif_stret: {
1148 if (NumParams != 1)
1149 return false;
1150
1151 Type *RetTy = FTy.getReturnType();
1152 Type *ParamTy = FTy.getParamType(0);
1153 if (auto *Ty = dyn_cast<StructType>(RetTy)) {
1154 if (Ty->getNumElements() != 2)
1155 return false;
1156 return (Ty->getElementType(0) == ParamTy &&
1157 Ty->getElementType(1) == ParamTy);
1158 }
1159
1160 if (auto *Ty = dyn_cast<FixedVectorType>(RetTy)) {
1161 if (Ty->getNumElements() != 2)
1162 return false;
1163 return Ty->getElementType() == ParamTy;
1164 }
1165
1166 return false;
1167 }
1168 // Special handling of __size_returning_new functions that return a struct
1169 // of type {void*, size_t}.
1170 case LibFunc_size_returning_new:
1171 case LibFunc_size_returning_new_hot_cold:
1172 case LibFunc_size_returning_new_aligned:
1173 case LibFunc_size_returning_new_aligned_hot_cold:
1175 default:
1176 break;
1177 }
1178
1179 unsigned IntBits = getIntSize();
1180 unsigned SizeTBits = getSizeTSize(M);
1181 unsigned Idx = 0;
1182
1183 // Iterate over the type ids in the function prototype, matching each
1184 // against the function's type FTy, starting with its return type.
1185 // Return true if both match in number and kind, inclduing the ellipsis.
1186 Type *Ty = FTy.getReturnType(), *LastTy = Ty;
1187 const auto *ProtoTypes = &SignatureTable[SignatureOffset[F]];
1188 for (auto TyID = ProtoTypes[Idx]; TyID != NoFuncArgType;
1189 TyID = ProtoTypes[++Idx]) {
1190 if (TyID == NoFuncArgType)
1191 break;
1192
1193 if (TyID == Ellip) {
1194 // The ellipsis ends the protoype list but is not a part of FTy's
1195 // argument list. Except when it's last it must be followed by
1196 // NoFuncArgType.
1197 assert(ProtoTypes[Idx] == NoFuncArgType ||
1198 ProtoTypes[Idx + 1] == NoFuncArgType);
1199 return FTy.isFunctionVarArg();
1200 }
1201
1202 if (TyID == Same) {
1203 assert(Idx != 0 && "Type ID 'Same' must not be first!");
1204 if (Ty != LastTy)
1205 return false;
1206 } else {
1207 if (!Ty || !matchType(TyID, Ty, IntBits, SizeTBits))
1208 return false;
1209 LastTy = Ty;
1210 }
1211
1212 if (Idx == NumParams) {
1213 // There's at least one and at most two more type ids than there are
1214 // arguments in FTy's argument list.
1215 Ty = nullptr;
1216 continue;
1217 }
1218
1219 Ty = FTy.getParamType(Idx);
1220 }
1221
1222 // Return success only if all entries on both lists have been processed
1223 // and the function is not a variadic one.
1224 return Idx == NumParams + 1 && !FTy.isFunctionVarArg();
1225}
1226
1227LibFunc TargetLibraryInfoImpl::getLibFunc(const Function &FDecl) const {
1228 // Intrinsics don't overlap w/libcalls; if our module has a large number of
1229 // intrinsics, this ends up being an interesting compile time win since we
1230 // avoid string normalization and comparison.
1231 if (FDecl.isIntrinsic())
1232 return NotLibFunc;
1233
1234 const Module *M = FDecl.getParent();
1235 assert(M && "Expecting FDecl to be connected to a Module.");
1236
1237 if (FDecl.LibFuncCache == Function::UnknownLibFunc)
1238 FDecl.LibFuncCache = getLibFunc(FDecl.getName());
1239
1240 if (FDecl.LibFuncCache == NotLibFunc)
1241 return NotLibFunc;
1242
1243 if (!isValidProtoForLibFunc(*FDecl.getFunctionType(), FDecl.LibFuncCache, *M))
1244 return NotLibFunc;
1245
1246 return FDecl.LibFuncCache;
1247}
1248
1249LibFunc TargetLibraryInfoImpl::getLibFunc(unsigned int Opcode, Type *Ty) const {
1250 // Must be a frem instruction with float or double arguments.
1251 if (Opcode != Instruction::FRem || (!Ty->isDoubleTy() && !Ty->isFloatTy()))
1252 return NotLibFunc;
1253
1254 return Ty->isDoubleTy() ? LibFunc_fmod : LibFunc_fmodf;
1255}
1256
1258 memset(AvailableArray, 0, sizeof(AvailableArray));
1259}
1260
1261static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {
1262 return LHS.getScalarFnName() < RHS.getScalarFnName();
1263}
1264
1265static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS) {
1266 return LHS.getVectorFnName() < RHS.getVectorFnName();
1267}
1268
1270 return LHS.getScalarFnName() < S;
1271}
1272
1274 llvm::append_range(VectorDescs, Fns);
1275 llvm::sort(VectorDescs, compareByScalarFnName);
1276
1277 llvm::append_range(ScalarDescs, Fns);
1278 llvm::sort(ScalarDescs, compareByVectorFnName);
1279}
1280
1281// The VecDesc tables should be constant-initialized to avoid compilation
1282// regression. Now VecDesc (see class definition) intentionally keeps trivially
1283// constructable/destructable, so the tables land in .rdata and do not run
1284// through CRT dynamic init (which can overflow small stack on MSVC Debug
1285// DLL loads). When LLVM requires C++20 mark them constinit to enforce this
1286// at compile time.
1287static constexpr VecDesc VecFuncs_Accelerate[] = {
1288#define TLI_DEFINE_ACCELERATE_VECFUNCS
1289#include "llvm/Analysis/VecFuncs.def"
1290#undef TLI_DEFINE_ACCELERATE_VECFUNCS
1291};
1292
1294#define TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1295#include "llvm/Analysis/VecFuncs.def"
1296#undef TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1297};
1298
1299static constexpr VecDesc VecFuncs_LIBMVEC_X86[] = {
1300#define TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1301#include "llvm/Analysis/VecFuncs.def"
1302#undef TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1303};
1304
1305static constexpr VecDesc VecFuncs_LIBMVEC_AARCH64[] = {
1306#define TLI_DEFINE_LIBMVEC_AARCH64_VECFUNCS
1307#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX, CC) \
1308 {SCAL, VEC, VF, MASK, VABI_PREFIX, CC},
1309#include "llvm/Analysis/VecFuncs.def"
1310#undef TLI_DEFINE_LIBMVEC_AARCH64_VECFUNCS
1311};
1312
1313static constexpr VecDesc VecFuncs_MASSV[] = {
1314#define TLI_DEFINE_MASSV_VECFUNCS
1315#include "llvm/Analysis/VecFuncs.def"
1316#undef TLI_DEFINE_MASSV_VECFUNCS
1317};
1318
1319static constexpr VecDesc VecFuncs_SVML[] = {
1320#define TLI_DEFINE_SVML_VECFUNCS
1321#include "llvm/Analysis/VecFuncs.def"
1322#undef TLI_DEFINE_SVML_VECFUNCS
1323};
1324
1325static constexpr VecDesc VecFuncs_SLEEFGNUABI_VF2[] = {
1326#define TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1327#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) \
1328 {SCAL, VEC, VF, /* MASK = */ false, VABI_PREFIX, /* CC = */ std::nullopt},
1329#include "llvm/Analysis/VecFuncs.def"
1330#undef TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1331};
1332static constexpr VecDesc VecFuncs_SLEEFGNUABI_VF4[] = {
1333#define TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1334#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) \
1335 {SCAL, VEC, VF, /* MASK = */ false, VABI_PREFIX, /* CC = */ std::nullopt},
1336#include "llvm/Analysis/VecFuncs.def"
1337#undef TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1338};
1340#define TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS
1341#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1342 {SCAL, VEC, VF, MASK, VABI_PREFIX, /* CC = */ std::nullopt},
1343#include "llvm/Analysis/VecFuncs.def"
1344#undef TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS
1345};
1346
1348#define TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS_RISCV
1349#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1350 {SCAL, VEC, VF, MASK, VABI_PREFIX, /* CC = */ std::nullopt},
1351#include "llvm/Analysis/VecFuncs.def"
1352#undef TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS_RISCV
1353};
1354
1355static constexpr VecDesc VecFuncs_ArmPL[] = {
1356#define TLI_DEFINE_ARMPL_VECFUNCS
1357#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX, CC) \
1358 {SCAL, VEC, VF, MASK, VABI_PREFIX, CC},
1359#include "llvm/Analysis/VecFuncs.def"
1360#undef TLI_DEFINE_ARMPL_VECFUNCS
1361};
1362
1364#define TLI_DEFINE_AMDLIBM_VECFUNCS
1365#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1366 {SCAL, VEC, VF, MASK, VABI_PREFIX, /* CC = */ std::nullopt},
1367#include "llvm/Analysis/VecFuncs.def"
1368#undef TLI_DEFINE_AMDLIBM_VECFUNCS
1369};
1370
1372 enum VectorLibrary VecLib, const llvm::Triple &TargetTriple) {
1373 switch (VecLib) {
1376 break;
1377 }
1380 break;
1381 }
1383 switch (TargetTriple.getArch()) {
1384 default:
1385 break;
1386 case llvm::Triple::x86:
1389 break;
1393 break;
1394 }
1395 break;
1396 }
1397 case VectorLibrary::MASSV: {
1399 break;
1400 }
1401 case VectorLibrary::SVML: {
1403 break;
1404 }
1406 switch (TargetTriple.getArch()) {
1407 default:
1408 break;
1414 break;
1417 break;
1418 }
1419 break;
1420 }
1421 case VectorLibrary::ArmPL: {
1422 switch (TargetTriple.getArch()) {
1423 default:
1424 break;
1428 break;
1429 }
1430 break;
1431 }
1434 break;
1435 }
1437 break;
1438 }
1439}
1440
1442 funcName = sanitizeFunctionName(funcName);
1443 if (funcName.empty())
1444 return false;
1445
1446 std::vector<VecDesc>::const_iterator I =
1447 llvm::lower_bound(VectorDescs, funcName, compareWithScalarFnName);
1448 return I != VectorDescs.end() && StringRef(I->getScalarFnName()) == funcName;
1449}
1450
1452 const ElementCount &VF,
1453 bool Masked) const {
1454 const VecDesc *VD = getVectorMappingInfo(F, VF, Masked);
1455 if (VD)
1456 return VD->getVectorFnName();
1457 return StringRef();
1458}
1459
1460const VecDesc *
1462 bool Masked) const {
1464 if (F.empty())
1465 return nullptr;
1466 std::vector<VecDesc>::const_iterator I =
1468 while (I != VectorDescs.end() && StringRef(I->getScalarFnName()) == F) {
1469 if ((I->getVectorizationFactor() == VF) && (I->isMasked() == Masked))
1470 return &(*I);
1471 ++I;
1472 }
1473 return nullptr;
1474}
1475
1478 if (!BaselineInfoImpl)
1479 BaselineInfoImpl = TargetLibraryInfoImpl(F.getParent()->getTargetTriple());
1480 return TargetLibraryInfo(*BaselineInfoImpl, &F);
1481}
1482
1484 // There is really no guarantee that sizeof(size_t) is equal to the index
1485 // size of the default address space. If that isn't true then it should be
1486 // possible to derive the SizeTTy from the target triple here instead and do
1487 // an early return.
1488
1489 // Hard coding address space zero may seem unfortunate, but a number of
1490 // configurations of common targets (i386, x86-64 x32, aarch64 x32, possibly
1491 // others) have larger-than-size_t index sizes on non-default address spaces,
1492 // making this the best default.
1493 return M.getDataLayout().getIndexSizeInBits(/*AddressSpace=*/0);
1494}
1495
1498
1501
1505
1509
1510AnalysisKey TargetLibraryAnalysis::Key;
1511
1512// Register the basic pass.
1514 "Target Library Information", false, true)
1516
1517void TargetLibraryInfoWrapperPass::anchor() {}
1518
1520 ElementCount &FixedVF,
1521 ElementCount &ScalableVF) const {
1522 ScalarF = sanitizeFunctionName(ScalarF);
1523 // Use '0' here because a type of the form <vscale x 1 x ElTy> is not the
1524 // same as a scalar.
1525 ScalableVF = ElementCount::getScalable(0);
1526 FixedVF = ElementCount::getFixed(1);
1527 if (ScalarF.empty())
1528 return;
1529
1530 std::vector<VecDesc>::const_iterator I =
1531 llvm::lower_bound(VectorDescs, ScalarF, compareWithScalarFnName);
1532 while (I != VectorDescs.end() && StringRef(I->getScalarFnName()) == ScalarF) {
1533 ElementCount *VF =
1534 I->getVectorizationFactor().isScalable() ? &ScalableVF : &FixedVF;
1535 if (ElementCount::isKnownGT(I->getVectorizationFactor(), *VF))
1536 *VF = I->getVectorizationFactor();
1537 ++I;
1538 }
1539}
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
RISCVCC::CondCode CC
This file defines the SmallString class.
static bool hasSinCosPiStret(const Triple &T)
static bool isCallingConvCCompatible(CallingConv::ID CC, const Triple &TT, FunctionType *FuncTy)
static constexpr VecDesc VecFuncs_SLEEFGNUABI_VFScalableRISCV[]
static StringRef sanitizeFunctionName(StringRef funcName)
static constexpr VecDesc VecFuncs_SLEEFGNUABI_VF2[]
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, const llvm::StringTable &StandardNames, VectorLibrary VecLib)
Initialize the set of available library functions based on the specified target triple.
static constexpr VecDesc VecFuncs_LIBMVEC_X86[]
static bool matchType(FuncArgTypeID ArgTy, const Type *Ty, unsigned IntBits, unsigned SizeTBits)
static constexpr VecDesc VecFuncs_SLEEFGNUABI_VF4[]
static bool hasBcmp(const Triple &TT)
static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T, const llvm::StringTable &StandardNames, VectorLibrary VecLib)
Initialize the set of available library functions based on the specified target triple.
static void initializeBase(TargetLibraryInfoImpl &TLI, const Triple &T)
static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS)
static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS)
constexpr VecDesc VecFuncs_AMDLIBM[]
static bool initializeIsErrnoFunctionCall(const Triple &T)
static constexpr VecDesc VecFuncs_SVML[]
static DenseMap< StringRef, LibFunc > buildIndexMap(const llvm::StringTable &StandardNames)
static constexpr VecDesc VecFuncs_Accelerate[]
static bool isValidProtoForSizeReturningNew(const FunctionType &FTy, LibFunc F, const Module &M, int SizeTSizeBits)
static constexpr VecDesc VecFuncs_ArmPL[]
static constexpr VecDesc VecFuncs_LIBMVEC_AARCH64[]
static constexpr VecDesc VecFuncs_MASSV[]
static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S)
static constexpr VecDesc VecFuncs_SLEEFGNUABI_VFScalable[]
static constexpr VecDesc VecFuncs_DarwinLibSystemM[]
Value * RHS
Value * LHS
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
CallingConv::ID getCallingConv() const
FunctionType * getFunctionType() const
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:766
void reserve(size_type NumEntries)
Grow the DenseMap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:721
iterator end()
Definition DenseMap.h:686
static constexpr ElementCount getScalable(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:306
Class to represent function types.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:212
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:252
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Module * getParent()
Get the module that this global value is contained inside of...
ImmutablePass(char &pid)
Definition Pass.h:285
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Definition Module.h:328
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:28
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:446
A table of densely packed, null-terminated strings indexed by offset.
Definition StringTable.h:34
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:467
LLVM_ABI TargetLibraryInfo run(const Function &F, FunctionAnalysisManager &)
Implementation of the target library information.
LLVM_ABI void getWidestVF(StringRef ScalarF, ElementCount &FixedVF, ElementCount &Scalable) const
Returns the largest vectorization factor used in the list of vector functions.
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
Return true if the function F has a vector equivalent with vectorization factor VF.
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
LLVM_ABI void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib, const llvm::Triple &TargetTriple)
Calls addVectorizableFunctions with a known preset of functions for the given vector library.
LLVM_ABI unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
LLVM_ABI void addVectorizableFunctions(ArrayRef< VecDesc > Fns)
Add a set of scalar -> vector mappings, queryable via getVectorizedFunction and getScalarizedFunction...
LLVM_ABI const VecDesc * getVectorMappingInfo(StringRef F, const ElementCount &VF, bool Masked) const
Return a pointer to a VecDesc object holding all info for scalar to vector mappings in TLI for the eq...
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
LLVM_ABI TargetLibraryInfoImpl & operator=(const TargetLibraryInfoImpl &TLI)
LLVM_ABI void disableAllFunctions()
Disables all builtins.
LLVM_ABI LibFunc getLibFunc(StringRef funcName) const
Searches for a particular function name.
LLVM_ABI StringRef getVectorizedFunction(StringRef F, const ElementCount &VF, bool Masked) const
Return the name of the equivalent of F, vectorized with factor VF.
TargetLibraryInfoWrapperPass()
The default constructor should not be used and is only for pass manager initialization purposes.
Provides information about what library functions are available for the current target.
static LLVM_ABI void initBoolExtensionsForTriple(bool &ShouldZExtBoolParam, bool &ShouldZExtBoolReturn, const Triple &T)
static LLVM_ABI void initExtensionsForTriple(bool &ShouldExtI32Param, bool &ShouldExtI32Return, bool &ShouldSignExtI32Param, bool &ShouldSignExtI32Return, const Triple &T)
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:515
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition Type.h:274
Type * getArrayElementType() const
Definition Type.h:420
LLVM_ABI uint64_t getArrayNumElements() const
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:314
Provides info so a possible vectorization of a function can be computed.
LLVM_ABI std::string getVectorFunctionABIVariantString() const
Returns a vector function ABI variant string on the form: ZGV<isa><mask><vlen><vparams><scalarname>(<...
StringRef getVectorFnName() const
Represents a version number in the form major[.minor[.subminor[.build]]].
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:224
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:2068
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
VectorLibrary
List of known vector-functions libraries.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:879
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
static LLVM_ABI void initExtensionsForTriple(bool &ShouldExtI32Param, bool &ShouldExtI32Return, bool &ShouldSignExtI32Param, bool &ShouldSignExtI32Return, const Triple &T)
Determine the extension attributes needed for i32 parameters and returns corresponding to C-level int...
static LLVM_ABI void initBoolExtensionsForTriple(bool &ShouldZExtBoolParam, bool &ShouldZExtBoolReturn, const Triple &T)
Determine whether bool parameters and returns need zeroext on T.