Skip to content

Commit c189422

Browse files
fhahntomtor
authored andcommitted
[GlobalOpt] Bail out on non-ConstExprs in isSimpleEnoughtToCommit. (llvm#143400)
Bail out for non ConstantExpr constants in isSimpleEnoughValueToCommitHelper to prevent crash for non-ConstantExpr constants PR: llvm#143400
1 parent 7636ae2 commit c189422

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

llvm/lib/Transforms/Utils/Evaluator.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ isSimpleEnoughValueToCommitHelper(Constant *C,
7777
// We don't know exactly what relocations are allowed in constant expressions,
7878
// so we allow &global+constantoffset, which is safe and uniformly supported
7979
// across targets.
80-
ConstantExpr *CE = cast<ConstantExpr>(C);
80+
ConstantExpr *CE = dyn_cast<ConstantExpr>(C);
81+
if (!CE)
82+
return false;
8183
switch (CE->getOpcode()) {
8284
case Instruction::BitCast:
8385
// Bitcast is fine if the casted value is fine.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5
2+
; RUN: opt -p globalopt -S %s | FileCheck %s
3+
4+
@llvm.global_ctors = appending global [3 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor_nocfi, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor_dso_local_equivalent, ptr null }]
5+
6+
@foo = internal global ptr null
7+
8+
declare void @user(ptr)
9+
10+
;.
11+
; CHECK: @llvm.global_ctors = appending global [3 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor_nocfi, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor_dso_local_equivalent, ptr null }]
12+
; CHECK: @foo = internal global ptr null
13+
;.
14+
define void @ctor() {
15+
; CHECK-LABEL: define void @ctor() {
16+
; CHECK-NEXT: [[ENTRY:.*:]]
17+
; CHECK-NEXT: [[DST:%.*]] = alloca ptr, align 8
18+
; CHECK-NEXT: store ptr ptrauth (ptr @foo, i32 0), ptr [[DST]], align 8
19+
; CHECK-NEXT: call void @user(ptr [[DST]])
20+
; CHECK-NEXT: ret void
21+
;
22+
entry:
23+
%dst = alloca ptr, align 8
24+
store ptr ptrauth (ptr @foo, i32 0), ptr %dst, align 8
25+
call void @user(ptr %dst)
26+
ret void
27+
}
28+
29+
define void @ctor_nocfi() {
30+
; CHECK-LABEL: define void @ctor_nocfi() {
31+
; CHECK-NEXT: [[ENTRY:.*:]]
32+
; CHECK-NEXT: [[DST:%.*]] = alloca ptr, align 8
33+
; CHECK-NEXT: store ptr no_cfi @foo, ptr [[DST]], align 8
34+
; CHECK-NEXT: call void @user(ptr [[DST]])
35+
; CHECK-NEXT: ret void
36+
;
37+
entry:
38+
%dst = alloca ptr, align 8
39+
store ptr no_cfi @foo, ptr %dst, align 8
40+
call void @user(ptr %dst)
41+
ret void
42+
}
43+
44+
define void @fn() {
45+
; CHECK-LABEL: define void @fn() {
46+
; CHECK-NEXT: ret void
47+
;
48+
ret void
49+
}
50+
51+
define void @ctor_dso_local_equivalent() {
52+
; CHECK-LABEL: define void @ctor_dso_local_equivalent() {
53+
; CHECK-NEXT: [[ENTRY:.*:]]
54+
; CHECK-NEXT: [[DST:%.*]] = alloca ptr, align 8
55+
; CHECK-NEXT: store ptr dso_local_equivalent @fn, ptr [[DST]], align 8
56+
; CHECK-NEXT: call void @user(ptr [[DST]])
57+
; CHECK-NEXT: ret void
58+
;
59+
entry:
60+
%dst = alloca ptr, align 8
61+
store ptr dso_local_equivalent @fn, ptr %dst, align 8
62+
call void @user(ptr %dst)
63+
ret void
64+
}

0 commit comments

Comments
 (0)