1*67e74705SXin Li// RUN: %clang_cc1 -emit-llvm -fblocks -fobjc-arc -debug-info-kind=standalone -dwarf-version=4 -disable-llvm-passes -triple x86_64-apple-darwin10 %s -o - | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li// Legend: EXP = Return expression, RET = ret instruction 4*67e74705SXin Li 5*67e74705SXin Li// CHECK: define {{.*}}testNoSideEffect 6*67e74705SXin Li// CHECK: call void @objc_storeStrong{{.*}} 7*67e74705SXin Li// CHECK: call void @objc_storeStrong{{.*}} !dbg ![[RET1:[0-9]+]] 8*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET1]] 9*67e74705SXin Li 10*67e74705SXin Li// CHECK: define {{.*}}testNoCleanup 11*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET2:[0-9]+]] 12*67e74705SXin Li 13*67e74705SXin Li// CHECK: define {{.*}}testSideEffect 14*67e74705SXin Li// CHECK: @objc_msgSend{{.*}} !dbg ![[MSG3:[0-9]+]] 15*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET3:[0-9]+]] 16*67e74705SXin Li 17*67e74705SXin Li// CHECK: define {{.*}}testMultiline 18*67e74705SXin Li// CHECK: @objc_msgSend{{.*}} !dbg ![[MSG4:[0-9]+]] 19*67e74705SXin Li// CHECK: load{{.*}} !dbg ![[EXP4:[0-9]+]] 20*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET4:[0-9]+]] 21*67e74705SXin Li 22*67e74705SXin Li// CHECK: define {{.*}}testVoid 23*67e74705SXin Li// CHECK: call void @objc_storeStrong{{.*}} 24*67e74705SXin Li// CHECK: call void @objc_storeStrong{{.*}} !dbg ![[RET5:[0-9]+]] 25*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET5]] 26*67e74705SXin Li 27*67e74705SXin Li// CHECK: define {{.*}}testVoidNoReturn 28*67e74705SXin Li// CHECK: @objc_msgSend{{.*}} !dbg ![[MSG6:[0-9]+]] 29*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET6:[0-9]+]] 30*67e74705SXin Li 31*67e74705SXin Li// CHECK: define {{.*}}testNoCleanupSideEffect 32*67e74705SXin Li// CHECK: @objc_msgSend{{.*}} !dbg ![[MSG7:[0-9]+]] 33*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET7:[0-9]+]] 34*67e74705SXin Li 35*67e74705SXin Li// CHECK: define {{.*}}testCleanupVoid 36*67e74705SXin Li// CHECK: icmp ne {{.*}}!dbg ![[SKIP1:[0-9]+]] 37*67e74705SXin Li// CHECK: store i32 0, i32* {{.*}}, !dbg ![[RET8:[0-9]+]] 38*67e74705SXin Li// CHECK: @objc_storeStrong{{.*}}, !dbg ![[RET8]] 39*67e74705SXin Li// CHECK: ret {{.*}} !dbg ![[RET8]] 40*67e74705SXin Li 41*67e74705SXin Litypedef signed char BOOL; 42*67e74705SXin Li 43*67e74705SXin Li@interface NSObject 44*67e74705SXin Li+ (id)alloc; 45*67e74705SXin Li- (id)init; 46*67e74705SXin Li- (id)retain; 47*67e74705SXin Li@end 48*67e74705SXin Li 49*67e74705SXin Li@class NSString; 50*67e74705SXin Li 51*67e74705SXin Li@interface AppDelegate : NSObject 52*67e74705SXin Li 53*67e74705SXin Li@end 54*67e74705SXin Li 55*67e74705SXin Li@implementation AppDelegate : NSObject 56*67e74705SXin Li 57*67e74705SXin Li// CHECK: ![[TESTNOSIDEEFFECT:.*]] = distinct !DISubprogram(name: "-[AppDelegate testNoSideEffect:]" 58*67e74705SXin Li// CHECK-SAME: line: [[@LINE+2]] 59*67e74705SXin Li// CHECK-SAME: isLocal: true, isDefinition: true 60*67e74705SXin Li- (int)testNoSideEffect:(NSString *)foo { 61*67e74705SXin Li int x = 1; 62*67e74705SXin Li return 1; // Return expression 63*67e74705SXin Li // CHECK: ![[RET1]] = !DILocation(line: [[@LINE+1]], scope: ![[TESTNOSIDEEFFECT]]) 64*67e74705SXin Li} // Cleanup + Ret 65*67e74705SXin Li 66*67e74705SXin Li- (int)testNoCleanup { 67*67e74705SXin Li // CHECK: ![[RET2]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 68*67e74705SXin Li return 1; 69*67e74705SXin Li} 70*67e74705SXin Li 71*67e74705SXin Li- (int)testSideEffect:(NSString *)foo { 72*67e74705SXin Li // CHECK: ![[MSG3]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 73*67e74705SXin Li return [self testNoSideEffect :foo]; 74*67e74705SXin Li // CHECK: ![[RET3]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 75*67e74705SXin Li} 76*67e74705SXin Li 77*67e74705SXin Li- (int)testMultiline:(NSString *)foo { 78*67e74705SXin Li // CHECK: ![[MSG4]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 79*67e74705SXin Li int r = [self testSideEffect :foo]; 80*67e74705SXin Li // CHECK: ![[EXP4]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 81*67e74705SXin Li return r; 82*67e74705SXin Li // CHECK: ![[RET4]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 83*67e74705SXin Li} 84*67e74705SXin Li 85*67e74705SXin Li- (void)testVoid:(NSString *)foo { 86*67e74705SXin Li return; 87*67e74705SXin Li // CHECK: ![[RET5]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 88*67e74705SXin Li} 89*67e74705SXin Li 90*67e74705SXin Li- (void)testVoidNoReturn:(NSString *)foo { 91*67e74705SXin Li // CHECK: ![[MSG6]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 92*67e74705SXin Li [self testVoid :foo]; 93*67e74705SXin Li // CHECK: ![[RET6]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 94*67e74705SXin Li} 95*67e74705SXin Li 96*67e74705SXin Li- (int)testNoCleanupSideEffect { 97*67e74705SXin Li // CHECK: ![[MSG7]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 98*67e74705SXin Li [self testVoid :@"foo"]; 99*67e74705SXin Li // CHECK: ![[RET7]] = !DILocation(line: [[@LINE+1]], scope: !{{.*}}) 100*67e74705SXin Li return 1; 101*67e74705SXin Li} 102*67e74705SXin Li 103*67e74705SXin Li- (void)testCleanupVoid:(BOOL)skip withDelegate: (AppDelegate *) delegate { 104*67e74705SXin Li static BOOL skip_all; 105*67e74705SXin Li // CHECK: ![[SKIP1]] = !DILocation(line: [[@LINE+1]], scope: 106*67e74705SXin Li if (!skip_all) { 107*67e74705SXin Li if (!skip) { 108*67e74705SXin Li return; 109*67e74705SXin Li } 110*67e74705SXin Li NSString *s = @"bar"; 111*67e74705SXin Li if (!skip) { 112*67e74705SXin Li [delegate testVoid :s]; 113*67e74705SXin Li } 114*67e74705SXin Li } 115*67e74705SXin Li // CHECK: ![[RET8]] = !DILocation(line: [[@LINE+1]], scope: 116*67e74705SXin Li} 117*67e74705SXin Li 118*67e74705SXin Li 119*67e74705SXin Li@end 120*67e74705SXin Li 121*67e74705SXin Li 122*67e74705SXin Liint main(int argc, const char** argv) { 123*67e74705SXin Li AppDelegate *o = [[AppDelegate alloc] init]; 124*67e74705SXin Li return [o testMultiline :@"foo"]; 125*67e74705SXin Li} 126