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