xref: /llvm-project/clang/test/CodeGenObjC/debug-info-block-line.m (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
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