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