Skip to content

Commit dcc0e46

Browse files
authored
Merge pull request swiftlang#36870 from jckarter/rodata-const-only-if-class-layout-fixed
IRGen: ObjC rodata can only go in __objc_const if layout is fixed.
2 parents aecb8f3 + b929343 commit dcc0e46

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

lib/IRGen/GenClass.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1494,7 +1494,12 @@ namespace {
14941494
emitRODataFields(fields, forMeta, hasUpdater);
14951495

14961496
auto dataSuffix = forMeta ? "_METACLASS_DATA_" : "_DATA_";
1497-
return buildGlobalVariable(fields, dataSuffix, /*const*/ true);
1497+
1498+
// The rodata is constant if the object layout is known entirely
1499+
// statically. Otherwise, the ObjC runtime may slide the InstanceSize
1500+
// based on changing base class layout.
1501+
return buildGlobalVariable(fields, dataSuffix,
1502+
/*const*/ forMeta || FieldLayout->isFixedSize());
14981503
}
14991504

15001505
private:

test/IRGen/Inputs/ObjCBaseClasses.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#import <Foundation.h>
2+
3+
@interface ObjCBase: NSObject
4+
@end
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
open class ResilientBase {}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -enable-library-evolution -emit-module-path %t/ResilientBaseClasses.swiftmodule %S/Inputs/ResilientBaseClasses.swift
3+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %t -import-objc-header %S/Inputs/ObjCBaseClasses.h -emit-ir %s | %FileCheck %s
4+
// REQUIRES: objc_interop
5+
6+
7+
import ResilientBaseClasses
8+
9+
// CHECK: @_METACLASS_DATA_{{.*}}9PureSwift = {{.*}} constant {{.*}} section "__DATA, __objc_const"
10+
// CHECK: @_DATA_{{.*}}9PureSwift = {{.*}} constant {{.*}} section "__DATA, __objc_const"
11+
class PureSwift {
12+
var x: Int = 0
13+
}
14+
15+
// CHECK: @_METACLASS_DATA_{{.*}}12PureSwiftSub = {{.*}} constant {{.*}} section "__DATA, __objc_const"
16+
// CHECK: @_DATA_{{.*}}12PureSwiftSub = {{.*}} constant {{.*}} section "__DATA, __objc_const"
17+
class PureSwiftSub: PureSwift {
18+
var y: Int = 0
19+
}
20+
21+
// CHECK: @_METACLASS_DATA_{{.*}}12ObjCSwiftSub = {{.*}} constant {{.*}} section "__DATA, __objc_const"
22+
// CHECK: @_DATA_{{.*}}12ObjCSwiftSub = {{.*}} constant {{.*}} section "__DATA, __objc_data"
23+
class ObjCSwiftSub: ObjCBase {
24+
var z: Int = 0
25+
}
26+
27+
// CHECK: @_METACLASS_DATA_{{.*}}17ResilientSwiftSub = {{.*}} constant {{.*}} section "__DATA, __objc_const"
28+
// CHECK: @_DATA_{{.*}}17ResilientSwiftSub = {{.*}} constant {{.*}} section "__DATA, __objc_data"
29+
class ResilientSwiftSub: ResilientBase {
30+
var z: Int = 0
31+
}

0 commit comments

Comments
 (0)