Skip to content

Commit b81ba52

Browse files
authored
Set dllstorage on ObjectiveC ivar offsets (llvm#77385)
Mark instance variable offset symbols with `dllexport`/`dllimport` if they are not hidden and the interface declaration is marked with `dllexport`/`dllimport`, when using the GNUstep 2.x ABI. /cc @davidchisnall
1 parent b399c84 commit b81ba52

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

clang/lib/CodeGen/CGObjCGNU.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,8 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
18511851
llvm::GlobalValue::HiddenVisibility :
18521852
llvm::GlobalValue::DefaultVisibility;
18531853
OffsetVar->setVisibility(ivarVisibility);
1854+
if (ivarVisibility != llvm::GlobalValue::HiddenVisibility)
1855+
CGM.setGVProperties(OffsetVar, OID->getClassInterface());
18541856
ivarBuilder.add(OffsetVar);
18551857
// Ivar size
18561858
ivarBuilder.addInt(Int32Ty,

clang/test/CodeGenObjC/dllstorage.m

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -fobjc-runtime=ios -fobjc-exceptions -S -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 -S -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-NF %s
23
// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=macosx -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s
34
// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=objfw -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-FW %s
45

@@ -12,6 +13,8 @@ + (instancetype) new;
1213
// CHECK-IR-DAG: @"OBJC_METACLASS_$_I" = external dllimport global %struct._class_t
1314
// CHECK-IR-DAG: @"OBJC_CLASS_$_I" = external dllimport global %struct._class_t
1415

16+
// CHECK-NF-DAG: @"$_OBJC_CLASS_I" = external dllimport global ptr
17+
1518
__declspec(dllexport)
1619
@interface J : I
1720
@end
@@ -22,13 +25,18 @@ @interface J : I
2225
// CHECK-FW-DAG: @_OBJC_METACLASS_J = dso_local dllexport global
2326
// CHECK-FW-DAG: @_OBJC_CLASS_J = dso_local dllexport global
2427

28+
// CHECK-NF-DAG: @"$_OBJC_METACLASS_J" = internal global
29+
// CHECK-NF-DAG: @"$_OBJC_CLASS_J" = dllexport global
30+
2531
@implementation J {
2632
id _ivar;
2733
}
2834
@end
2935

3036
// CHECK-IR-DAG: @"OBJC_IVAR_$_J._ivar" = global i32
3137

38+
// CHECK-NF-DAG: @"__objc_ivar_offset_J._ivar.\01" = hidden global i32
39+
3240
@interface K : J
3341
@end
3442

@@ -38,13 +46,18 @@ @interface K : J
3846
// CHECK-FW-DAG: @_OBJC_METACLASS_K = dso_local global
3947
// CHECK-FW-DAG: @_OBJC_CLASS_K = dso_local global
4048

49+
// CHECK-NF-DAG: @"$_OBJC_METACLASS_K" = internal global
50+
// CHECK-NF-DAG: @"$_OBJC_CLASS_K" = global
51+
4152
@implementation K {
4253
id _ivar;
4354
}
4455
@end
4556

4657
// CHECK-IR-DAG: @"OBJC_IVAR_$_K._ivar" = global i32
4758

59+
// CHECK-NF-DAG: @"__objc_ivar_offset_K._ivar.\01" = hidden global i32
60+
4861
__declspec(dllexport)
4962
@interface L : K
5063
@end
@@ -55,6 +68,9 @@ @interface L : K
5568
// CHECK-FW-DAG: @_OBJC_METACLASS_L = dso_local dllexport global
5669
// CHECK-FW-DAG: @_OBJC_CLASS_L = dso_local dllexport global
5770

71+
// CHECK-NF-DAG: @"$_OBJC_METACLASS_L" = internal global
72+
// CHECK-NF-DAG: @"$_OBJC_CLASS_L" = dllexport global
73+
5874
@implementation L {
5975
id _none;
6076

@@ -78,6 +94,12 @@ @implementation L {
7894
// CHECK-IR-DAG: @"OBJC_IVAR_$_L._package" = global i32
7995
// CHECK-IR-DAG: @"OBJC_IVAR_$_L._private" = global i32
8096

97+
// CHECK-NF-DAG: @"__objc_ivar_offset_L._none.\01" = hidden global i32
98+
// CHECK-NF-DAG: @"__objc_ivar_offset_L._public.\01" = dso_local dllexport global i32
99+
// CHECK-NF-DAG: @"__objc_ivar_offset_L._protected.\01" = dso_local dllexport global i32
100+
// CHECK-NF-DAG: @"__objc_ivar_offset_L._package.\01" = hidden global i32
101+
// CHECK-NF-DAG: @"__objc_ivar_offset_L._private.\01" = hidden global i32
102+
81103
__declspec(dllimport)
82104
@interface M : I {
83105
@public
@@ -89,6 +111,9 @@ @interface M : I {
89111

90112
// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
91113

114+
// CHECK-NF-DAG: @"$_OBJC_REF_CLASS_M" = external dllimport global ptr
115+
// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.\01" = external global i32
116+
92117
__declspec(dllexport)
93118
__attribute__((__objc_exception__))
94119
@interface N : I
@@ -97,6 +122,8 @@ @interface N : I
97122
// CHECK-FW-DAG: @_OBJC_METACLASS_N = dso_local dllexport global
98123
// CHECK-FW-DAG: @_OBJC_CLASS_N = dso_local dllexport global
99124

125+
// CHECK-NF-DAG: @"$_OBJC_CLASS_N" = dllexport global
126+
100127
@implementation N : I
101128
@end
102129

@@ -124,6 +151,8 @@ id f(Q *q) {
124151

125152
// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
126153

154+
// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.\01" = external global i32
155+
127156
int g(void) {
128157
@autoreleasepool {
129158
M *mi = [M new];

0 commit comments

Comments
 (0)