xref: /llvm-project/clang/test/CodeGenObjC/dllstorage.m (revision 7c25ae87f7378f38aa49a92b9cf8092deb95a1f4)
1// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -fobjc-runtime=ios -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s
2// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -fobjc-runtime=gnustep-2.0 -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-NF %s
3// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=macosx -fdeclspec -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s
4// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=objfw -fdeclspec -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-FW %s
5
6// CHECK-IR-DAG: @_objc_empty_cache = external dllimport global %struct._objc_cache
7
8__declspec(dllimport)
9@interface I
10+ (instancetype) new;
11@end
12
13// CHECK-IR-DAG: @"OBJC_METACLASS_$_I" = external dllimport global %struct._class_t
14// CHECK-IR-DAG: @"OBJC_CLASS_$_I" = external dllimport global %struct._class_t
15
16// CHECK-NF-DAG: @"$_OBJC_CLASS_I" = external dllimport global ptr
17
18__declspec(dllexport)
19@interface J : I
20@end
21
22// CHECK-IR-DAG: @"OBJC_METACLASS_$_J" = dso_local dllexport global %struct._class_t
23// CHECK-IR-DAG: @"OBJC_CLASS_$_J" = dso_local dllexport global %struct._class_t
24
25// CHECK-FW-DAG: @_OBJC_METACLASS_J = dso_local dllexport global
26// CHECK-FW-DAG: @_OBJC_CLASS_J = dso_local dllexport global
27
28// CHECK-NF-DAG: @"$_OBJC_METACLASS_J" = internal global
29// CHECK-NF-DAG: @"$_OBJC_CLASS_J" = dllexport global
30
31@implementation J {
32  id _ivar;
33}
34@end
35
36// CHECK-IR-DAG: @"OBJC_IVAR_$_J._ivar" = global i32
37
38// CHECK-NF-DAG: @"__objc_ivar_offset_J._ivar.@" = hidden global i32
39
40@interface K : J
41@end
42
43// CHECK-IR-DAG: @"OBJC_METACLASS_$_K" = dso_local global %struct._class_t
44// CHECK-IR-DAG: @"OBJC_CLASS_$_K" = dso_local global %struct._class_t
45
46// CHECK-FW-DAG: @_OBJC_METACLASS_K = dso_local global
47// CHECK-FW-DAG: @_OBJC_CLASS_K = dso_local global
48
49// CHECK-NF-DAG: @"$_OBJC_METACLASS_K" = internal global
50// CHECK-NF-DAG: @"$_OBJC_CLASS_K" = global
51
52@implementation K {
53  id _ivar;
54}
55@end
56
57// CHECK-IR-DAG: @"OBJC_IVAR_$_K._ivar" = global i32
58
59// CHECK-NF-DAG: @"__objc_ivar_offset_K._ivar.@" = hidden global i32
60
61__declspec(dllexport)
62@interface L : K
63@end
64
65// CHECK-IR-DAG: @"OBJC_METACLASS_$_L" = dso_local dllexport global %struct._class_t
66// CHECK-IR-DAG: @"OBJC_CLASS_$_L" = dso_local dllexport global %struct._class_t
67
68// CHECK-FW-DAG: @_OBJC_METACLASS_L = dso_local dllexport global
69// CHECK-FW-DAG: @_OBJC_CLASS_L = dso_local dllexport global
70
71// CHECK-NF-DAG: @"$_OBJC_METACLASS_L" = internal global
72// CHECK-NF-DAG: @"$_OBJC_CLASS_L" = dllexport global
73
74@implementation L {
75  id _none;
76
77  @public
78  id _public;
79
80  @protected
81  id _protected;
82
83  @package
84  id _package;
85
86  @private
87  id _private;
88}
89@end
90
91// CHECK-IR-DAG: @"OBJC_IVAR_$_L._none" = global i32
92// CHECK-IR-DAG: @"OBJC_IVAR_$_L._public" = dllexport global i32
93// CHECK-IR-DAG: @"OBJC_IVAR_$_L._protected" = dllexport global i32
94// CHECK-IR-DAG: @"OBJC_IVAR_$_L._package" = global i32
95// CHECK-IR-DAG: @"OBJC_IVAR_$_L._private" = global i32
96
97// CHECK-NF-DAG: @"__objc_ivar_offset_L._none.@" = hidden global i32
98// CHECK-NF-DAG: @"__objc_ivar_offset_L._public.@" = dso_local dllexport global i32
99// CHECK-NF-DAG: @"__objc_ivar_offset_L._protected.@" = dso_local dllexport global i32
100// CHECK-NF-DAG: @"__objc_ivar_offset_L._package.@" = hidden global i32
101// CHECK-NF-DAG: @"__objc_ivar_offset_L._private.@" = hidden global i32
102
103__declspec(dllimport)
104@interface M : I {
105  @public
106  id _ivar;
107}
108@end
109
110// CHECK-FW-DAG: @_OBJC_CLASS_M = external dllimport global i32
111
112// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
113
114// CHECK-NF-DAG: @"$_OBJC_REF_CLASS_M" = external dllimport global ptr
115// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external dllimport global i32
116
117__declspec(dllexport)
118__attribute__((__objc_exception__))
119@interface N : I
120@end
121
122// CHECK-FW-DAG: @_OBJC_METACLASS_N = dso_local dllexport global
123// CHECK-FW-DAG: @_OBJC_CLASS_N = dso_local dllexport global
124
125// CHECK-NF-DAG: @"$_OBJC_CLASS_N" = dllexport global
126
127@implementation N : I
128@end
129
130// CHECK-IR-DAG: @"OBJC_EHTYPE_$_N" = dso_local dllexport global %struct._objc_typeinfo
131
132__declspec(dllimport)
133__attribute__((__objc_exception__))
134@interface O : I
135@end
136
137// CHECK-IR-DAG: @"OBJC_EHTYPE_$_O" = external dllimport global %struct._objc_typeinfo
138
139__attribute__((__objc_exception__))
140@interface P : I
141@end
142
143// CHECK-IR-DAG: @"OBJC_EHTYPE_$_P" = external dso_local global %struct._objc_typeinfo
144
145@interface Q : M
146@end
147
148id f(Q *q) {
149  return q->_ivar;
150}
151
152// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
153
154// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external dllimport global i32
155
156int g(void) {
157  @autoreleasepool {
158    M *mi = [M new];
159    @try {
160      mi->_ivar = (void *)0;
161      @throw(@"CFConstantString");
162    } @catch (id) {
163      return 1;
164    } @catch (I *) {
165      return 2;
166    } @catch (J *) {
167      return 3;
168    } @catch (K *) {
169      return 4;
170    } @catch (L *) {
171      return 5;
172    } @catch (M *) {
173      return 6;
174    } @catch (N *) {
175      return 7;
176    } @catch (O *) {
177      return 8;
178    } @catch (P *) {
179      return 9;
180    }
181  }
182  return 0;
183}
184
185// CHECK-IR-DAG: @OBJC_EHTYPE_id = external dllimport global %struct._objc_typeinfo
186// CHECK-IR-DAG: @"OBJC_EHTYPE_$_I" = weak global %struct._objc_typeinfo
187// CHECK-IR-DAG: @"OBJC_EHTYPE_$_K" = weak global %struct._objc_typeinfo
188// CHECK-IR-DAG: @"OBJC_EHTYPE_$_L" = weak global %struct._objc_typeinfo
189// CHECK-IR-DAG: @"OBJC_EHTYPE_$_M" = weak global %struct._objc_typeinfo
190
191