[OpaquePtr][GlobalOpt] Don't attempt to evaluate global constructors with arguments

Previously all entries in global_ctors had to have the void()* type and
we'd skip evaluating bitcasted functions. With opaque pointers we may
see the function directly.

Fixes #55147.

Reviewed By: #opaque-pointers, nikic

Differential Revision: https://reviews.llvm.org/D124553
This commit is contained in:
Arthur Eubanks 2022-04-27 13:44:50 -07:00
parent b6b8d34554
commit 4e65291837
3 changed files with 19 additions and 2 deletions

View File

@ -98,8 +98,9 @@ static GlobalVariable *findGlobalCtors(Module &M) {
if (isa<ConstantPointerNull>(CS->getOperand(1)))
continue;
// Must have a function or null ptr.
if (!isa<Function>(CS->getOperand(1)))
// Can only handle global constructors with no arguments.
Function *F = dyn_cast<Function>(CS->getOperand(1));
if (!F || F->arg_size() != 0)
return nullptr;
// Init priority must be standard.

View File

@ -629,6 +629,8 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst, BasicBlock *&NextBB,
/// function.
bool Evaluator::EvaluateFunction(Function *F, Constant *&RetVal,
const SmallVectorImpl<Constant*> &ActualArgs) {
assert(ActualArgs.size() == F->arg_size() && "wrong number of arguments");
// Check to see if this function is already executing (recursion). If so,
// bail out. TODO: we might want to accept limited recursion.
if (is_contained(CallStack, F))

View File

@ -0,0 +1,14 @@
; RUN: opt -passes=globalopt -S < %s | FileCheck %s
; CHECK: @f1
; CHECK: @f2
@llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @f1, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @f2, ptr null }]
define void @f1(i32 %args) {
ret void
}
define i32 @f2(i32 %args) {
ret i32 0
}