aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff options
context:
space:
mode:
authorItay Bookstein <ibookstein@gmail.com>2021-10-31 20:00:57 -0700
committerFangrui Song <i@maskray.me>2021-10-31 20:00:57 -0700
commit848812a55e530517191ed0f4f15c0c60752ea9c4 (patch)
tree82819b264e6086edcb9037da14c45e66c65bca18 /llvm/lib/Bitcode/Reader/BitcodeReader.cpp
parentcf78715cae7244406334242199d0ff031248543d (diff)
downloadllvm-848812a55e530517191ed0f4f15c0c60752ea9c4.zip
llvm-848812a55e530517191ed0f4f15c0c60752ea9c4.tar.gz
llvm-848812a55e530517191ed0f4f15c0c60752ea9c4.tar.bz2
[Verifier] Add verification logic for GlobalIFuncs
Verify that the resolver exists, that it is a defined Function, and that its return type matches the ifunc's type. Add corresponding check to BitcodeReader, change clang to emit the correct type, and fix tests to comply. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D112349
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index 9ba7602..8b0846d 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -2279,7 +2279,11 @@ Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
return error("Alias and aliasee types don't match");
GA->setAliasee(C);
} else if (auto *GI = dyn_cast<GlobalIFunc>(GV)) {
- GI->setResolver(C);
+ Type *ResolverFTy =
+ GlobalIFunc::getResolverFunctionType(GI->getValueType());
+ // Transparently fix up the type for compatiblity with older bitcode
+ GI->setResolver(
+ ConstantExpr::getBitCast(C, ResolverFTy->getPointerTo()));
} else {
return error("Expected an alias or an ifunc");
}