diff options
author | Itay Bookstein <ibookstein@gmail.com> | 2021-10-31 20:00:57 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2021-10-31 20:00:57 -0700 |
commit | 848812a55e530517191ed0f4f15c0c60752ea9c4 (patch) | |
tree | 82819b264e6086edcb9037da14c45e66c65bca18 /llvm/lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | cf78715cae7244406334242199d0ff031248543d (diff) | |
download | llvm-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.cpp | 6 |
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"); } |