Skip to content

Commit

Permalink
Set dllimport on Objective C ivar offsets (llvm#107604)
Browse files Browse the repository at this point in the history
Ensures that offsets for instance variables are marked with `dllimport`
if the interface to which they belong has this attribute.
  • Loading branch information
qmfrederik authored and VitaNuo committed Sep 12, 2024
1 parent 7097f30 commit 6ace2c1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
11 changes: 9 additions & 2 deletions clang/lib/CodeGen/CGObjCGNU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1699,11 +1699,18 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
llvm::Value *EmitIvarOffset(CodeGenFunction &CGF,
const ObjCInterfaceDecl *Interface,
const ObjCIvarDecl *Ivar) override {
const std::string Name = GetIVarOffsetVariableName(Ivar->getContainingInterface(), Ivar);
const ObjCInterfaceDecl *ContainingInterface =
Ivar->getContainingInterface();
const std::string Name =
GetIVarOffsetVariableName(ContainingInterface, Ivar);
llvm::GlobalVariable *IvarOffsetPointer = TheModule.getNamedGlobal(Name);
if (!IvarOffsetPointer)
if (!IvarOffsetPointer) {
IvarOffsetPointer = new llvm::GlobalVariable(TheModule, IntTy, false,
llvm::GlobalValue::ExternalLinkage, nullptr, Name);
if (Ivar->getAccessControl() != ObjCIvarDecl::Private &&
Ivar->getAccessControl() != ObjCIvarDecl::Package)
CGM.setGVProperties(IvarOffsetPointer, ContainingInterface);
}
CharUnits Align = CGM.getIntAlign();
llvm::Value *Offset =
CGF.Builder.CreateAlignedLoad(IntTy, IvarOffsetPointer, Align);
Expand Down
4 changes: 2 additions & 2 deletions clang/test/CodeGenObjC/dllstorage.m
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ @interface M : I {
// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32

// CHECK-NF-DAG: @"$_OBJC_REF_CLASS_M" = external dllimport global ptr
// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external global i32
// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external dllimport global i32

__declspec(dllexport)
__attribute__((__objc_exception__))
Expand Down Expand Up @@ -151,7 +151,7 @@ id f(Q *q) {

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

// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external global i32
// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external dllimport global i32

int g(void) {
@autoreleasepool {
Expand Down
10 changes: 10 additions & 0 deletions clang/test/SemaObjC/ivar-access-tests.m
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

@interface MySuperClass
{
int unmarked;

@private
int private;

Expand All @@ -17,6 +19,7 @@ @implementation MySuperClass
- (void) test {
int access;
MySuperClass *s = 0;
access = s->unmarked;
access = s->private;
access = s->protected;
}
Expand All @@ -30,9 +33,11 @@ @implementation MyClass
- (void) test {
int access;
MySuperClass *s = 0;
access = s->unmarked;
access = s->private; // expected-error {{instance variable 'private' is private}}
access = s->protected;
MyClass *m=0;
access = m->unmarked;
access = m->private; // expected-error {{instance variable 'private' is private}}
access = m->protected;
}
Expand All @@ -46,9 +51,11 @@ @implementation Deeper
- (void) test {
int access;
MySuperClass *s = 0;
access = s->unmarked;
access = s->private; // expected-error {{instance variable 'private' is private}}
access = s->protected;
MyClass *m=0;
access = m->unmarked;
access = m->private; // expected-error {{instance variable 'private' is private}}
access = m->protected;
}
Expand All @@ -61,9 +68,11 @@ @implementation Unrelated
- (void) test {
int access;
MySuperClass *s = 0;
access = s->unmarked; // expected-error {{instance variable 'unmarked' is protected}}
access = s->private; // expected-error {{instance variable 'private' is private}}
access = s->protected; // expected-error {{instance variable 'protected' is protected}}
MyClass *m=0;
access = m->unmarked; // expected-error {{instance variable 'unmarked' is protected}}
access = m->private; // expected-error {{instance variable 'private' is private}}
access = m->protected; // expected-error {{instance variable 'protected' is protected}}
}
Expand All @@ -73,6 +82,7 @@ int main (void)
{
MySuperClass *s = 0;
int access;
access = s->unmarked; // expected-error {{instance variable 'unmarked' is protected}}
access = s->private; // expected-error {{instance variable 'private' is private}}
access = s->protected; // expected-error {{instance variable 'protected' is protected}}
return 0;
Expand Down

0 comments on commit 6ace2c1

Please sign in to comment.