summaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/TargetLibraryInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/TargetLibraryInfo.cpp')
-rw-r--r--llvm/lib/Analysis/TargetLibraryInfo.cpp300
1 files changed, 248 insertions, 52 deletions
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index 4a8818f2e2a8..7326ba74c071 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -123,6 +123,7 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
// Set IO unlocked variants as unavailable
// Set them as available per system below
+ TLI.setUnavailable(LibFunc_getc_unlocked);
TLI.setUnavailable(LibFunc_getchar_unlocked);
TLI.setUnavailable(LibFunc_putc_unlocked);
TLI.setUnavailable(LibFunc_putchar_unlocked);
@@ -156,15 +157,10 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
// isn't true for a target those defaults should be overridden below.
TLI.setIntSize(T.isArch16Bit() ? 16 : 32);
- if (T.isAMDGPU())
- TLI.disableAllFunctions();
-
- // There are no library implementations of memcpy and memset for AMD gpus and
- // these can be difficult to lower in the backend.
+ // There is really no runtime library on AMDGPU, apart from
+ // __kmpc_alloc/free_shared.
if (T.isAMDGPU()) {
- TLI.setUnavailable(LibFunc_memcpy);
- TLI.setUnavailable(LibFunc_memset);
- TLI.setUnavailable(LibFunc_memset_pattern16);
+ TLI.disableAllFunctions();
TLI.setAvailable(llvm::LibFunc___kmpc_alloc_shared);
TLI.setAvailable(llvm::LibFunc___kmpc_free_shared);
return;
@@ -418,6 +414,65 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_utimes);
}
+ // Pick just one set of new/delete variants.
+ if (T.isOSMSVCRT()) {
+ // MSVC, doesn't have the Itanium new/delete.
+ TLI.setUnavailable(LibFunc_ZdaPv);
+ TLI.setUnavailable(LibFunc_ZdaPvRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZdaPvj);
+ TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZdaPvm);
+ TLI.setUnavailable(LibFunc_ZdaPvmSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZdlPv);
+ TLI.setUnavailable(LibFunc_ZdlPvRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZdlPvj);
+ TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZdlPvm);
+ TLI.setUnavailable(LibFunc_ZdlPvmSt11align_val_t);
+ TLI.setUnavailable(LibFunc_Znaj);
+ TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_Znam);
+ TLI.setUnavailable(LibFunc_ZnamRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZnamSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_Znwj);
+ TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_Znwm);
+ TLI.setUnavailable(LibFunc_ZnwmRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZnwmSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t);
+ } else {
+ // Not MSVC, assume it's Itanium.
+ TLI.setUnavailable(LibFunc_msvc_new_int);
+ TLI.setUnavailable(LibFunc_msvc_new_int_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_new_longlong);
+ TLI.setUnavailable(LibFunc_msvc_new_longlong_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_delete_ptr32);
+ TLI.setUnavailable(LibFunc_msvc_delete_ptr32_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_delete_ptr32_int);
+ TLI.setUnavailable(LibFunc_msvc_delete_ptr64);
+ TLI.setUnavailable(LibFunc_msvc_delete_ptr64_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_delete_ptr64_longlong);
+ TLI.setUnavailable(LibFunc_msvc_new_array_int);
+ TLI.setUnavailable(LibFunc_msvc_new_array_int_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_new_array_longlong);
+ TLI.setUnavailable(LibFunc_msvc_new_array_longlong_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32);
+ TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_int);
+ TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64);
+ TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_nothrow);
+ TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_longlong);
+ }
+
switch (T.getOS()) {
case Triple::MacOSX:
// exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
@@ -572,6 +627,9 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_sinh_finite);
TLI.setUnavailable(LibFunc_sinhf_finite);
TLI.setUnavailable(LibFunc_sinhl_finite);
+ TLI.setUnavailable(LibFunc_sqrt_finite);
+ TLI.setUnavailable(LibFunc_sqrtf_finite);
+ TLI.setUnavailable(LibFunc_sqrtl_finite);
}
if ((T.isOSLinux() && T.isGNUEnvironment()) ||
@@ -589,6 +647,140 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setAvailable(LibFunc_fgets_unlocked);
}
+ if (T.isAndroid() && T.isAndroidVersionLT(21)) {
+ TLI.setUnavailable(LibFunc_stpcpy);
+ TLI.setUnavailable(LibFunc_stpncpy);
+ }
+
+ if (T.isPS4()) {
+ // PS4 does have memalign.
+ TLI.setAvailable(LibFunc_memalign);
+
+ // PS4 does not have new/delete with "unsigned int" size parameter;
+ // it only has the "unsigned long" versions.
+ TLI.setUnavailable(LibFunc_ZdaPvj);
+ TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZdlPvj);
+ TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
+ TLI.setUnavailable(LibFunc_Znaj);
+ TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_Znwj);
+ TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
+ TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
+ TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
+
+ // None of the *_chk functions.
+ TLI.setUnavailable(LibFunc_memccpy_chk);
+ TLI.setUnavailable(LibFunc_memcpy_chk);
+ TLI.setUnavailable(LibFunc_memmove_chk);
+ TLI.setUnavailable(LibFunc_mempcpy_chk);
+ TLI.setUnavailable(LibFunc_memset_chk);
+ TLI.setUnavailable(LibFunc_snprintf_chk);
+ TLI.setUnavailable(LibFunc_sprintf_chk);
+ TLI.setUnavailable(LibFunc_stpcpy_chk);
+ TLI.setUnavailable(LibFunc_stpncpy_chk);
+ TLI.setUnavailable(LibFunc_strcat_chk);
+ TLI.setUnavailable(LibFunc_strcpy_chk);
+ TLI.setUnavailable(LibFunc_strlcat_chk);
+ TLI.setUnavailable(LibFunc_strlcat_chk);
+ TLI.setUnavailable(LibFunc_strlcpy_chk);
+ TLI.setUnavailable(LibFunc_strlen_chk);
+ TLI.setUnavailable(LibFunc_strncat_chk);
+ TLI.setUnavailable(LibFunc_strncpy_chk);
+ TLI.setUnavailable(LibFunc_vsnprintf_chk);
+ TLI.setUnavailable(LibFunc_vsprintf_chk);
+
+ // Various Posix system functions.
+ TLI.setUnavailable(LibFunc_access);
+ TLI.setUnavailable(LibFunc_chmod);
+ TLI.setUnavailable(LibFunc_chown);
+ TLI.setUnavailable(LibFunc_closedir);
+ TLI.setUnavailable(LibFunc_ctermid);
+ TLI.setUnavailable(LibFunc_execl);
+ TLI.setUnavailable(LibFunc_execle);
+ TLI.setUnavailable(LibFunc_execlp);
+ TLI.setUnavailable(LibFunc_execv);
+ TLI.setUnavailable(LibFunc_execvP);
+ TLI.setUnavailable(LibFunc_execve);
+ TLI.setUnavailable(LibFunc_execvp);
+ TLI.setUnavailable(LibFunc_execvpe);
+ TLI.setUnavailable(LibFunc_fork);
+ TLI.setUnavailable(LibFunc_fstat);
+ TLI.setUnavailable(LibFunc_fstatvfs);
+ TLI.setUnavailable(LibFunc_getenv);
+ TLI.setUnavailable(LibFunc_getitimer);
+ TLI.setUnavailable(LibFunc_getlogin_r);
+ TLI.setUnavailable(LibFunc_getpwnam);
+ TLI.setUnavailable(LibFunc_gettimeofday);
+ TLI.setUnavailable(LibFunc_lchown);
+ TLI.setUnavailable(LibFunc_lstat);
+ TLI.setUnavailable(LibFunc_mkdir);
+ TLI.setUnavailable(LibFunc_open);
+ TLI.setUnavailable(LibFunc_opendir);
+ TLI.setUnavailable(LibFunc_pclose);
+ TLI.setUnavailable(LibFunc_popen);
+ TLI.setUnavailable(LibFunc_pread);
+ TLI.setUnavailable(LibFunc_pwrite);
+ TLI.setUnavailable(LibFunc_read);
+ TLI.setUnavailable(LibFunc_readlink);
+ TLI.setUnavailable(LibFunc_realpath);
+ TLI.setUnavailable(LibFunc_rename);
+ TLI.setUnavailable(LibFunc_rmdir);
+ TLI.setUnavailable(LibFunc_setitimer);
+ TLI.setUnavailable(LibFunc_stat);
+ TLI.setUnavailable(LibFunc_statvfs);
+ TLI.setUnavailable(LibFunc_system);
+ TLI.setUnavailable(LibFunc_times);
+ TLI.setUnavailable(LibFunc_tmpfile);
+ TLI.setUnavailable(LibFunc_unlink);
+ TLI.setUnavailable(LibFunc_uname);
+ TLI.setUnavailable(LibFunc_unsetenv);
+ TLI.setUnavailable(LibFunc_utime);
+ TLI.setUnavailable(LibFunc_utimes);
+ TLI.setUnavailable(LibFunc_valloc);
+ TLI.setUnavailable(LibFunc_write);
+
+ // Miscellaneous other functions not provided.
+ TLI.setUnavailable(LibFunc_atomic_load);
+ TLI.setUnavailable(LibFunc_atomic_store);
+ TLI.setUnavailable(LibFunc___kmpc_alloc_shared);
+ TLI.setUnavailable(LibFunc___kmpc_free_shared);
+ TLI.setUnavailable(LibFunc_dunder_strndup);
+ TLI.setUnavailable(LibFunc_bcmp);
+ TLI.setUnavailable(LibFunc_bcopy);
+ TLI.setUnavailable(LibFunc_bzero);
+ TLI.setUnavailable(LibFunc_cabs);
+ TLI.setUnavailable(LibFunc_cabsf);
+ TLI.setUnavailable(LibFunc_cabsl);
+ TLI.setUnavailable(LibFunc_ffs);
+ TLI.setUnavailable(LibFunc_flockfile);
+ TLI.setUnavailable(LibFunc_fseeko);
+ TLI.setUnavailable(LibFunc_ftello);
+ TLI.setUnavailable(LibFunc_ftrylockfile);
+ TLI.setUnavailable(LibFunc_funlockfile);
+ TLI.setUnavailable(LibFunc_htonl);
+ TLI.setUnavailable(LibFunc_htons);
+ TLI.setUnavailable(LibFunc_isascii);
+ TLI.setUnavailable(LibFunc_memccpy);
+ TLI.setUnavailable(LibFunc_mempcpy);
+ TLI.setUnavailable(LibFunc_memrchr);
+ TLI.setUnavailable(LibFunc_ntohl);
+ TLI.setUnavailable(LibFunc_ntohs);
+ TLI.setUnavailable(LibFunc_reallocf);
+ TLI.setUnavailable(LibFunc_roundeven);
+ TLI.setUnavailable(LibFunc_roundevenf);
+ TLI.setUnavailable(LibFunc_roundevenl);
+ TLI.setUnavailable(LibFunc_stpcpy);
+ TLI.setUnavailable(LibFunc_stpncpy);
+ TLI.setUnavailable(LibFunc_strlcat);
+ TLI.setUnavailable(LibFunc_strlcpy);
+ TLI.setUnavailable(LibFunc_strndup);
+ TLI.setUnavailable(LibFunc_strnlen);
+ TLI.setUnavailable(LibFunc_toascii);
+ }
+
// As currently implemented in clang, NVPTX code has no standard library to
// speak of. Headers provide a standard-ish library implementation, but many
// of the signatures are wrong -- for example, many libm functions are not
@@ -691,7 +883,7 @@ TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(TargetLibraryInfoImpl &&
static StringRef sanitizeFunctionName(StringRef funcName) {
// Filter out empty names and names containing null bytes, those can't be in
// our table.
- if (funcName.empty() || funcName.find('\0') != StringRef::npos)
+ if (funcName.empty() || funcName.contains('\0'))
return StringRef();
// Check for \01 prefix that is used to mangle __asm declarations and
@@ -716,12 +908,12 @@ bool TargetLibraryInfoImpl::getLibFunc(StringRef funcName, LibFunc &F) const {
bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
LibFunc F,
- const DataLayout *DL) const {
- LLVMContext &Ctx = FTy.getContext();
- Type *SizeTTy = DL ? DL->getIntPtrType(Ctx, /*AddressSpace=*/0) : nullptr;
- auto IsSizeTTy = [SizeTTy](Type *Ty) {
- return SizeTTy ? Ty == SizeTTy : Ty->isIntegerTy();
- };
+ const Module &M) const {
+ // FIXME: There is really no guarantee that sizeof(size_t) is equal to
+ // sizeof(int*) for every target. So the assumption used here to derive the
+ // SizeTBits based on the size of an integer pointer in address space zero
+ // isn't always valid.
+ unsigned SizeTBits = M.getDataLayout().getPointerSizeInBits(/*AddrSpace=*/0);
unsigned NumParams = FTy.getNumParams();
switch (F) {
@@ -745,12 +937,12 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
FTy.getReturnType()->isIntegerTy(32));
case LibFunc_strlen_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_strlen:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
- FTy.getReturnType()->isIntegerTy());
+ return NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
+ FTy.getReturnType()->isIntegerTy(SizeTBits);
case LibFunc_strchr:
case LibFunc_strrchr:
@@ -770,7 +962,7 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
FTy.getParamType(1)->isPointerTy());
case LibFunc_strcat_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_strcat:
@@ -780,19 +972,19 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_strncat_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_strncat:
return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
FTy.getParamType(0) == FTy.getReturnType() &&
FTy.getParamType(1) == FTy.getReturnType() &&
- IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_strcpy_chk:
case LibFunc_stpcpy_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_strcpy:
@@ -804,20 +996,20 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_strlcat_chk:
case LibFunc_strlcpy_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_strlcat:
case LibFunc_strlcpy:
- return NumParams == 3 && IsSizeTTy(FTy.getReturnType()) &&
+ return NumParams == 3 && FTy.getReturnType()->isIntegerTy(SizeTBits) &&
FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(2));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits);
case LibFunc_strncpy_chk:
case LibFunc_stpncpy_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_strncpy:
@@ -825,7 +1017,7 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
FTy.getParamType(0) == FTy.getParamType(1) &&
FTy.getParamType(0)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_strxfrm:
return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
@@ -840,7 +1032,7 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(0) == FTy.getParamType(1) &&
- IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_strspn:
case LibFunc_strcspn:
@@ -888,20 +1080,21 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_sprintf_chk:
return NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isIntegerTy(32) &&
- IsSizeTTy(FTy.getParamType(2)) &&
+ FTy.getParamType(2)->isIntegerTy(SizeTBits) &&
FTy.getParamType(3)->isPointerTy() &&
FTy.getReturnType()->isIntegerTy(32);
case LibFunc_snprintf:
- return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
- FTy.getParamType(2)->isPointerTy() &&
- FTy.getReturnType()->isIntegerTy(32));
+ return NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
+ FTy.getParamType(1)->isIntegerTy(SizeTBits) &&
+ FTy.getParamType(2)->isPointerTy() &&
+ FTy.getReturnType()->isIntegerTy(32);
case LibFunc_snprintf_chk:
return NumParams == 5 && FTy.getParamType(0)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(1)) &&
+ FTy.getParamType(1)->isIntegerTy(SizeTBits) &&
FTy.getParamType(2)->isIntegerTy(32) &&
- IsSizeTTy(FTy.getParamType(3)) &&
+ FTy.getParamType(3)->isIntegerTy(SizeTBits) &&
FTy.getParamType(4)->isPointerTy() &&
FTy.getReturnType()->isIntegerTy(32);
@@ -915,16 +1108,17 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_vec_malloc:
return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
case LibFunc_memcmp:
- return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
- FTy.getParamType(0)->isPointerTy() &&
- FTy.getParamType(1)->isPointerTy());
+ return NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
+ FTy.getParamType(0)->isPointerTy() &&
+ FTy.getParamType(1)->isPointerTy() &&
+ FTy.getParamType(2)->isIntegerTy(SizeTBits);
case LibFunc_memchr:
case LibFunc_memrchr:
return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
FTy.getReturnType() == FTy.getParamType(0) &&
FTy.getParamType(1)->isIntegerTy(32) &&
- IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_modf:
case LibFunc_modff:
case LibFunc_modfl:
@@ -934,7 +1128,7 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_mempcpy_chk:
case LibFunc_memmove_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_memcpy:
@@ -943,22 +1137,22 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_memset_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_memset:
return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isIntegerTy() &&
- IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_memccpy_chk:
--NumParams;
- if (!IsSizeTTy(FTy.getParamType(NumParams)))
+ if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
return false;
LLVM_FALLTHROUGH;
case LibFunc_memccpy:
@@ -970,7 +1164,7 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_vec_realloc:
return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
FTy.getParamType(0) == FTy.getReturnType() &&
- IsSizeTTy(FTy.getParamType(1)));
+ FTy.getParamType(1)->isIntegerTy(SizeTBits));
case LibFunc_read:
return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
case LibFunc_rewind:
@@ -1051,7 +1245,7 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
return (NumParams != 0 && FTy.getParamType(0)->isPointerTy());
case LibFunc___kmpc_free_shared:
return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(1)));
+ FTy.getParamType(1)->isIntegerTy(SizeTBits));
case LibFunc_fopen:
return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
@@ -1141,14 +1335,14 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_vsprintf_chk:
return NumParams == 5 && FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isIntegerTy(32) &&
- IsSizeTTy(FTy.getParamType(2)) && FTy.getParamType(3)->isPointerTy();
+ FTy.getParamType(2)->isIntegerTy(SizeTBits) && FTy.getParamType(3)->isPointerTy();
case LibFunc_vsnprintf:
return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(2)->isPointerTy());
case LibFunc_vsnprintf_chk:
return NumParams == 6 && FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(2)->isIntegerTy(32) &&
- IsSizeTTy(FTy.getParamType(3)) && FTy.getParamType(4)->isPointerTy();
+ FTy.getParamType(3)->isIntegerTy(SizeTBits) && FTy.getParamType(4)->isPointerTy();
case LibFunc_open:
return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
case LibFunc_opendir:
@@ -1560,12 +1754,13 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
case LibFunc_strnlen:
return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(1) &&
FTy.getParamType(0)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(1)));
+ FTy.getParamType(1)->isIntegerTy(SizeTBits));
case LibFunc_posix_memalign:
return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
FTy.getParamType(0)->isPointerTy() &&
- IsSizeTTy(FTy.getParamType(1)) && IsSizeTTy(FTy.getParamType(2)));
+ FTy.getParamType(1)->isIntegerTy(SizeTBits) &&
+ FTy.getParamType(2)->isIntegerTy(SizeTBits));
case LibFunc_wcslen:
return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
@@ -1605,10 +1800,11 @@ bool TargetLibraryInfoImpl::getLibFunc(const Function &FDecl,
// avoid string normalization and comparison.
if (FDecl.isIntrinsic()) return false;
- const DataLayout *DL =
- FDecl.getParent() ? &FDecl.getParent()->getDataLayout() : nullptr;
+ const Module *M = FDecl.getParent();
+ assert(M && "Expecting FDecl to be connected to a Module.");
+
return getLibFunc(FDecl.getName(), F) &&
- isValidProtoForLibFunc(*FDecl.getFunctionType(), F, DL);
+ isValidProtoForLibFunc(*FDecl.getFunctionType(), F, *M);
}
void TargetLibraryInfoImpl::disableAllFunctions() {