aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/LTO/LTO.cpp
diff options
context:
space:
mode:
authorArnold Schwaighofer <aschwaighofer@apple.com>2023-06-29 08:07:11 -0700
committerArnold Schwaighofer <aschwaighofer@apple.com>2023-06-29 08:33:45 -0700
commit98eb8abff6ad5c2e2f95fd1189b35a24f2800b32 (patch)
tree3b129ee5f5dddd975a0138d911213ba6edb6cc6f /llvm/lib/LTO/LTO.cpp
parente12ffe6a93505e590158ddd8cc73a4f201bbf0aa (diff)
downloadllvm-98eb8abff6ad5c2e2f95fd1189b35a24f2800b32.zip
llvm-98eb8abff6ad5c2e2f95fd1189b35a24f2800b32.tar.gz
llvm-98eb8abff6ad5c2e2f95fd1189b35a24f2800b32.tar.bz2
Add a type_checked_load_relative to support relative function pointer tables
This adds a type_checked_load_relative intrinsic whose semantics it is to load a relative function pointer. A relative function pointer is a pointer to a 32bit value that when added to its address yields the address of the function. Differential Revision: https://reviews.llvm.org/D143204
Diffstat (limited to 'llvm/lib/LTO/LTO.cpp')
-rw-r--r--llvm/lib/LTO/LTO.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp
index 6b82c4e..65ba3cb 100644
--- a/llvm/lib/LTO/LTO.cpp
+++ b/llvm/lib/LTO/LTO.cpp
@@ -1087,11 +1087,16 @@ Error LTO::checkPartiallySplit() {
Intrinsic::getName(Intrinsic::type_test));
Function *TypeCheckedLoadFunc = RegularLTO.CombinedModule->getFunction(
Intrinsic::getName(Intrinsic::type_checked_load));
+ Function *TypeCheckedLoadRelativeFunc =
+ RegularLTO.CombinedModule->getFunction(
+ Intrinsic::getName(Intrinsic::type_checked_load_relative));
// First check if there are type tests / type checked loads in the
// merged regular LTO module IR.
if ((TypeTestFunc && !TypeTestFunc->use_empty()) ||
- (TypeCheckedLoadFunc && !TypeCheckedLoadFunc->use_empty()))
+ (TypeCheckedLoadFunc && !TypeCheckedLoadFunc->use_empty()) ||
+ (TypeCheckedLoadRelativeFunc &&
+ !TypeCheckedLoadRelativeFunc->use_empty()))
return make_error<StringError>(
"inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
inconvertibleErrorCode());