32#define DEBUG_TYPE "build-libcalls"
36STATISTIC(NumReadNone,
"Number of functions inferred as readnone");
38 "Number of functions inferred as inaccessiblememonly");
39STATISTIC(NumReadOnly,
"Number of functions inferred as readonly");
40STATISTIC(NumWriteOnly,
"Number of functions inferred as writeonly");
41STATISTIC(NumArgMemOnly,
"Number of functions inferred as argmemonly");
43 "Number of functions inferred as memory(errnomem: write)");
45 "Number of functions inferred as inaccessiblemem_or_argmemonly");
47 NumWriteArgumentMemOrErrnoMemOnly,
48 "Number of functions inferred as memory(argmem: write, errnomem: write)");
49STATISTIC(NumNoUnwind,
"Number of functions inferred as nounwind");
50STATISTIC(NumNoCallback,
"Number of functions inferred as nocallback");
51STATISTIC(NumNoCapture,
"Number of arguments inferred as nocapture");
52STATISTIC(NumWriteOnlyArg,
"Number of arguments inferred as writeonly");
53STATISTIC(NumReadOnlyArg,
"Number of arguments inferred as readonly");
54STATISTIC(NumNoAlias,
"Number of function returns inferred as noalias");
55STATISTIC(NumNoUndef,
"Number of function returns inferred as noundef returns");
56STATISTIC(NumReturnedArg,
"Number of arguments inferred as returned");
57STATISTIC(NumWillReturn,
"Number of functions inferred as willreturn");
58STATISTIC(NumCold,
"Number of functions inferred as cold");
59STATISTIC(NumNoReturn,
"Number of functions inferred as no return");
62 if (
F.doesNotAccessMemory())
64 F.setDoesNotAccessMemory();
70 if (
F.hasFnAttribute(Attribute::Cold))
72 F.addFnAttr(Attribute::Cold);
78 if (
F.hasFnAttribute(Attribute::NoReturn))
80 F.addFnAttr(Attribute::NoReturn);
90 F.setMemoryEffects(NewME);
97 ++NumInaccessibleMemOnly;
125 ++NumInaccessibleMemOrArgMemOnly;
132 ++NumWriteErrnoMemOnly;
140 ++NumWriteArgumentMemOrErrnoMemOnly;
145 if (
F.doesNotThrow())
153 if (
F.hasFnAttribute(Attribute::NoCallback))
155 F.addFnAttr(Attribute::NoCallback);
161 if (
F.hasRetAttribute(Attribute::NoAlias))
163 F.addRetAttr(Attribute::NoAlias);
169 if (
F.hasParamAttribute(ArgNo, Attribute::Captures))
178 if (
F.hasParamAttribute(ArgNo, Attribute::NoAlias))
180 F.addParamAttr(ArgNo, Attribute::NoAlias);
186 if (
F.hasParamAttribute(ArgNo, Attribute::ReadOnly))
188 F.addParamAttr(ArgNo, Attribute::ReadOnly);
194 if (
F.hasParamAttribute(ArgNo, Attribute::WriteOnly))
196 F.addParamAttr(ArgNo, Attribute::WriteOnly);
202 if (!
F.getReturnType()->isVoidTy() &&
203 !
F.hasRetAttribute(Attribute::NoUndef)) {
204 F.addRetAttr(Attribute::NoUndef);
213 for (
unsigned ArgNo = 0; ArgNo <
F.arg_size(); ++ArgNo) {
214 if (!
F.hasParamAttribute(ArgNo, Attribute::NoUndef)) {
215 F.addParamAttr(ArgNo, Attribute::NoUndef);
224 if (
F.hasParamAttribute(ArgNo, Attribute::NoUndef))
226 F.addParamAttr(ArgNo, Attribute::NoUndef);
232 bool UndefAdded =
false;
239 if (
F.hasParamAttribute(ArgNo, Attribute::Returned))
241 F.addParamAttr(ArgNo, Attribute::Returned);
247 if (
F.hasFnAttribute(Attribute::NonLazyBind))
249 F.addFnAttr(Attribute::NonLazyBind);
254 if (
F.hasFnAttribute(Attribute::NoFree))
256 F.addFnAttr(Attribute::NoFree);
261 if (
F.hasFnAttribute(Attribute::WillReturn))
263 F.addFnAttr(Attribute::WillReturn);
269 if (
F.hasParamAttribute(ArgNo, Attribute::AllocAlign))
271 F.addParamAttr(ArgNo, Attribute::AllocAlign);
276 if (
F.hasParamAttribute(ArgNo, Attribute::AllocatedPointer))
278 F.addParamAttr(ArgNo, Attribute::AllocatedPointer);
283 std::optional<unsigned> NumElemsArg) {
284 if (
F.hasFnAttribute(Attribute::AllocSize))
292 if (
F.hasFnAttribute(
"alloc-family"))
294 F.addFnAttr(
"alloc-family", Family);
299 if (
F.hasFnAttribute(Attribute::AllocKind))
322 if (
F.getParent() !=
nullptr &&
F.getParent()->getRtLibUseGOT())
325 switch (TheLibFunc) {
330 case LibFunc_strnlen:
340 case LibFunc_strrchr:
350 case LibFunc_strtoul:
351 case LibFunc_strtoll:
352 case LibFunc_strtold:
353 case LibFunc_strtoull:
361 case LibFunc_strncat:
373 case LibFunc_strncpy:
377 case LibFunc_stpncpy:
388 case LibFunc_strxfrm:
398 case LibFunc_strncmp:
399 case LibFunc_strcspn:
408 case LibFunc_strcoll:
409 case LibFunc_strcasecmp:
410 case LibFunc_strncasecmp:
421 case LibFunc_strpbrk:
430 case LibFunc_strtok_r:
444 case LibFunc_setvbuf:
449 case LibFunc_strndup:
462 case LibFunc_statvfs:
477 case LibFunc_sprintf:
486 case LibFunc_snprintf:
495 case LibFunc_setitimer:
509 case LibFunc_aligned_alloc:
516 case LibFunc_vec_malloc:
519 case LibFunc_pvalloc:
539 case LibFunc_memrchr:
568 case LibFunc_memmove:
578 case LibFunc_mempcpy:
579 case LibFunc_memccpy:
582 case LibFunc_memcpy_chk:
592 case LibFunc_memalign:
616 case LibFunc_realloc:
617 case LibFunc_reallocf:
618 case LibFunc_vec_realloc:
620 F, TheLibFunc == LibFunc_vec_realloc ?
"vec_malloc" :
"malloc");
632 case LibFunc_reallocarray:
658 case LibFunc_realpath:
672 case LibFunc_readlink:
713 case LibFunc_vec_calloc:
731 case LibFunc_ctermid:
732 case LibFunc_clearerr:
733 case LibFunc_closedir:
776 case LibFunc_vec_free:
790 case LibFunc_fgetc_unlocked:
796 case LibFunc_fsetpos:
797 case LibFunc_flockfile:
798 case LibFunc_funlockfile:
799 case LibFunc_ftrylockfile:
811 case LibFunc_fputc_unlocked:
827 case LibFunc_fstatvfs:
833 case LibFunc_fgets_unlocked:
840 case LibFunc_fread_unlocked:
848 case LibFunc_fwrite_unlocked:
856 case LibFunc_fputs_unlocked:
864 case LibFunc_fprintf:
871 case LibFunc_fgetpos:
882 case LibFunc_getlogin_r:
887 case LibFunc_getc_unlocked:
899 case LibFunc_getchar:
900 case LibFunc_getchar_unlocked:
904 case LibFunc_getitimer:
909 case LibFunc_getpwnam:
931 case LibFunc_unsetenv:
947 case LibFunc_putc_unlocked:
971 case LibFunc_putchar:
972 case LibFunc_putchar_unlocked:
996 case LibFunc_vsscanf:
1004 case LibFunc_vfscanf:
1011 case LibFunc_vprintf:
1017 case LibFunc_vfprintf:
1018 case LibFunc_vsprintf:
1025 case LibFunc_vsnprintf:
1038 case LibFunc_opendir:
1045 case LibFunc_tmpfile:
1070 case LibFunc_lchown:
1082 case LibFunc_dunder_strndup:
1085 case LibFunc_dunder_strdup:
1092 case LibFunc_dunder_strtok_r:
1098 case LibFunc_under_IO_getc:
1103 case LibFunc_under_IO_putc:
1108 case LibFunc_dunder_isoc99_scanf:
1114 case LibFunc_stat64:
1115 case LibFunc_lstat64:
1116 case LibFunc_statvfs64:
1123 case LibFunc_dunder_isoc99_sscanf:
1131 case LibFunc_fopen64:
1140 case LibFunc_fseeko64:
1141 case LibFunc_ftello64:
1146 case LibFunc_tmpfile64:
1151 case LibFunc_fstat64:
1152 case LibFunc_fstatvfs64:
1157 case LibFunc_open64:
1163 case LibFunc_gettimeofday:
1172 case LibFunc_memset_pattern4:
1173 case LibFunc_memset_pattern8:
1174 case LibFunc_memset_pattern16:
1179 case LibFunc_memset:
1182 case LibFunc_memset_chk:
1193 case LibFunc_terminate:
1198 case LibFunc_cxa_throw:
1204 case LibFunc_nvvm_reflect:
1212 case LibFunc_acoshf:
1213 case LibFunc_acoshl:
1218 case LibFunc_asinhf:
1219 case LibFunc_asinhl:
1223 case LibFunc_atan2f:
1224 case LibFunc_atan2l:
1227 case LibFunc_atanhf:
1228 case LibFunc_atanhl:
1237 case LibFunc_cospif:
1241 case LibFunc_tgamma:
1242 case LibFunc_tgammaf:
1243 case LibFunc_tgammal:
1251 case LibFunc_expm1f:
1252 case LibFunc_expm1l:
1260 case LibFunc_hypotf:
1261 case LibFunc_hypotl:
1263 case LibFunc_ldexpf:
1264 case LibFunc_ldexpl:
1267 case LibFunc_log10f:
1268 case LibFunc_log10l:
1270 case LibFunc_log1pf:
1271 case LibFunc_log1pl:
1279 case LibFunc_ilogbf:
1280 case LibFunc_ilogbl:
1283 case LibFunc_nextafter:
1284 case LibFunc_nextafterf:
1285 case LibFunc_nextafterl:
1286 case LibFunc_nexttoward:
1287 case LibFunc_nexttowardf:
1288 case LibFunc_nexttowardl:
1292 case LibFunc_remainder:
1293 case LibFunc_remainderf:
1294 case LibFunc_remainderl:
1298 case LibFunc_scalbln:
1299 case LibFunc_scalblnf:
1300 case LibFunc_scalblnl:
1301 case LibFunc_scalbn:
1302 case LibFunc_scalbnf:
1303 case LibFunc_scalbnl:
1305 case LibFunc_sincospif_stret:
1312 case LibFunc_sinpif:
1332 case LibFunc_copysign:
1333 case LibFunc_copysignf:
1334 case LibFunc_copysignl:
1345 case LibFunc_floorf:
1346 case LibFunc_floorl:
1356 case LibFunc_fmaximum_num:
1357 case LibFunc_fmaximum_numf:
1358 case LibFunc_fmaximum_numl:
1359 case LibFunc_fminimum_num:
1360 case LibFunc_fminimum_numf:
1361 case LibFunc_fminimum_numl:
1364 case LibFunc_nearbyint:
1365 case LibFunc_nearbyintf:
1366 case LibFunc_nearbyintl:
1368 case LibFunc_roundf:
1369 case LibFunc_roundl:
1370 case LibFunc_roundeven:
1371 case LibFunc_roundevenf:
1372 case LibFunc_roundevenl:
1373 case LibFunc_toascii:
1375 case LibFunc_truncf:
1376 case LibFunc_truncl:
1379 case LibFunc_isascii:
1380 case LibFunc_isdigit:
1386 case LibFunc_sincos:
1387 case LibFunc_sincosf:
1388 case LibFunc_sincosl:
1392 case LibFunc_remquo:
1393 case LibFunc_remquof:
1394 case LibFunc_remquol:
1419 F.addParamAttr(ArgNo, ExtAttr);
1426 F.addRetAttr(ExtAttr);
1431 if (!
F->arg_size() ||
F->isVarArg())
1438 const Module *M =
F->getParent();
1439 unsigned N = M->getNumberRegisterParameters();
1447 if (!
T->isIntOrPtrTy())
1454 assert(TS <= 4 &&
"Need to account for parameters larger than word size");
1455 const unsigned NumRegs = TS > 4 ? 2 : 1;
1460 F->addParamAttr(
A.getArgNo(), Attribute::InReg);
1466 AttributeList AttributeList) {
1468 "Creating call to non-existing library function.");
1482 assert(
F->getFunctionType() ==
T &&
"Function type does not match.");
1483 switch (TheLibFunc) {
1485 case LibFunc_putchar:
1489 case LibFunc_ldexpf:
1490 case LibFunc_ldexpl:
1491 case LibFunc_memchr:
1492 case LibFunc_memrchr:
1493 case LibFunc_strchr:
1496 case LibFunc_memccpy:
1506 case LibFunc_calloc:
1507 case LibFunc_fwrite:
1508 case LibFunc_malloc:
1509 case LibFunc_memcmp:
1510 case LibFunc_memcpy_chk:
1511 case LibFunc_mempcpy:
1512 case LibFunc_memset_pattern16:
1513 case LibFunc_snprintf:
1514 case LibFunc_stpncpy:
1515 case LibFunc_strlcat:
1516 case LibFunc_strlcpy:
1517 case LibFunc_strncat:
1518 case LibFunc_strncmp:
1519 case LibFunc_strncpy:
1520 case LibFunc_vsnprintf:
1525 for (
unsigned i = 0; i <
T->getNumParams(); i++)
1527 "Unhandled integer argument.");
1543 LibFunc TheLibFunc) {
1545 if (!TLI->
has(TheLibFunc))
1550 if (
GlobalValue *GV = M->getNamedValue(FuncName)) {
1567 LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn) {
1568 switch (Ty->getTypeID()) {
1581 Type *Ty, LibFunc DoubleFn, LibFunc FloatFn,
1582 LibFunc LongDoubleFn, LibFunc &TheLibFunc) {
1584 "Cannot get name for unavailable function!");
1586 switch (Ty->getTypeID()) {
1590 TheLibFunc = FloatFn;
1593 TheLibFunc = DoubleFn;
1594 return TLI->
getName(DoubleFn);
1596 TheLibFunc = LongDoubleFn;
1597 return TLI->
getName(LongDoubleFn);
1608 const Module *M =
B.GetInsertBlock()->getModule();
1616 bool IsVaArgs =
false) {
1617 Module *M =
B.GetInsertBlock()->getModule();
1625 CallInst *CI =
B.CreateCall(Callee, Operands, FuncName);
1634 Type *CharPtrTy =
B.getPtrTy();
1636 return emitLibCall(LibFunc_strlen, SizeTTy, CharPtrTy, Ptr,
B, TLI);
1642 "Argument to wcslen intrinsic must be a pointer.");
1643 Type *PtrTy =
B.getPtrTy();
1645 return emitLibCall(LibFunc_wcslen, SizeTTy, PtrTy, Ptr,
B, TLI);
1650 Type *CharPtrTy =
B.getPtrTy();
1651 return emitLibCall(LibFunc_strdup, CharPtrTy, CharPtrTy, Ptr,
B, TLI);
1656 Type *CharPtrTy =
B.getPtrTy();
1658 return emitLibCall(LibFunc_strchr, CharPtrTy, {CharPtrTy, IntTy},
1659 {Ptr, ConstantInt::get(IntTy,
C)},
B, TLI);
1664 Type *CharPtrTy =
B.getPtrTy();
1668 LibFunc_strncmp, IntTy,
1669 {CharPtrTy, CharPtrTy, SizeTTy},
1670 {Ptr1, Ptr2, Len},
B, TLI);
1675 Type *CharPtrTy = Dst->getType();
1676 return emitLibCall(LibFunc_strcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1677 {Dst, Src},
B, TLI);
1682 Type *CharPtrTy =
B.getPtrTy();
1683 return emitLibCall(LibFunc_stpcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1684 {Dst, Src},
B, TLI);
1689 Type *CharPtrTy =
B.getPtrTy();
1691 return emitLibCall(LibFunc_strncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1692 {Dst, Src, Len},
B, TLI);
1697 Type *CharPtrTy =
B.getPtrTy();
1699 return emitLibCall(LibFunc_stpncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1700 {Dst, Src, Len},
B, TLI);
1706 Module *M =
B.GetInsertBlock()->getModule();
1711 AS = AttributeList::get(M->getContext(), AttributeList::FunctionIndex,
1712 Attribute::NoUnwind);
1713 Type *VoidPtrTy =
B.getPtrTy();
1716 AttributeList::get(M->getContext(), AS), VoidPtrTy,
1717 VoidPtrTy, VoidPtrTy, SizeTTy, SizeTTy);
1718 CallInst *CI =
B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
1727 Type *VoidPtrTy =
B.getPtrTy();
1730 {VoidPtrTy, VoidPtrTy, SizeTTy},
1731 {Dst, Src, Len},
B, TLI);
1736 Type *VoidPtrTy =
B.getPtrTy();
1740 {VoidPtrTy, IntTy, SizeTTy},
1741 {Ptr, Val, Len},
B, TLI);
1746 Type *VoidPtrTy =
B.getPtrTy();
1750 {VoidPtrTy, IntTy, SizeTTy},
1751 {Ptr, Val, Len},
B, TLI);
1756 Type *VoidPtrTy =
B.getPtrTy();
1760 {VoidPtrTy, VoidPtrTy, SizeTTy},
1761 {Ptr1, Ptr2, Len},
B, TLI);
1766 Type *VoidPtrTy =
B.getPtrTy();
1770 {VoidPtrTy, VoidPtrTy, SizeTTy},
1771 {Ptr1, Ptr2, Len},
B, TLI);
1776 Type *VoidPtrTy =
B.getPtrTy();
1780 {VoidPtrTy, VoidPtrTy, IntTy, SizeTTy},
1781 {Ptr1, Ptr2, Val, Len},
B, TLI);
1787 Type *CharPtrTy =
B.getPtrTy();
1793 {CharPtrTy, SizeTTy, CharPtrTy},
1794 Args,
B, TLI,
true);
1800 Type *CharPtrTy =
B.getPtrTy();
1805 {CharPtrTy, CharPtrTy}, Args,
B, TLI,
1811 Type *CharPtrTy =
B.getPtrTy();
1813 {CharPtrTy, CharPtrTy},
1814 {Dest, Src},
B, TLI);
1819 Type *CharPtrTy =
B.getPtrTy();
1822 {CharPtrTy, CharPtrTy, SizeTTy},
1823 {Dest, Src,
Size},
B, TLI);
1828 Type *CharPtrTy =
B.getPtrTy();
1831 {CharPtrTy, CharPtrTy, SizeTTy},
1832 {Dest, Src,
Size},
B, TLI);
1837 Type *CharPtrTy =
B.getPtrTy();
1840 {CharPtrTy, CharPtrTy, SizeTTy},
1841 {Dest, Src,
Size},
B, TLI);
1846 Type *CharPtrTy =
B.getPtrTy();
1850 LibFunc_vsnprintf, IntTy,
1851 {CharPtrTy, SizeTTy, CharPtrTy, VAList->
getType()},
1852 {Dest,
Size, Fmt, VAList},
B, TLI);
1857 Type *CharPtrTy =
B.getPtrTy();
1860 {CharPtrTy, CharPtrTy, VAList->
getType()},
1861 {Dest, Fmt, VAList},
B, TLI);
1867 if (!
Op->getType()->isDoubleTy()) {
1870 if (
Op->getType()->isFloatTy())
1881 const AttributeList &Attrs,
1883 assert((Name !=
"") &&
"Must specify Name to emitUnaryFloatFnCall");
1885 Module *M =
B.GetInsertBlock()->getModule();
1894 Attrs.removeFnAttribute(
B.getContext(), Attribute::Speculatable));
1904 const AttributeList &Attrs) {
1915 LibFunc DoubleFn, LibFunc FloatFn,
1917 const AttributeList &Attrs) {
1919 Module *M =
B.GetInsertBlock()->getModule();
1922 LongDoubleFn, TheLibFunc);
1930 const AttributeList &Attrs,
1932 assert((Name !=
"") &&
"Must specify Name to emitBinaryFloatFnCall");
1934 Module *M =
B.GetInsertBlock()->getModule();
1938 CallInst *CI =
B.CreateCall(Callee, { Op1, Op2 }, Name);
1944 Attrs.removeFnAttribute(
B.getContext(), Attribute::Speculatable));
1955 const AttributeList &Attrs) {
1956 assert((Name !=
"") &&
"Must specify Name to emitBinaryFloatFnCall");
1969 LibFunc DoubleFn, LibFunc FloatFn,
1971 const AttributeList &Attrs) {
1973 Module *M =
B.GetInsertBlock()->getModule();
1976 LongDoubleFn, TheLibFunc);
1985 Module *M =
B.GetInsertBlock()->getModule();
1994 CallInst *CI =
B.CreateCall(PutChar, Char, PutCharName);
2004 Module *M =
B.GetInsertBlock()->getModule();
2013 CallInst *CI =
B.CreateCall(PutS, Str, PutsName);
2022 Module *M =
B.GetInsertBlock()->getModule();
2029 IntTy, File->getType());
2030 if (File->getType()->isPointerTy())
2032 CallInst *CI =
B.CreateCall(
F, {Char, File}, FPutcName);
2042 Module *M =
B.GetInsertBlock()->getModule();
2049 B.getPtrTy(), File->getType());
2050 if (File->getType()->isPointerTy())
2052 CallInst *CI =
B.CreateCall(
F, {Str, File}, FPutsName);
2062 Module *M =
B.GetInsertBlock()->getModule();
2070 SizeTTy, SizeTTy, File->getType());
2072 if (File->getType()->isPointerTy())
2075 B.CreateCall(
F, {Ptr,
Size,
2076 ConstantInt::get(SizeTTy, 1), File});
2086 Module *M =
B.GetInsertBlock()->getModule();
2106 Module *M =
B.GetInsertBlock()->getModule();
2113 M, TLI, LibFunc_calloc,
B.getPtrTy(AddrSpace), SizeTTy, SizeTTy);
2115 CallInst *CI =
B.CreateCall(Calloc, {Num,
Size}, CallocName);
2126 LibFunc SizeFeedbackNewFunc,
2128 Module *M =
B.GetInsertBlock()->getModule();
2138 M->getOrInsertFunction(Name, SizedPtrT, Num->
getType(),
B.getInt8Ty());
2140 CallInst *CI =
B.CreateCall(Func, {Num,
B.getInt8(HotCold)},
"sized_ptr");
2151 LibFunc SizeFeedbackNewFunc,
2153 Module *M =
B.GetInsertBlock()->getModule();
2163 Align->getType(),
B.getInt8Ty());
2166 B.CreateCall(Func, {Num,
Align,
B.getInt8(HotCold)},
"sized_ptr");
2177 Module *M =
B.GetInsertBlock()->getModule();
2183 M->getOrInsertFunction(Name,
B.getPtrTy(), Num->
getType(),
B.getInt8Ty());
2185 CallInst *CI =
B.CreateCall(Func, {Num,
B.getInt8(HotCold)}, Name);
2196 LibFunc NewFunc,
uint8_t HotCold) {
2197 Module *M =
B.GetInsertBlock()->getModule();
2205 CallInst *CI =
B.CreateCall(Func, {Num, NoThrow,
B.getInt8(HotCold)}, Name);
2216 LibFunc NewFunc,
uint8_t HotCold) {
2217 Module *M =
B.GetInsertBlock()->getModule();
2223 Name,
B.getPtrTy(), Num->
getType(),
Align->getType(),
B.getInt8Ty());
2225 CallInst *CI =
B.CreateCall(Func, {Num,
Align,
B.getInt8(HotCold)}, Name);
2237 LibFunc NewFunc,
uint8_t HotCold) {
2238 Module *M =
B.GetInsertBlock()->getModule();
2248 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 void appendTypeSuffix(Value *Op, StringRef &Name, SmallString< 20 > &NameBuffer)
Append a suffix to the function name according to the type of 'Op'.
static bool setDoesNotAlias(Function &F, unsigned ArgNo)
static bool setDoesNotAccessMemory(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 bool setOnlyAccessesInaccessibleMemory(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.
ArrayRef - 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 argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(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)
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.
StringRef - 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.
@ 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.