summaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/TargetLibraryInfo.cpp
diff options
context:
space:
mode:
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2022-09-28 14:23:52 +0200
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2022-10-03 12:02:50 +0200
commit66fcdfca4d4587fcf93e15859e330ce5d671de82 (patch)
treec156b244516ec23f37e60c745f5e53fab9d53c43 /llvm/lib/Analysis/TargetLibraryInfo.cpp
parent8199a43a8995d23f8ea95fd97b896d93370b8140 (diff)
[Analysis][SimplifyLibCalls] Refactor code related to size_t in lib func signatures. NFC
Added a helper in TargetLibraryInfo to get size of "size_t" in bits, given a Module reference. The new getSizeTSize helper is using the same strategy as for example isValidProtoForLibFunc has been using in the past, assuming that the size can be derived by asking DataLayout about the size/type of a pointer to int. FortifiedLibCallSimplifier::optimizeStrpCpyChk was changed to use the new getSizeTSize helper instead of assuming that sizeof(size_t) is equal to sizeof(int*) by itself (that is the assumption used in TargetLibraryInfoImpl::getSizeTSize so the result will be the same). Having a common helper for this ensure that we use the same strategy when deriving the size of "size_t" in different parts of the code. One bonus with this refactoring (basing it on Module instead of just DataLayout) is that it makes it easier to override this for a specific target triple, in case the assumption of using getPointerSizeInBits wouldn't hold. Differential Revision: https://reviews.llvm.org/D110585
Diffstat (limited to 'llvm/lib/Analysis/TargetLibraryInfo.cpp')
-rw-r--r--llvm/lib/Analysis/TargetLibraryInfo.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index 40f0cf39d7d6..6d92eafed0c3 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -1051,12 +1051,8 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
break;
}
- // FIXME: There is 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 IntBits = getIntSize();
- unsigned SizeTBits = M.getDataLayout().getPointerSizeInBits(/*AddrSpace=*/0);
+ unsigned SizeTBits = getSizeTSize(M);
unsigned Idx = 0;
// Iterate over the type ids in the function prototype, matching each
@@ -1231,6 +1227,22 @@ unsigned TargetLibraryInfoImpl::getWCharSize(const Module &M) const {
return 0;
}
+unsigned TargetLibraryInfoImpl::getSizeTSize(const Module &M) const {
+ // There is really no guarantee that sizeof(size_t) is equal to sizeof(int*).
+ // If that isn't true then it should be possible to derive the SizeTTy from
+ // the target triple here instead and do an early return.
+
+ // Historically LLVM assume that size_t has same size as intptr_t (hence
+ // deriving the size from sizeof(int*) in address space zero). This should
+ // work for most targets. For future consideration: DataLayout also implement
+ // getIndexSizeInBits which might map better to size_t compared to
+ // getPointerSizeInBits. Hard coding address space zero here might be
+ // unfortunate as well. Maybe getDefaultGlobalsAddressSpace() or
+ // getAllocaAddrSpace() is better.
+ unsigned AddressSpace = 0;
+ return M.getDataLayout().getPointerSizeInBits(AddressSpace);
+}
+
TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass()
: ImmutablePass(ID), TLA(TargetLibraryInfoImpl()) {
initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());