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 |
5 | typedef unsigned int NSUInteger; |
6 | typedef long NSInteger; |
7 | typedef 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 | |
35 | typedef 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 | |
43 | typedef 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 | |