32#define DEBUG_TYPE "build-libcalls"
36STATISTIC(NumReadNone,
"Number of functions inferred as readnone");
37STATISTIC(NumReadOnly,
"Number of functions inferred as readonly");
38STATISTIC(NumWriteOnly,
"Number of functions inferred as writeonly");
39STATISTIC(NumArgMemOnly,
"Number of functions inferred as argmemonly");
41 "Number of functions inferred as memory(errnomem: write)");
43 "Number of functions inferred as inaccessiblemem_or_argmemonly");
45 "Number of functions inferred as memory(inaccessiblemem: readwrite, "
48 "Number of functions inferred as memory(argmem: readwrite, "
49 "inaccessiblemem: readwrite, errnomem: write)");
51 NumWriteArgumentMemOrErrnoMemOnly,
52 "Number of functions inferred as memory(argmem: write, errnomem: write)");
53STATISTIC(NumNoUnwind,
"Number of functions inferred as nounwind");
54STATISTIC(NumNoCallback,
"Number of functions inferred as nocallback");
55STATISTIC(NumNoCapture,
"Number of arguments inferred as nocapture");
56STATISTIC(NumWriteOnlyArg,
"Number of arguments inferred as writeonly");
57STATISTIC(NumReadOnlyArg,
"Number of arguments inferred as readonly");
58STATISTIC(NumNoAlias,
"Number of function returns inferred as noalias");
59STATISTIC(NumNoUndef,
"Number of function returns inferred as noundef returns");
60STATISTIC(NumReturnedArg,
"Number of arguments inferred as returned");
61STATISTIC(NumWillReturn,
"Number of functions inferred as willreturn");
62STATISTIC(NumCold,
"Number of functions inferred as cold");
63STATISTIC(NumNoReturn,
"Number of functions inferred as no return");
64STATISTIC(NumNoSync,
"Number of functions inferred as nosync");
67 if (
F.doesNotAccessMemory())
69 F.setDoesNotAccessMemory();
75 if (
F.hasFnAttribute(Attribute::Cold))
77 F.addFnAttr(Attribute::Cold);
83 if (
F.hasFnAttribute(Attribute::NoReturn))
85 F.addFnAttr(Attribute::NoReturn);
95 F.setMemoryEffects(NewME);
123 ++NumInaccessibleMemOrArgMemOnly;
131 ++NumInaccessibleMemOrErrnoMemOnly;
139 ++NumInaccessibleMemOrArgMemOrErrnoMemOnly;
146 ++NumWriteErrnoMemOnly;
154 ++NumWriteArgumentMemOrErrnoMemOnly;
159 if (
F.doesNotThrow())
167 if (
F.hasFnAttribute(Attribute::NoCallback))
169 F.addFnAttr(Attribute::NoCallback);
175 if (
F.hasRetAttribute(Attribute::NoAlias))
177 F.addRetAttr(Attribute::NoAlias);
183 if (
F.hasParamAttribute(ArgNo, Attribute::Captures))
192 if (
F.hasParamAttribute(ArgNo, Attribute::NoAlias))
194 F.addParamAttr(ArgNo, Attribute::NoAlias);
200 if (
F.hasFnAttribute(Attribute::NoSync))
202 F.addFnAttr(Attribute::NoSync);
208 if (
F.hasParamAttribute(ArgNo, Attribute::ReadOnly))
210 F.addParamAttr(ArgNo, Attribute::ReadOnly);
216 if (
F.hasParamAttribute(ArgNo, Attribute::WriteOnly))
218 F.addParamAttr(ArgNo, Attribute::WriteOnly);
224 if (!
F.getReturnType()->isVoidTy() &&
225 !
F.hasRetAttribute(Attribute::NoUndef)) {
226 F.addRetAttr(Attribute::NoUndef);
235 for (
unsigned ArgNo = 0; ArgNo <
F.arg_size(); ++ArgNo) {
236 if (!
F.hasParamAttribute(ArgNo, Attribute::NoUndef)) {
237 F.addParamAttr(ArgNo, Attribute::NoUndef);
246 if (
F.hasParamAttribute(ArgNo, Attribute::NoUndef))
248 F.addParamAttr(ArgNo, Attribute::NoUndef);
254 bool UndefAdded =
false;
261 if (
F.hasParamAttribute(ArgNo, Attribute::Returned))
263 F.addParamAttr(ArgNo, Attribute::Returned);
269 if (
F.hasFnAttribute(Attribute::NonLazyBind))
271 F.addFnAttr(Attribute::NonLazyBind);
276 if (
F.hasFnAttribute(Attribute::NoFree))
278 F.addFnAttr(Attribute::NoFree);
283 if (
F.hasFnAttribute(Attribute::WillReturn))
285 F.addFnAttr(Attribute::WillReturn);
291 if (
F.hasParamAttribute(ArgNo, Attribute::AllocAlign))
293 F.addParamAttr(ArgNo, Attribute::AllocAlign);
298 if (
F.hasParamAttribute(ArgNo, Attribute::AllocatedPointer))
300 F.addParamAttr(ArgNo, Attribute::AllocatedPointer);
305 std::optional<unsigned> NumElemsArg) {
306 if (
F.hasFnAttribute(Attribute::AllocSize))
314 if (
F.hasFnAttribute(
"alloc-family"))
316 F.addFnAttr(
"alloc-family", Family);
321 if (
F.hasFnAttribute(Attribute::AllocKind))
344 if (
F.getParent() !=
nullptr &&
F.getParent()->getRtLibUseGOT())
347 switch (TheLibFunc) {
352 case LibFunc_strnlen:
363 case LibFunc_strrchr:
374 case LibFunc_strtoul:
375 case LibFunc_strtoll:
376 case LibFunc_strtold:
377 case LibFunc_strtoull:
385 case LibFunc_strncat:
398 case LibFunc_strncpy:
402 case LibFunc_stpncpy:
414 case LibFunc_strxfrm:
424 case LibFunc_strncmp:
425 case LibFunc_strcspn:
435 case LibFunc_strcoll:
436 case LibFunc_strcasecmp:
437 case LibFunc_strncasecmp:
448 case LibFunc_strpbrk:
458 case LibFunc_strtok_r:
472 case LibFunc_setvbuf:
477 case LibFunc_strndup:
490 case LibFunc_statvfs:
505 case LibFunc_sprintf:
514 case LibFunc_snprintf:
523 case LibFunc_setitimer:
537 case LibFunc_aligned_alloc:
544 case LibFunc_vec_malloc:
547 case LibFunc_pvalloc:
568 case LibFunc_memrchr:
600 case LibFunc_memmove:
611 case LibFunc_mempcpy:
612 case LibFunc_memccpy:
615 case LibFunc_memcpy_chk:
626 case LibFunc_memalign:
650 case LibFunc_realloc:
651 case LibFunc_reallocf:
652 case LibFunc_vec_realloc:
654 F, TheLibFunc == LibFunc_vec_realloc ?
"vec_malloc" :
"malloc");
666 case LibFunc_reallocarray:
692 case LibFunc_realpath:
706 case LibFunc_readlink:
750 case LibFunc_vec_calloc:
768 case LibFunc_ctermid:
769 case LibFunc_clearerr:
770 case LibFunc_closedir:
814 case LibFunc_vec_free:
828 case LibFunc_fgetc_unlocked:
834 case LibFunc_fsetpos:
835 case LibFunc_flockfile:
836 case LibFunc_funlockfile:
837 case LibFunc_ftrylockfile:
849 case LibFunc_fputc_unlocked:
866 case LibFunc_fstatvfs:
872 case LibFunc_fgets_unlocked:
879 case LibFunc_fread_unlocked:
887 case LibFunc_fwrite_unlocked:
895 case LibFunc_fputs_unlocked:
903 case LibFunc_fprintf:
910 case LibFunc_fgetpos:
921 case LibFunc_getlogin_r:
926 case LibFunc_getc_unlocked:
938 case LibFunc_getchar:
939 case LibFunc_getchar_unlocked:
943 case LibFunc_getitimer:
948 case LibFunc_getpwnam:
970 case LibFunc_unsetenv:
986 case LibFunc_putc_unlocked:
1004 case LibFunc_pwrite:
1010 case LibFunc_putchar:
1011 case LibFunc_putchar_unlocked:
1024 case LibFunc_pclose:
1029 case LibFunc_vscanf:
1035 case LibFunc_vsscanf:
1043 case LibFunc_vfscanf:
1050 case LibFunc_vprintf:
1056 case LibFunc_vfprintf:
1057 case LibFunc_vsprintf:
1064 case LibFunc_vsnprintf:
1077 case LibFunc_opendir:
1084 case LibFunc_tmpfile:
1109 case LibFunc_lchown:
1121 case LibFunc_dunder_strndup:
1124 case LibFunc_dunder_strdup:
1131 case LibFunc_dunder_strtok_r:
1137 case LibFunc_under_IO_getc:
1142 case LibFunc_under_IO_putc:
1147 case LibFunc_dunder_isoc99_scanf:
1153 case LibFunc_stat64:
1154 case LibFunc_lstat64:
1155 case LibFunc_statvfs64:
1162 case LibFunc_dunder_isoc99_sscanf:
1170 case LibFunc_fopen64:
1179 case LibFunc_fseeko64:
1180 case LibFunc_ftello64:
1185 case LibFunc_tmpfile64:
1190 case LibFunc_fstat64:
1191 case LibFunc_fstatvfs64:
1196 case LibFunc_open64:
1202 case LibFunc_gettimeofday:
1211 case LibFunc_memset_pattern4:
1212 case LibFunc_memset_pattern8:
1213 case LibFunc_memset_pattern16:
1218 case LibFunc_memset:
1221 case LibFunc_memset_chk:
1233 case LibFunc_terminate:
1238 case LibFunc_cxa_throw:
1244 case LibFunc_nvvm_reflect:
1252 case LibFunc_acoshf:
1253 case LibFunc_acoshl:
1258 case LibFunc_asinhf:
1259 case LibFunc_asinhl:
1263 case LibFunc_atan2f:
1264 case LibFunc_atan2l:
1267 case LibFunc_atanhf:
1268 case LibFunc_atanhl:
1277 case LibFunc_cospif:
1281 case LibFunc_tgamma:
1282 case LibFunc_tgammaf:
1283 case LibFunc_tgammal:
1291 case LibFunc_expm1f:
1292 case LibFunc_expm1l:
1300 case LibFunc_hypotf:
1301 case LibFunc_hypotl:
1303 case LibFunc_ldexpf:
1304 case LibFunc_ldexpl:
1307 case LibFunc_log10f:
1308 case LibFunc_log10l:
1310 case LibFunc_log1pf:
1311 case LibFunc_log1pl:
1319 case LibFunc_ilogbf:
1320 case LibFunc_ilogbl:
1323 case LibFunc_nextafter:
1324 case LibFunc_nextafterf:
1325 case LibFunc_nextafterl:
1326 case LibFunc_nexttoward:
1327 case LibFunc_nexttowardf:
1328 case LibFunc_nexttowardl:
1332 case LibFunc_remainder:
1333 case LibFunc_remainderf:
1334 case LibFunc_remainderl:
1338 case LibFunc_scalbln:
1339 case LibFunc_scalblnf:
1340 case LibFunc_scalblnl:
1341 case LibFunc_scalbn:
1342 case LibFunc_scalbnf:
1343 case LibFunc_scalbnl:
1345 case LibFunc_sincospif_stret:
1352 case LibFunc_sinpif:
1373 case LibFunc_copysign:
1374 case LibFunc_copysignf:
1375 case LibFunc_copysignl:
1386 case LibFunc_floorf:
1387 case LibFunc_floorl:
1397 case LibFunc_fmaximum_num:
1398 case LibFunc_fmaximum_numf:
1399 case LibFunc_fmaximum_numl:
1400 case LibFunc_fminimum_num:
1401 case LibFunc_fminimum_numf:
1402 case LibFunc_fminimum_numl:
1405 case LibFunc_nearbyint:
1406 case LibFunc_nearbyintf:
1407 case LibFunc_nearbyintl:
1409 case LibFunc_roundf:
1410 case LibFunc_roundl:
1411 case LibFunc_roundeven:
1412 case LibFunc_roundevenf:
1413 case LibFunc_roundevenl:
1414 case LibFunc_toascii:
1416 case LibFunc_truncf:
1417 case LibFunc_truncl:
1420 case LibFunc_isascii:
1421 case LibFunc_isdigit:
1427 case LibFunc_sincos:
1428 case LibFunc_sincosf:
1429 case LibFunc_sincosl:
1433 case LibFunc_remquo:
1434 case LibFunc_remquof:
1435 case LibFunc_remquol:
1461 F.addParamAttr(ArgNo, ExtAttr);
1468 F.addRetAttr(ExtAttr);
1473 if (!
F->arg_size() ||
F->isVarArg())
1480 const Module *M =
F->getParent();
1481 unsigned N = M->getNumberRegisterParameters();
1489 if (!
T->isIntOrPtrTy())
1496 assert(TS <= 4 &&
"Need to account for parameters larger than word size");
1497 const unsigned NumRegs = TS > 4 ? 2 : 1;
1502 F->addParamAttr(
A.getArgNo(), Attribute::InReg);
1508 AttributeList AttributeList) {
1510 "Creating call to non-existing library function.");
1524 assert(
F->getFunctionType() ==
T &&
"Function type does not match.");
1525 switch (TheLibFunc) {
1527 case LibFunc_putchar:
1531 case LibFunc_ldexpf:
1532 case LibFunc_ldexpl:
1533 case LibFunc_memchr:
1534 case LibFunc_memrchr:
1535 case LibFunc_strchr:
1538 case LibFunc_memccpy:
1548 case LibFunc_calloc:
1549 case LibFunc_fwrite:
1550 case LibFunc_malloc:
1551 case LibFunc_memcmp:
1552 case LibFunc_memcpy_chk:
1553 case LibFunc_mempcpy:
1554 case LibFunc_memset_pattern16:
1555 case LibFunc_snprintf:
1556 case LibFunc_stpncpy:
1557 case LibFunc_strlcat:
1558 case LibFunc_strlcpy:
1559 case LibFunc_strncat:
1560 case LibFunc_strncmp:
1561 case LibFunc_strncpy:
1562 case LibFunc_vsnprintf:
1567 for (
unsigned i = 0; i <
T->getNumParams(); i++)
1569 "Unhandled integer argument.");
1585 LibFunc TheLibFunc) {
1587 if (!TLI->
has(TheLibFunc))
1592 if (
GlobalValue *GV = M->getNamedValue(FuncName)) {
1609 LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn) {
1610 switch (Ty->getTypeID()) {
1623 Type *Ty, LibFunc DoubleFn, LibFunc FloatFn,
1624 LibFunc LongDoubleFn, LibFunc &TheLibFunc) {
1626 "Cannot get name for unavailable function!");
1628 switch (Ty->getTypeID()) {
1632 TheLibFunc = FloatFn;
1635 TheLibFunc = DoubleFn;
1636 return TLI->
getName(DoubleFn);
1638 TheLibFunc = LongDoubleFn;
1639 return TLI->
getName(LongDoubleFn);
1650 const Module *M =
B.GetInsertBlock()->getModule();
1658 bool IsVaArgs =
false) {
1659 Module *M =
B.GetInsertBlock()->getModule();
1667 CallInst *CI =
B.CreateCall(Callee, Operands, FuncName);
1676 Type *CharPtrTy =
B.getPtrTy();
1678 return emitLibCall(LibFunc_strlen, SizeTTy, CharPtrTy, Ptr,
B, TLI);
1684 "Argument to wcslen intrinsic must be a pointer.");
1685 Type *PtrTy =
B.getPtrTy();
1687 return emitLibCall(LibFunc_wcslen, SizeTTy, PtrTy, Ptr,
B, TLI);
1692 Type *CharPtrTy =
B.getPtrTy();
1693 return emitLibCall(LibFunc_strdup, CharPtrTy, CharPtrTy, Ptr,
B, TLI);
1698 Type *CharPtrTy =
B.getPtrTy();
1700 return emitLibCall(LibFunc_strchr, CharPtrTy, {CharPtrTy, IntTy},
1701 {Ptr, ConstantInt::get(IntTy, (
unsigned char)
C)},
B, TLI);
1706 Type *CharPtrTy =
B.getPtrTy();
1710 LibFunc_strncmp, IntTy,
1711 {CharPtrTy, CharPtrTy, SizeTTy},
1712 {Ptr1, Ptr2, Len},
B, TLI);
1717 Type *CharPtrTy = Dst->getType();
1718 return emitLibCall(LibFunc_strcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1719 {Dst, Src},
B, TLI);
1724 Type *CharPtrTy =
B.getPtrTy();
1725 return emitLibCall(LibFunc_stpcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1726 {Dst, Src},
B, TLI);
1731 Type *CharPtrTy =
B.getPtrTy();
1733 return emitLibCall(LibFunc_strncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1734 {Dst, Src, Len},
B, TLI);
1739 Type *CharPtrTy =
B.getPtrTy();
1741 return emitLibCall(LibFunc_stpncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1742 {Dst, Src, Len},
B, TLI);
1748 Module *M =
B.GetInsertBlock()->getModule();
1753 AS = AttributeList::get(M->getContext(), AttributeList::FunctionIndex,
1754 Attribute::NoUnwind);
1755 Type *VoidPtrTy =
B.getPtrTy();
1758 AttributeList::get(M->getContext(), AS), VoidPtrTy,
1759 VoidPtrTy, VoidPtrTy, SizeTTy, SizeTTy);
1760 CallInst *CI =
B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
1769 Type *VoidPtrTy =
B.getPtrTy();
1772 {VoidPtrTy, VoidPtrTy, SizeTTy},
1773 {Dst, Src, Len},
B, TLI);
1778 Type *VoidPtrTy =
B.getPtrTy();
1782 {VoidPtrTy, IntTy, SizeTTy},
1783 {Ptr, Val, Len},
B, TLI);
1788 Type *VoidPtrTy =
B.getPtrTy();
1792 {VoidPtrTy, IntTy, SizeTTy},
1793 {Ptr, Val, Len},
B, TLI);
1798 Type *VoidPtrTy =
B.getPtrTy();
1802 {VoidPtrTy, VoidPtrTy, SizeTTy},
1803 {Ptr1, Ptr2, Len},
B, TLI);
1808 Type *VoidPtrTy =
B.getPtrTy();
1812 {VoidPtrTy, VoidPtrTy, SizeTTy},
1813 {Ptr1, Ptr2, Len},
B, TLI);
1818 Type *VoidPtrTy =
B.getPtrTy();
1822 {VoidPtrTy, VoidPtrTy, IntTy, SizeTTy},
1823 {Ptr1, Ptr2, Val, Len},
B, TLI);
1829 Type *CharPtrTy =
B.getPtrTy();
1835 {CharPtrTy, SizeTTy, CharPtrTy},
1836 Args,
B, TLI,
true);
1842 Type *CharPtrTy =
B.getPtrTy();
1847 {CharPtrTy, CharPtrTy}, Args,
B, TLI,
1853 Type *CharPtrTy =
B.getPtrTy();
1855 {CharPtrTy, CharPtrTy},
1856 {Dest, Src},
B, TLI);
1861 Type *CharPtrTy =
B.getPtrTy();
1864 {CharPtrTy, CharPtrTy, SizeTTy},
1865 {Dest, Src,
Size},
B, TLI);
1870 Type *CharPtrTy =
B.getPtrTy();
1873 {CharPtrTy, CharPtrTy, SizeTTy},
1874 {Dest, Src,
Size},
B, TLI);
1879 Type *CharPtrTy =
B.getPtrTy();
1882 {CharPtrTy, CharPtrTy, SizeTTy},
1883 {Dest, Src,
Size},
B, TLI);
1888 Type *CharPtrTy =
B.getPtrTy();
1892 LibFunc_vsnprintf, IntTy,
1893 {CharPtrTy, SizeTTy, CharPtrTy, VAList->
getType()},
1894 {Dest,
Size, Fmt, VAList},
B, TLI);
1899 Type *CharPtrTy =
B.getPtrTy();
1902 {CharPtrTy, CharPtrTy, VAList->
getType()},
1903 {Dest, Fmt, VAList},
B, TLI);
1909 if (!
Op->getType()->isDoubleTy()) {
1912 if (
Op->getType()->isFloatTy())
1923 const AttributeList &Attrs,
1925 assert((Name !=
"") &&
"Must specify Name to emitUnaryFloatFnCall");
1927 Module *M =
B.GetInsertBlock()->getModule();
1936 Attrs.removeFnAttribute(
B.getContext(), Attribute::Speculatable));
1946 const AttributeList &Attrs) {
1957 LibFunc DoubleFn, LibFunc FloatFn,
1959 const AttributeList &Attrs) {
1961 Module *M =
B.GetInsertBlock()->getModule();
1964 LongDoubleFn, TheLibFunc);
1972 const AttributeList &Attrs,
1974 assert((Name !=
"") &&
"Must specify Name to emitBinaryFloatFnCall");
1976 Module *M =
B.GetInsertBlock()->getModule();
1980 CallInst *CI =
B.CreateCall(Callee, { Op1, Op2 }, Name);
1986 Attrs.removeFnAttribute(
B.getContext(), Attribute::Speculatable));
1997 const AttributeList &Attrs) {
1998 assert((Name !=
"") &&
"Must specify Name to emitBinaryFloatFnCall");
2011 LibFunc DoubleFn, LibFunc FloatFn,
2013 const AttributeList &Attrs) {
2015 Module *M =
B.GetInsertBlock()->getModule();
2018 LongDoubleFn, TheLibFunc);
2027 Module *M =
B.GetInsertBlock()->getModule();
2036 CallInst *CI =
B.CreateCall(PutChar, Char, PutCharName);
2046 Module *M =
B.GetInsertBlock()->getModule();
2055 CallInst *CI =
B.CreateCall(PutS, Str, PutsName);
2064 Module *M =
B.GetInsertBlock()->getModule();
2071 IntTy, File->getType());
2072 if (File->getType()->isPointerTy())
2074 CallInst *CI =
B.CreateCall(
F, {Char, File}, FPutcName);
2084 Module *M =
B.GetInsertBlock()->getModule();
2091 B.getPtrTy(), File->getType());
2092 if (File->getType()->isPointerTy())
2094 CallInst *CI =
B.CreateCall(
F, {Str, File}, FPutsName);
2104 Module *M =
B.GetInsertBlock()->getModule();
2112 SizeTTy, SizeTTy, File->getType());
2114 if (File->getType()->isPointerTy())
2117 B.CreateCall(
F, {Ptr,
Size,
2118 ConstantInt::get(SizeTTy, 1), File});
2128 Module *M =
B.GetInsertBlock()->getModule();
2148 Module *M =
B.GetInsertBlock()->getModule();
2155 M, TLI, LibFunc_calloc,
B.getPtrTy(AddrSpace), SizeTTy, SizeTTy);
2157 CallInst *CI =
B.CreateCall(Calloc, {Num,
Size}, CallocName);
2168 LibFunc SizeFeedbackNewFunc,
2170 Module *M =
B.GetInsertBlock()->getModule();
2180 M->getOrInsertFunction(Name, SizedPtrT, Num->
getType(),
B.getInt8Ty());
2182 CallInst *CI =
B.CreateCall(Func, {Num,
B.getInt8(HotCold)},
"sized_ptr");
2193 LibFunc SizeFeedbackNewFunc,
2195 Module *M =
B.GetInsertBlock()->getModule();
2205 Align->getType(),
B.getInt8Ty());
2208 B.CreateCall(Func, {Num,
Align,
B.getInt8(HotCold)},
"sized_ptr");
2219 Module *M =
B.GetInsertBlock()->getModule();
2225 M->getOrInsertFunction(Name,
B.getPtrTy(), Num->
getType(),
B.getInt8Ty());
2227 CallInst *CI =
B.CreateCall(Func, {Num,
B.getInt8(HotCold)}, Name);
2238 LibFunc NewFunc,
uint8_t HotCold) {
2239 Module *M =
B.GetInsertBlock()->getModule();
2247 CallInst *CI =
B.CreateCall(Func, {Num, NoThrow,
B.getInt8(HotCold)}, Name);
2258 LibFunc NewFunc,
uint8_t HotCold) {
2259 Module *M =
B.GetInsertBlock()->getModule();
2265 Name,
B.getPtrTy(), Num->
getType(),
Align->getType(),
B.getInt8Ty());
2267 CallInst *CI =
B.CreateCall(Func, {Num,
Align,
B.getInt8(HotCold)}, Name);
2279 LibFunc NewFunc,
uint8_t HotCold) {
2280 Module *M =
B.GetInsertBlock()->getModule();
2290 B.CreateCall(Func, {Num,
Align, NoThrow,
B.getInt8(HotCold)}, Name);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool setRetNoUndef(Function &F)
static bool setOnlyAccessesInaccessibleMemOrArgMemOrErrnoMem(Function &F)
static void appendTypeSuffix(Value *Op, StringRef &Name, SmallString< 20 > &NameBuffer)
Append a suffix to the function name according to the type of 'Op'.
static bool setDoesNotSync(Function &F)
static bool setDoesNotAlias(Function &F, unsigned ArgNo)
static bool setDoesNotAccessMemory(Function &F)
static bool setOnlyAccessesInaccessibleMemOrErrnoMem(Function &F)
static bool setOnlyWritesArgMemOrErrnoMem(Function &F)
static bool setArgsNoUndef(Function &F)
static IntegerType * getSizeTTy(IRBuilderBase &B, const TargetLibraryInfo *TLI)
static Value * emitUnaryFloatFnCallHelper(Value *Op, LibFunc TheLibFunc, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs, const TargetLibraryInfo *TLI)
static bool setAllocatedPointerParam(Function &F, unsigned ArgNo)
static void setRetExtAttr(Function &F, const TargetLibraryInfo &TLI, bool Signed=true)
static bool setMemoryEffects(Function &F, MemoryEffects ME)
static Value * emitLibCall(LibFunc TheLibFunc, Type *ReturnType, ArrayRef< Type * > ParamTypes, ArrayRef< Value * > Operands, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool IsVaArgs=false)
static bool setNonLazyBind(Function &F)
static bool setIsCold(Function &F)
static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F)
static bool setAllocSize(Function &F, unsigned ElemSizeArg, std::optional< unsigned > NumElemsArg)
static bool setAlignedAllocParam(Function &F, unsigned ArgNo)
static bool setRetAndArgsNoUndef(Function &F)
static bool setRetDoesNotAlias(Function &F)
static bool setReturnedArg(Function &F, unsigned ArgNo)
static Value * emitBinaryFloatFnCallHelper(Value *Op1, Value *Op2, LibFunc TheLibFunc, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs, const TargetLibraryInfo *TLI)
static bool setOnlyWritesErrnoMemory(Function &F)
static bool setDoesNotCapture(Function &F, unsigned ArgNo)
static bool setDoesNotThrow(Function &F)
static bool setWillReturn(Function &F)
static bool setAllocKind(Function &F, AllocFnKind K)
static bool setNoReturn(Function &F)
static IntegerType * getIntTy(IRBuilderBase &B, const TargetLibraryInfo *TLI)
static bool setAllocFamily(Function &F, StringRef Family)
static bool setArgNoUndef(Function &F, unsigned ArgNo)
static bool setDoesNotCallback(Function &F)
static void setArgExtAttr(Function &F, unsigned ArgNo, const TargetLibraryInfo &TLI, bool Signed=true)
static bool setOnlyAccessesArgMemory(Function &F)
static bool setOnlyWritesMemory(Function &F)
static bool setOnlyReadsMemory(Function &F)
static bool setDoesNotFreeMemory(Function &F)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
This file defines the SmallString class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This class represents an incoming formal argument to a Function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
static LLVM_ABI Attribute getWithAllocSizeArgs(LLVMContext &Context, unsigned ElemSizeArg, const std::optional< unsigned > &NumElemsArg)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ None
No attributes have been set.
static LLVM_ABI Attribute getWithCaptureInfo(LLVMContext &Context, CaptureInfo CI)
void setCallingConv(CallingConv::ID CC)
void setAttributes(AttributeList A)
Set the attributes for this call.
This class represents a function call, abstracting a target machine's calling convention.
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
A parsed version of the target data layout string in and methods for querying it.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Class to represent function types.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
Common base class shared among various IRBuilders.
Class to represent integer types.
static MemoryEffectsBase readOnly()
static MemoryEffectsBase inaccessibleOrArgOrErrnoMemOnly(ModRefInfo InaccessibleOrArgMR=ModRefInfo::ModRef, ModRefInfo ErrnoMR=ModRefInfo::ModRef)
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase argumentOrErrnoMemOnly(ModRefInfo ArgMR=ModRefInfo::ModRef, ModRefInfo ErrnoMR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrErrnoMemOnly(ModRefInfo InaccessibleMR=ModRefInfo::ModRef, ModRefInfo ErrnoMR=ModRefInfo::ModRef)
A Module instance is used to store all the information related to an LLVM module.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Class to represent struct types.
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.
Provides information about what library functions are available for the current target.
bool isValidProtoForLibFunc(const FunctionType &FTy, LibFunc F, const Module &M) const
Return true if the function type FTy is valid for the library function F, regardless of whether the f...
bool has(LibFunc F) const
Tests whether a library function is available.
unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
StringRef getName(LibFunc F) const
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isPointerTy() const
True if this is an instance of PointerType.
@ HalfTyID
16-bit floating point type
@ FloatTyID
32-bit floating point type
@ DoubleTyID
64-bit floating point type
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
#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.
@ X86_StdCall
stdcall is mostly used by the Win32 API.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI Value * emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the unary function named 'Name' (e.g.
LLVM_ABI Value * emitStrChr(Value *Ptr, char C, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strchr function to the builder, for the specified pointer and character.
LLVM_ABI Value * emitPutChar(Value *Char, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the putchar function. This assumes that Char is an 'int'.
LLVM_ABI Value * emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the __memcpy_chk function to the builder.
LLVM_ABI Value * emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI Value * emitHotColdNewAlignedNoThrow(Value *Num, Value *Align, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Value * emitSPrintf(Value *Dest, Value *Fmt, ArrayRef< Value * > VariadicArgs, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the sprintf function.
LLVM_ABI Value * emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memrchr function, analogously to emitMemChr.
LLVM_ABI Value * emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcat function.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn)
Check whether the overloaded floating point function corresponding to Ty is available.
LLVM_ABI bool inferNonMandatoryLibFuncAttrs(Module *M, StringRef Name, const TargetLibraryInfo &TLI)
Analyze the name and prototype of the given function and set any applicable attributes.
LLVM_ABI bool isLibFreeFunction(const Function *F, const LibFunc TLIFn)
isLibFreeFunction - Returns true if the function is a builtin free()
LLVM_ABI Value * emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncat function.
LLVM_ABI bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
LLVM_ABI Value * emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsnprintf function.
LLVM_ABI Value * emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strncmp function to the builder.
LLVM_ABI Value * emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memcmp function.
LLVM_ABI Value * emitBinaryFloatFnCall(Value *Op1, Value *Op2, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the binary function named 'Name' (e.g.
LLVM_ABI Value * emitFPutS(Value *Str, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the fputs function.
LLVM_ABI Value * emitStrDup(Value *Ptr, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strdup function to the builder, for the specified pointer.
LLVM_ABI Value * emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the bcmp function.
LLVM_ABI void markRegisterParameterAttributes(Function *F)
LLVM_ABI StringRef getFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn, LibFunc &TheLibFunc)
Get the name of the overloaded floating point function corresponding to Ty.
LLVM_ABI FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, LibFunc TheLibFunc, FunctionType *T, AttributeList AttributeList)
Calls getOrInsertFunction() and then makes sure to add mandatory argument attributes.
LLVM_ABI Value * emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strlen function to the builder, for the specified pointer.
LLVM_ABI Value * emitFPutC(Value *Char, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the fputc function.
LLVM_ABI Value * emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI Value * emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcat function.
LLVM_ABI Value * emitCalloc(Value *Num, Value *Size, IRBuilderBase &B, const TargetLibraryInfo &TLI, unsigned AddrSpace)
Emit a call to the calloc function.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI Value * emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsprintf function.
LLVM_ABI bool isReallocLikeFn(const Function *F)
Tests if a function is a call or invoke to a library function that reallocates memory (e....
LLVM_ABI Value * emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the fwrite function.
LLVM_ABI Value * emitSNPrintf(Value *Dest, Value *Size, Value *Fmt, ArrayRef< Value * > Args, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the snprintf function.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
LLVM_ABI Value * emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpcpy function to the builder, for the specified pointer arguments.
DWARFExpression::Operation Op
LLVM_ABI Value * emitWcsLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the wcslen function to the builder, for the specified pointer.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Value * emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the malloc function.
LLVM_ABI Value * emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memchr function.
LLVM_ABI Value * emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the puts function. This assumes that Str is some pointer.
LLVM_ABI Value * emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the memccpy function.
LLVM_ABI Value * emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitHotColdNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
Emit a call to the hot/cold operator new function.
LLVM_ABI Value * emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcpy function.
LLVM_ABI Value * emitHotColdSizeReturningNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcpy function to the builder, for the specified pointer arguments.
LLVM_ABI Value * emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the mempcpy function.
This struct is a compact representation of a valid (non-zero power of two) alignment.