Skip to content

Commit d97951e

Browse files
committed
Reland "[ORC] Preserve order of constructors with same priority (#95532)"
This reverts commit edd6f0c. The newly added test uncovered a pre-existing issue on Arm 32 bit, so as we did #94994, disable it while we find the problem.
1 parent 1a0a4d0 commit d97951e

File tree

2 files changed

+178
-1
lines changed

2 files changed

+178
-1
lines changed

llvm/lib/ExecutionEngine/Orc/LLJIT.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM,
538538

539539
for (auto E : COrDtors)
540540
InitsOrDeInits.push_back(std::make_pair(E.Func, E.Priority));
541-
llvm::sort(InitsOrDeInits, llvm::less_second());
541+
llvm::stable_sort(InitsOrDeInits, llvm::less_second());
542542

543543
auto *InitOrDeInitFuncEntryBlock =
544544
BasicBlock::Create(Ctx, "entry", InitOrDeInitFunc);
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
; Test that global constructors are correctly ordered
2+
;
3+
; Uncovers a pre-existing issue on Arm 32 bit, see
4+
; https://github.com/llvm/llvm-project/issues/95911.
5+
; UNSUPPORTED: target=arm{{.*}}
6+
;
7+
; RUN: lli -jit-kind=orc %s | FileCheck %s
8+
;
9+
; CHECK: H1
10+
; CHECK-NEXT: H2
11+
; CHECK-NEXT: H3
12+
; CHECK-NEXT: M1
13+
; CHECK-NEXT: M2
14+
; CHECK-NEXT: M3
15+
; CHECK-NEXT: 1
16+
; CHECK-NEXT: 2
17+
; CHECK-NEXT: 3
18+
; CHECK-NEXT: 4
19+
; CHECK-NEXT: 5
20+
; CHECK-NEXT: 6
21+
; CHECK-NEXT: 7
22+
; CHECK-NEXT: 8
23+
; CHECK-NEXT: 9
24+
; CHECK-NEXT: 10
25+
; CHECK-NEXT: 11
26+
; CHECK-NEXT: 12
27+
; CHECK-NEXT: 13
28+
; CHECK-NEXT: 14
29+
; CHECK-NEXT: 15
30+
; CHECK-NEXT: 16
31+
; CHECK-NEXT: 17
32+
33+
declare i32 @puts(ptr)
34+
35+
@str.H1 = private constant [3 x i8] c"H1\00"
36+
@str.H2 = private constant [3 x i8] c"H2\00"
37+
@str.H3 = private constant [3 x i8] c"H3\00"
38+
@str.M1 = private constant [3 x i8] c"M1\00"
39+
@str.M2 = private constant [3 x i8] c"M2\00"
40+
@str.M3 = private constant [3 x i8] c"M3\00"
41+
@str.1 = private constant [2 x i8] c"1\00"
42+
@str.2 = private constant [2 x i8] c"2\00"
43+
@str.3 = private constant [2 x i8] c"3\00"
44+
@str.4 = private constant [2 x i8] c"4\00"
45+
@str.5 = private constant [2 x i8] c"5\00"
46+
@str.6 = private constant [2 x i8] c"6\00"
47+
@str.7 = private constant [2 x i8] c"7\00"
48+
@str.8 = private constant [2 x i8] c"8\00"
49+
@str.9 = private constant [2 x i8] c"9\00"
50+
@str.10 = private constant [3 x i8] c"10\00"
51+
@str.11 = private constant [3 x i8] c"11\00"
52+
@str.12 = private constant [3 x i8] c"12\00"
53+
@str.13 = private constant [3 x i8] c"13\00"
54+
@str.14 = private constant [3 x i8] c"14\00"
55+
@str.15 = private constant [3 x i8] c"15\00"
56+
@str.16 = private constant [3 x i8] c"16\00"
57+
@str.17 = private constant [3 x i8] c"17\00"
58+
@llvm.global_ctors = appending global [23 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1024, ptr @medium.1, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.1, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.2, ptr null }, { i32, ptr, ptr } { i32 1, ptr @high.1, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.3, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.4, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.5, ptr null }, { i32, ptr, ptr } { i32 1, ptr @high.2, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.6, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.7, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.8, ptr null }, { i32, ptr, ptr } { i32 1024, ptr @medium.2, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.9, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.10, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.11, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.12, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.13, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.14, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.15, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.16, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @default.17, ptr null }, { i32, ptr, ptr } { i32 1024, ptr @medium.3, ptr null }, { i32, ptr, ptr } { i32 1, ptr @high.3, ptr null }]
59+
60+
define internal i32 @high.1() #0 {
61+
%call = tail call i32 @puts(ptr @str.H1)
62+
ret i32 0
63+
}
64+
65+
define internal i32 @high.2() #0 {
66+
%call = tail call i32 @puts(ptr @str.H2)
67+
ret i32 0
68+
}
69+
70+
define internal i32 @high.3() #0 {
71+
%call = tail call i32 @puts(ptr @str.H3)
72+
ret i32 0
73+
}
74+
75+
define internal i32 @medium.1() #0 {
76+
%call = tail call i32 @puts(ptr @str.M1)
77+
ret i32 0
78+
}
79+
80+
define internal i32 @medium.2() #0 {
81+
%call = tail call i32 @puts(ptr @str.M2)
82+
ret i32 0
83+
}
84+
85+
define internal i32 @medium.3() #0 {
86+
%call = tail call i32 @puts(ptr @str.M3)
87+
ret i32 0
88+
}
89+
90+
define internal i32 @default.1() #0 {
91+
%call = tail call i32 @puts(ptr @str.1)
92+
ret i32 0
93+
}
94+
95+
define internal i32 @default.2() #0 {
96+
%call = tail call i32 @puts(ptr @str.2)
97+
ret i32 0
98+
}
99+
100+
define internal i32 @default.3() #0 {
101+
%call = tail call i32 @puts(ptr @str.3)
102+
ret i32 0
103+
}
104+
105+
define internal i32 @default.4() #0 {
106+
%call = tail call i32 @puts(ptr @str.4)
107+
ret i32 0
108+
}
109+
110+
define internal i32 @default.5() #0 {
111+
%call = tail call i32 @puts(ptr @str.5)
112+
ret i32 0
113+
}
114+
115+
define internal i32 @default.6() #0 {
116+
%call = tail call i32 @puts(ptr @str.6)
117+
ret i32 0
118+
}
119+
120+
define internal i32 @default.7() #0 {
121+
%call = tail call i32 @puts(ptr @str.7)
122+
ret i32 0
123+
}
124+
125+
define internal i32 @default.8() #0 {
126+
%call = tail call i32 @puts(ptr @str.8)
127+
ret i32 0
128+
}
129+
130+
define internal i32 @default.9() #0 {
131+
%call = tail call i32 @puts(ptr @str.9)
132+
ret i32 0
133+
}
134+
135+
define internal i32 @default.10() #0 {
136+
%call = tail call i32 @puts(ptr @str.10)
137+
ret i32 0
138+
}
139+
140+
define internal i32 @default.11() #0 {
141+
%call = tail call i32 @puts(ptr @str.11)
142+
ret i32 0
143+
}
144+
145+
define internal i32 @default.12() #0 {
146+
%call = tail call i32 @puts(ptr @str.12)
147+
ret i32 0
148+
}
149+
150+
define internal i32 @default.13() #0 {
151+
%call = tail call i32 @puts(ptr @str.13)
152+
ret i32 0
153+
}
154+
155+
define internal i32 @default.14() #0 {
156+
%call = tail call i32 @puts(ptr @str.14)
157+
ret i32 0
158+
}
159+
160+
define internal i32 @default.15() #0 {
161+
%call = tail call i32 @puts(ptr @str.15)
162+
ret i32 0
163+
}
164+
165+
define internal i32 @default.16() #0 {
166+
%call = tail call i32 @puts(ptr @str.16)
167+
ret i32 0
168+
}
169+
170+
define internal i32 @default.17() #0 {
171+
%call = tail call i32 @puts(ptr @str.17)
172+
ret i32 0
173+
}
174+
175+
define i32 @main() {
176+
ret i32 0
177+
}

0 commit comments

Comments
 (0)