Skip to content

Commit 21b9837

Browse files
committed
Add cleanups for the error path and add more tests
1 parent 8799240 commit 21b9837

File tree

3 files changed

+19
-19
lines changed

3 files changed

+19
-19
lines changed

clang/lib/CodeGen/CGCall.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4976,9 +4976,12 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
49764976
if (!CGM.getCodeGenOpts().NoLifetimeMarkersForTemporaries &&
49774977
EmitLifetimeStart(ArgSlotAlloca.getPointer())) {
49784978
if (E->getType().isDestructedType()) {
4979-
pushFullExprCleanup<CallLifetimeEnd>(NormalAndEHCleanup, ArgSlotAlloca);
4979+
pushFullExprCleanup<CallLifetimeEnd>(NormalEHLifetimeMarker, ArgSlotAlloca);
49804980
} else {
49814981
args.addLifetimeCleanup({ArgSlotAlloca.getPointer()});
4982+
if (getInvokeDest())
4983+
pushFullExprCleanup<CallLifetimeEnd>(CleanupKind::EHCleanup,
4984+
ArgSlotAlloca);
49824985
}
49834986
}
49844987
}

clang/test/CodeGen/lifetime-invoke-c.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,14 @@ void test() {
2222
// CHECK-NEXT: to label %[[CONT1:.*]] unwind label %[[LPAD1:.*]]
2323

2424
// CHECK: [[CONT1]]:
25-
// CHECK-NOT: call void @llvm.lifetime.end.p0(ptr %[[AGG1]])
26-
27-
// CHECK: call void @llvm.lifetime.start.p0(ptr %[[AGG2]])
25+
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %[[AGG1]])
26+
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %[[AGG2]])
2827
// CHECK: invoke void @gen(ptr{{.*}} sret(%struct.Trivial) align 4 %[[AGG2]])
2928
// CHECK: invoke void @func(ptr{{.*}} byval(%struct.Trivial) align 8 %[[AGG2]])
3029
// CHECK-NEXT: to label %[[CONT2:.*]] unwind label %[[LPAD2:.*]]
3130

3231
// CHECK: [[CONT2]]:
33-
// CHECK-DAG: call void @llvm.lifetime.end.p0(ptr %[[AGG2]])
34-
// CHECK-DAG: call void @llvm.lifetime.end.p0(ptr %[[AGG1]])
32+
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %[[AGG2]])
3533

3634
// CHECK: [[LPAD1]]:
3735
// CHECK: landingpad

clang/test/CodeGenCXX/aggregate-lifetime-invoke.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,26 @@ void test() {
1515

1616
// CHECK: call void @llvm.lifetime.start.p0(ptr{{.*}} %[[AGG1]])
1717
// CHECK: invoke void @func_that_throws(ptr{{.*}} %[[AGG1]])
18-
// CHECK-NEXT: to label %[[CONT1:.*]] unwind label %[[LPAD:.*]]
19-
20-
// CHECK: [[CONT1]]:
2118

19+
// CHECK: [[CONT1:.*]]:
2220
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr{{.*}} %[[AGG1]])
2321
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr{{.*}} %[[AGG2]])
24-
// CHECK: invoke void @_func_that_throws(ptr{{.*}} %[[AGG2]])
25-
// CHECK-NEXT: to label %[[CONT2:.*]] unwind label %[[LPAD]]
22+
// CHECK: invoke void @func_that_throws(ptr{{.*}} %[[AGG2]])
2623

27-
// CHECK: [[CONT2]]:
24+
// CHECK: [[CONT2:.*]]:
2825
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr{{.*}} %[[AGG2]])
29-
// CHECK: br label %[[TRY_CONT:.*]]
3026

31-
// CHECK: [[LPAD]]:
27+
// CHECK: [[LPAD1:lpad.*]]:
28+
// CHECK: landingpad
29+
// CHECK: br label %[[EHCLEANUP:.*]]
30+
31+
// CHECK: [[LPAD2:lpad.*]]:
3232
// CHECK: landingpad
33-
// CHECK-NOT: call void @llvm.lifetime.end.p0(ptr{{.*}} %[[AGG1]])
34-
// CHECK-NOT: call void @llvm.lifetime.end.p0(ptr{{.*}} %[[AGG2]])
35-
// CHECK: br label %[[TRY_CONT]]
33+
// CHECK: call void @llvm.lifetime.end.p0(ptr{{.*}} %[[AGG2]])
34+
// CHECK: br label %[[EHCLEANUP]]
3635

37-
// CHECK: [[TRY_CONT]]:
38-
// CHECK-NEXT: ret void
36+
// CHECK: [[EHCLEANUP]]:
37+
// CHECK: call void @llvm.lifetime.end.p0(ptr{{.*}} %[[AGG1]])
3938
try {
4039
func_that_throws(Trivial{0});
4140
func_that_throws(Trivial{0});

0 commit comments

Comments
 (0)