Skip to content

Commit 0d3f2fd

Browse files
committed
Revert "Skip exception cleanups when the innermost scope is EHTerminateScope."
Breaks tests on some platforms. Reverting while investigating. This reverts commit a4e255f.
1 parent 29fe14c commit 0d3f2fd

11 files changed

+1578
-980
lines changed

clang/lib/CodeGen/CGCleanup.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,6 @@ void *EHScopeStack::pushCleanup(CleanupKind Kind, size_t Size) {
180180
bool IsNormalCleanup = Kind & NormalCleanup;
181181
bool IsEHCleanup = Kind & EHCleanup;
182182
bool IsLifetimeMarker = Kind & LifetimeMarker;
183-
184-
// Per C++ [except.terminate], it is implementation-defined whether none,
185-
// some, or all cleanups are called before std::terminate. Thus, when
186-
// terminate is the current EH scope, we may skip adding any EH cleanup
187-
// scopes.
188-
if (find(InnermostEHScope)->getKind() == EHScope::Terminate)
189-
IsEHCleanup = false;
190-
191183
EHCleanupScope *Scope =
192184
new (Buffer) EHCleanupScope(IsNormalCleanup,
193185
IsEHCleanup,

clang/test/CodeGenCXX/noexcept.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,32 @@ namespace test0 {
1616
foo();
1717
}
1818
}
19-
2019
// CHECK-LABEL: define{{.*}} void @_ZN5test04testEv()
20+
// CHECK: [[EXN:%.*]] = alloca i8*
2121
// This goes to the terminate lpad.
2222
// CHECK: invoke void @_ZN5test01AC1Ev(
23-
// CHECK-NEXT: unwind label %[[TERMINATE_LPAD:.*]]
24-
// This also goes to the terminate lpad (no cleanups!).
23+
// This goes to the cleanup-and-then-terminate lpad.
2524
// CHECK: invoke void @_ZN5test03fooEv()
26-
// CHECK-NEXT: unwind label %[[TERMINATE_LPAD]]
2725
// Destructors don't throw by default in C++11.
2826
// CHECK: call void @_ZN5test01AD1Ev(
2927
// Cleanup lpad.
30-
// CHECK: [[TERMINATE_LPAD]]:
31-
// CHECK-NEXT: [[T0:%.*]] = landingpad
28+
// CHECK: [[T0:%.*]] = landingpad
29+
// CHECK-NEXT: catch i8* null
30+
// CHECK-NEXT: [[T1:%.*]] = extractvalue { i8*, i32 } [[T0]], 0
31+
// CHECK-NEXT: store i8* [[T1]], i8** [[EXN]]
32+
// (Calling this destructor is not technically required.)
33+
// CHECK: call void @_ZN5test01AD1Ev(
34+
// CHECK-NEXT: br label
35+
// The terminate landing pad jumps in here for some reason.
36+
// CHECK: [[T0:%.*]] = landingpad
3237
// CHECK-NEXT: catch i8* null
3338
// CHECK-NEXT: [[T1:%.*]] = extractvalue { i8*, i32 } [[T0]], 0
3439
// CHECK-NEXT: call void @__clang_call_terminate(i8* [[T1]])
3540
// CHECK-NEXT: unreachable
41+
// The terminate handler chained to by the cleanup lpad.
42+
// CHECK: [[T0:%.*]] = load i8*, i8** [[EXN]]
43+
// CHECK-NEXT: call void @__clang_call_terminate(i8* [[T0]])
44+
// CHECK-NEXT: unreachable
3645

3746
// CHECK-LABEL: define linkonce_odr hidden void @__clang_call_terminate(
3847
// CHECK: call i8* @__cxa_begin_catch(

clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp

Lines changed: 153 additions & 32 deletions
Large diffs are not rendered by default.

clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp

Lines changed: 176 additions & 56 deletions
Large diffs are not rendered by default.

clang/test/OpenMP/openmp_win_codegen.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ int main() {
7373
// CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
7474
// CHECK1-NEXT: call void @__kmpc_critical(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], [8 x i32]* @.gomp_critical_user_.var) [ "funclet"(token [[TMP1]]) ]
7575
// CHECK1-NEXT: invoke void @"?bar@@YAXXZ"() [ "funclet"(token [[TMP1]]) ]
76-
// CHECK1-NEXT: to label [[INVOKE_CONT1:%.*]] unwind label [[TERMINATE2:%.*]]
76+
// CHECK1-NEXT: to label [[INVOKE_CONT1:%.*]] unwind label [[EHCLEANUP:%.*]]
7777
// CHECK1: invoke.cont1:
7878
// CHECK1-NEXT: call void @__kmpc_end_critical(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], [8 x i32]* @.gomp_critical_user_.var) [ "funclet"(token [[TMP1]]) ]
7979
// CHECK1-NEXT: catchret from [[TMP1]] to label [[CATCHRET_DEST:%.*]]
@@ -83,13 +83,17 @@ int main() {
8383
// CHECK1-NEXT: ret void
8484
// CHECK1: invoke.cont:
8585
// CHECK1-NEXT: br label [[TRY_CONT]]
86+
// CHECK1: ehcleanup:
87+
// CHECK1-NEXT: [[TMP4:%.*]] = cleanuppad within [[TMP1]] []
88+
// CHECK1-NEXT: call void @__kmpc_end_critical(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], [8 x i32]* @.gomp_critical_user_.var) [ "funclet"(token [[TMP4]]) ]
89+
// CHECK1-NEXT: cleanupret from [[TMP4]] unwind label [[TERMINATE2:%.*]]
8690
// CHECK1: terminate:
87-
// CHECK1-NEXT: [[TMP4:%.*]] = cleanuppad within none []
88-
// CHECK1-NEXT: call void @"?terminate@@YAXXZ"() #[[ATTR7:[0-9]+]] [ "funclet"(token [[TMP4]]) ]
91+
// CHECK1-NEXT: [[TMP5:%.*]] = cleanuppad within none []
92+
// CHECK1-NEXT: call void @"?terminate@@YAXXZ"() #[[ATTR7:[0-9]+]] [ "funclet"(token [[TMP5]]) ]
8993
// CHECK1-NEXT: unreachable
9094
// CHECK1: terminate2:
91-
// CHECK1-NEXT: [[TMP5:%.*]] = cleanuppad within [[TMP1]] []
92-
// CHECK1-NEXT: call void @"?terminate@@YAXXZ"() #[[ATTR7]] [ "funclet"(token [[TMP5]]) ]
95+
// CHECK1-NEXT: [[TMP6:%.*]] = cleanuppad within [[TMP1]] []
96+
// CHECK1-NEXT: call void @"?terminate@@YAXXZ"() #[[ATTR7]] [ "funclet"(token [[TMP6]]) ]
9397
// CHECK1-NEXT: unreachable
9498
//
9599
//
@@ -151,3 +155,4 @@ int main() {
151155
// CHECK1-NEXT: store i32 [[TMP12]], i32* [[TMP8]], align 4
152156
// CHECK1-NEXT: ret void
153157
//
158+
//

clang/test/OpenMP/ordered_doacross_codegen.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ int main() {
8888
#pragma omp ordered depend(sink : i - 2)
8989
d[i] = a[i - 2];
9090
}
91+
// CHECK: landingpad
92+
// CHECK-NORMAL: call void @__kmpc_doacross_fini([[IDENT]], i32 [[GTID]])
93+
// CHECK: br label %
9194

9295
// CHECK: call void @__kmpc_for_static_fini(
9396
// CHECK-NORMAL: call void @__kmpc_doacross_fini([[IDENT]], i32 [[GTID]])
@@ -147,6 +150,10 @@ int main1() {
147150
#pragma omp ordered depend(sink : i - 2)
148151
d[i] = a[i - 2];
149152
}
153+
// CHECK: landingpad
154+
// CHECK-NORMAL: call void @__kmpc_doacross_fini([[IDENT]], i32 [[GTID]])
155+
// CHECK: br label %
156+
150157
// CHECK: call void @__kmpc_for_static_fini(
151158
// CHECK-NORMAL: call void @__kmpc_doacross_fini([[IDENT]], i32 [[GTID]])
152159
// CHECK: ret i32 0
@@ -260,6 +267,10 @@ struct TestStruct {
260267
baz(a[i][j], b[i][j]);
261268
}
262269
}
270+
// CHECK: landingpad
271+
// CHECK-NORMAL: call void @__kmpc_doacross_fini([[IDENT]], i32 [[GTID]])
272+
// CHECK: br label %
273+
263274
// CHECK: call void @__kmpc_for_static_fini(
264275
// CHECK-NORMAL: call void @__kmpc_doacross_fini([[IDENT]], i32 [[GTID]])
265276
// CHECK: ret

clang/test/OpenMP/parallel_master_codegen.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ void parallel_master_allocate() {
305305
// CHECK1-NEXT: entry:
306306
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
307307
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
308+
// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
309+
// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
308310
// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
309311
// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
310312
// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
@@ -314,17 +316,24 @@ void parallel_master_allocate() {
314316
// CHECK1-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
315317
// CHECK1: omp_if.then:
316318
// CHECK1-NEXT: invoke void @_Z3foov()
317-
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
319+
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
318320
// CHECK1: invoke.cont:
319321
// CHECK1-NEXT: call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
320322
// CHECK1-NEXT: br label [[OMP_IF_END]]
321-
// CHECK1: omp_if.end:
322-
// CHECK1-NEXT: ret void
323-
// CHECK1: terminate.lpad:
323+
// CHECK1: lpad:
324324
// CHECK1-NEXT: [[TMP4:%.*]] = landingpad { i8*, i32 }
325325
// CHECK1-NEXT: catch i8* null
326326
// CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0
327-
// CHECK1-NEXT: call void @__clang_call_terminate(i8* [[TMP5]]) #[[ATTR6:[0-9]+]]
327+
// CHECK1-NEXT: store i8* [[TMP5]], i8** [[EXN_SLOT]], align 8
328+
// CHECK1-NEXT: [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 1
329+
// CHECK1-NEXT: store i32 [[TMP6]], i32* [[EHSELECTOR_SLOT]], align 4
330+
// CHECK1-NEXT: call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
331+
// CHECK1-NEXT: br label [[TERMINATE_HANDLER:%.*]]
332+
// CHECK1: omp_if.end:
333+
// CHECK1-NEXT: ret void
334+
// CHECK1: terminate.handler:
335+
// CHECK1-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
336+
// CHECK1-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR6:[0-9]+]]
328337
// CHECK1-NEXT: unreachable
329338
//
330339
//
@@ -354,6 +363,8 @@ void parallel_master_allocate() {
354363
// CHECK2-NEXT: entry:
355364
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
356365
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
366+
// CHECK2-NEXT: [[EXN_SLOT:%.*]] = alloca i8*, align 8
367+
// CHECK2-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
357368
// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
358369
// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
359370
// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
@@ -363,17 +374,24 @@ void parallel_master_allocate() {
363374
// CHECK2-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
364375
// CHECK2: omp_if.then:
365376
// CHECK2-NEXT: invoke void @_Z3foov()
366-
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
377+
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
367378
// CHECK2: invoke.cont:
368379
// CHECK2-NEXT: call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
369380
// CHECK2-NEXT: br label [[OMP_IF_END]]
370-
// CHECK2: omp_if.end:
371-
// CHECK2-NEXT: ret void
372-
// CHECK2: terminate.lpad:
381+
// CHECK2: lpad:
373382
// CHECK2-NEXT: [[TMP4:%.*]] = landingpad { i8*, i32 }
374383
// CHECK2-NEXT: catch i8* null
375384
// CHECK2-NEXT: [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0
376-
// CHECK2-NEXT: call void @__clang_call_terminate(i8* [[TMP5]]) #[[ATTR6:[0-9]+]]
385+
// CHECK2-NEXT: store i8* [[TMP5]], i8** [[EXN_SLOT]], align 8
386+
// CHECK2-NEXT: [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 1
387+
// CHECK2-NEXT: store i32 [[TMP6]], i32* [[EHSELECTOR_SLOT]], align 4
388+
// CHECK2-NEXT: call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
389+
// CHECK2-NEXT: br label [[TERMINATE_HANDLER:%.*]]
390+
// CHECK2: omp_if.end:
391+
// CHECK2-NEXT: ret void
392+
// CHECK2: terminate.handler:
393+
// CHECK2-NEXT: [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
394+
// CHECK2-NEXT: call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR6:[0-9]+]]
377395
// CHECK2-NEXT: unreachable
378396
//
379397
//

0 commit comments

Comments
 (0)