[llvm] 4e65291 - [OpaquePtr][GlobalOpt] Don't attempt to evaluate global constructors with arguments
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 27 19:02:26 PDT 2022
Author: Arthur Eubanks
Date: 2022-04-27T19:00:44-07:00
New Revision: 4e65291837aa33d1849a1ebe560ac816aabade39
URL: https://github.com/llvm/llvm-project/commit/4e65291837aa33d1849a1ebe560ac816aabade39
DIFF: https://github.com/llvm/llvm-project/commit/4e65291837aa33d1849a1ebe560ac816aabade39.diff
LOG: [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
Added:
llvm/test/Transforms/GlobalOpt/global-constructor-opaque-ptr.ll
Modified:
llvm/lib/Transforms/Utils/CtorUtils.cpp
llvm/lib/Transforms/Utils/Evaluator.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/CtorUtils.cpp b/llvm/lib/Transforms/Utils/CtorUtils.cpp
index 38bcce26a063..f8afcbd40b3f 100644
--- a/llvm/lib/Transforms/Utils/CtorUtils.cpp
+++ b/llvm/lib/Transforms/Utils/CtorUtils.cpp
@@ -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.
diff --git a/llvm/lib/Transforms/Utils/Evaluator.cpp b/llvm/lib/Transforms/Utils/Evaluator.cpp
index 0b1bc3258ba3..70b5e0e54c66 100644
--- a/llvm/lib/Transforms/Utils/Evaluator.cpp
+++ b/llvm/lib/Transforms/Utils/Evaluator.cpp
@@ -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))
diff --git a/llvm/test/Transforms/GlobalOpt/global-constructor-opaque-ptr.ll b/llvm/test/Transforms/GlobalOpt/global-constructor-opaque-ptr.ll
new file mode 100644
index 000000000000..4ea91d1ce894
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/global-constructor-opaque-ptr.ll
@@ -0,0 +1,14 @@
+; RUN: opt -passes=globalopt -S < %s | FileCheck %s
+
+; CHECK: @f1
+; CHECK: @f2
+
+ at 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
+}
More information about the llvm-commits
mailing list