[PATCH] D18618: [ObjC] Pop all cleanups created in CodeGenFunction::EmitObjCForCollectionStmt
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 4 13:25:32 PDT 2016
ahatanak updated this revision to Diff 52609.
ahatanak added a comment.
Changed the patch based on review comments.
Added code to enter RunCleanupsScope before the condition is evaluated and force its cleanup before emitting LoopEnd.
http://reviews.llvm.org/D18618
Files:
lib/CodeGen/CGObjC.cpp
test/CodeGenObjC/arc-foreach.m
Index: test/CodeGenObjC/arc-foreach.m
===================================================================
--- test/CodeGenObjC/arc-foreach.m
+++ test/CodeGenObjC/arc-foreach.m
@@ -170,4 +170,55 @@
// CHECK-LP64-NEXT: br label [[L]]
}
+ at interface NSObject @end
+
+ at interface I1 : NSObject
+- (NSArray *) foo1:(void (^)(void))block;
+- (void) foo2;
+ at end
+
+NSArray *array4;
+
+ at implementation I1 : NSObject
+- (NSArray *) foo1:(void (^)(void))block {
+ block();
+ return array4;
+}
+
+- (void) foo2 {
+ for (id x in [self foo1:^{ use(self); }]) {
+ use(x);
+ break;
+ }
+}
+ at end
+
+// CHECK-LP64-LABEL: define internal void @"\01-[I1 foo2]"(
+// CHECK-LP64: [[SELF_ADDR:%.*]] = alloca [[TY:%.*]]*,
+// CHECK-LP64: [[BLOCK:%.*]] = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>,
+// CHECK-LP64: store [[TY]]* %self, [[TY]]** [[SELF_ADDR]]
+// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>* [[BLOCK]], i32 0, i32 5
+// CHECK-LP64: [[BC:%.*]] = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>* [[BLOCK]], i32 0, i32 5
+// CHECK-LP64: [[T1:%.*]] = load [[TY]]*, [[TY]]** [[SELF_ADDR]]
+// CHECK-LP64: [[T2:%.*]] = bitcast [[TY]]* [[T1]] to i8*
+// CHECK-LP64: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]])
+// CHECK-LP64: [[T4:%.*]] = bitcast i8* [[T3]] to [[TY]]*
+// CHECK-LP64: store [[TY]]* [[T4]], [[TY]]** [[BC]]
+
+// CHECK-LP64: [[T5:%.*]] = bitcast [[TY]]** [[T0]] to i8**
+// CHECK-LP64: call void @objc_storeStrong(i8** [[T5]], i8* null)
+// CHECK-LP64: switch i32 {{%.*}}, label %[[UNREACHABLE:.*]] [
+// CHECK-LP64-NEXT: i32 0, label %[[CLEANUP_CONT:.*]]
+// CHECK-LP64-NEXT: i32 2, label %[[FORCOLL_END:.*]]
+// CHECK-LP64-NEXT: ]
+
+// CHECK-LP64: {{^|:}}[[CLEANUP_CONT]]
+// CHECK-LP64-NEXT: br label %[[FORCOLL_END]]
+
+// CHECK-LP64: {{^|:}}[[FORCOLL_END]]
+// CHECK-LP64-NEXT: ret void
+
+// CHECK-LP64: {{^|:}}[[UNREACHABLE]]
+// CHECK-LP64-NEXT: unreachable
+
// CHECK-LP64: attributes [[NUW]] = { nounwind }
Index: lib/CodeGen/CGObjC.cpp
===================================================================
--- lib/CodeGen/CGObjC.cpp
+++ lib/CodeGen/CGObjC.cpp
@@ -1485,6 +1485,8 @@
ArrayType::Normal, 0);
Address ItemsPtr = CreateMemTemp(ItemsTy, "items.ptr");
+ RunCleanupsScope ForScope(*this);
+
// Emit the collection pointer. In ARC, we do a retain.
llvm::Value *Collection;
if (getLangOpts().ObjCAutoRefCount) {
@@ -1725,10 +1727,7 @@
if (DI)
DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
- // Leave the cleanup we entered in ARC.
- if (getLangOpts().ObjCAutoRefCount)
- PopCleanupBlock();
-
+ ForScope.ForceCleanup();
EmitBlock(LoopEnd.getBlock());
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18618.52609.patch
Type: text/x-patch
Size: 3085 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160404/5f4ed010/attachment-0001.bin>
More information about the cfe-commits
mailing list