blob: 9ba22bcd24fc22e4f0d28ce55ff852431041ad0d [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001// REQUIRES: x86-registered-target
Rafael Espindola14f98892013-09-27 20:21:48 +00002// RUN: %clang_cc1 -emit-llvm -fblocks -fobjc-arc -g -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
Manman Ren3c7a0e12013-01-04 18:51:35 +00003
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"
Bill Wendling4e1125f2013-02-22 09:10:20 +000065// CHECK: call void @objc_storeStrong(i8** [[ZERO:%.*]], i8* [[ONE:%.*]]) [[NUW:#[0-9]+]]
66// CHECK: call void @objc_storeStrong(i8** [[TWO:%.*]], i8* [[THREE:%.*]]) [[NUW]]
Adrian Prantlfa6b0792013-05-02 17:30:20 +000067// CHECK: call {{.*}}@objc_msgSend{{.*}}, !dbg ![[LINE_ABOVE:[0-9]+]]
68// CHECK: getelementptr
69// CHECK-NOT: !dbg, ![[LINE_ABOVE]]
Manman Rendf0be6d2013-01-05 00:01:42 +000070// CHECK: bitcast %5** [[TMP:%.*]] to i8**
Adrian Prantlfa6b0792013-05-02 17:30:20 +000071// CHECK-NOT: !dbg, ![[LINE_ABOVE]]
72// CHECK: call void @objc_storeStrong(i8** [[VAL1:%.*]], i8* null) [[NUW]]
73// CHECK-NEXT: bitcast %4** [[TMP:%.*]] to i8**
74// CHECK-NEXT: call void @objc_storeStrong(i8** [[VAL2:%.*]], i8* null) [[NUW]]
Manman Ren3c7a0e12013-01-04 18:51:35 +000075// CHECK-NEXT: ret
Bill Wendling4e1125f2013-02-22 09:10:20 +000076// CHECK: attributes [[NUW]] = { nounwind }
Manman Ren3c7a0e12013-01-04 18:51:35 +000077 [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