1*67e74705SXin Li// REQUIRES: x86-registered-target 2*67e74705SXin Li// RUN: %clang_cc1 -emit-llvm -fblocks -fobjc-arc -debug-info-kind=limited -triple x86_64-apple-darwin10 %s -o - | FileCheck %s 3*67e74705SXin Li 4*67e74705SXin Li// rdar://11562117 5*67e74705SXin Litypedef unsigned int NSUInteger; 6*67e74705SXin Litypedef long NSInteger; 7*67e74705SXin Litypedef signed char BOOL; 8*67e74705SXin Li 9*67e74705SXin Li#define nil ((void*) 0) 10*67e74705SXin Li#define YES ((BOOL)1) 11*67e74705SXin Li#define NO ((BOOL)0) 12*67e74705SXin Li 13*67e74705SXin Li@interface NSObject 14*67e74705SXin Li- (id)init; 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li@interface NSError : NSObject 18*67e74705SXin Li@end 19*67e74705SXin Li 20*67e74705SXin Li@interface NSString : NSObject 21*67e74705SXin Li@end 22*67e74705SXin Li 23*67e74705SXin Li@interface NSString (NSStringExtensionMethods) 24*67e74705SXin Li- (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block; 25*67e74705SXin Li@end 26*67e74705SXin Li 27*67e74705SXin Li@interface NSData : NSObject 28*67e74705SXin Li@end 29*67e74705SXin Li 30*67e74705SXin Li@interface NSData (ASBase64) 31*67e74705SXin Li- (NSString *)encodedString:(NSInteger)position; 32*67e74705SXin Li- (NSData *)compressedData; 33*67e74705SXin Li@end 34*67e74705SXin Li 35*67e74705SXin Litypedef void (^TDataCompletionBlock)(NSData *data, NSError *error); 36*67e74705SXin Li@interface TMap : NSObject 37*67e74705SXin Li- (NSString *)identifier; 38*67e74705SXin Li- (NSString *)name; 39*67e74705SXin Li+ (TMap *)mapForID:(NSString *)identifier; 40*67e74705SXin Li- (void)dataWithCompletionBlock:(TDataCompletionBlock)block; 41*67e74705SXin Li@end 42*67e74705SXin Li 43*67e74705SXin Litypedef enum : NSUInteger { 44*67e74705SXin Li TOK = 100, 45*67e74705SXin Li TError = 125, 46*67e74705SXin Li} TResponseCode; 47*67e74705SXin Li 48*67e74705SXin Li@interface TConnection : NSObject 49*67e74705SXin Li- (void)sendString:(NSString *)string; 50*67e74705SXin Li- (void)sendFormat:(NSString *)format, ...; 51*67e74705SXin Li- (void)sendResponseCode:(TResponseCode)responseCode dataFollows:(BOOL)flag 52*67e74705SXin Li format:(NSString *)format, ...; 53*67e74705SXin Li@end 54*67e74705SXin Li 55*67e74705SXin Li@interface TServer : NSObject 56*67e74705SXin Li@end 57*67e74705SXin Li 58*67e74705SXin Li@implementation TServer 59*67e74705SXin Li- (void)serverConnection:(TConnection *)connection getCommand:(NSString *)str 60*67e74705SXin Li{ 61*67e74705SXin Li NSString *mapID = nil; 62*67e74705SXin Li TMap *map = [TMap mapForID:mapID]; 63*67e74705SXin Li// Make sure we do not map code generated for the block to the above line. 64*67e74705SXin Li// CHECK: define internal void @"__39-[TServer serverConnection:getCommand:]_block_invoke" 65*67e74705SXin Li// CHECK: call void @objc_storeStrong(i8** [[ZERO:%.*]], i8* [[ONE:%.*]]) [[NUW:#[0-9]+]] 66*67e74705SXin Li// CHECK: call void @objc_storeStrong(i8** [[TWO:%.*]], i8* [[THREE:%.*]]) [[NUW]] 67*67e74705SXin Li// CHECK: call {{.*}}@objc_msgSend{{.*}}, !dbg ![[LINE_ABOVE:[0-9]+]] 68*67e74705SXin Li// CHECK: getelementptr 69*67e74705SXin Li// CHECK-NOT: !dbg, ![[LINE_ABOVE]] 70*67e74705SXin Li// CHECK: bitcast %5** [[TMP:%.*]] to i8** 71*67e74705SXin Li// CHECK-NOT: !dbg, ![[LINE_ABOVE]] 72*67e74705SXin Li// CHECK: call void @objc_storeStrong(i8** [[VAL1:%.*]], i8* null) [[NUW]] 73*67e74705SXin Li// CHECK-NEXT: bitcast %4** [[TMP:%.*]] to i8** 74*67e74705SXin Li// CHECK-NEXT: call void @objc_storeStrong(i8** [[VAL2:%.*]], i8* null) [[NUW]] 75*67e74705SXin Li// CHECK-NEXT: ret 76*67e74705SXin Li// CHECK: attributes [[NUW]] = { nounwind } 77*67e74705SXin Li [map dataWithCompletionBlock:^(NSData *data, NSError *error) { 78*67e74705SXin Li if (data) { 79*67e74705SXin Li NSString *encoded = [[data compressedData] encodedString:18]; 80*67e74705SXin Li [connection sendResponseCode:TOK dataFollows:YES 81*67e74705SXin Li format:@"Sending \"%@\" (%@)", [map name], [map identifier]]; 82*67e74705SXin Li [encoded enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) { 83*67e74705SXin Li [connection sendFormat:@"%@\r\n", line]; 84*67e74705SXin Li }]; 85*67e74705SXin Li [connection sendString:@".\r\n"]; 86*67e74705SXin Li } else { 87*67e74705SXin Li [connection sendResponseCode:TError dataFollows:NO 88*67e74705SXin Li format:@"Failed \"%@\" (%@)", [map name], [map identifier]]; 89*67e74705SXin Li } 90*67e74705SXin Li }]; 91*67e74705SXin Li} 92*67e74705SXin Li@end 93