Movatterモバイル変換


[0]ホーム

URL:


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

Generated on Thu Jul 17 2025 11:06:04 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp