Skip to content

Commit 4b0328f

Browse files
committed
IRGen: Also list specialized generic class' objective c ro data in the dedicated linker section
List the emitted ro_data of specialized generic classes in the __objc_clsrolist section. rdar://132354480
1 parent af8b19d commit 4b0328f

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

lib/IRGen/GenClass.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1401,6 +1401,12 @@ namespace {
14011401
}
14021402

14031403
auto dataPtr = emitROData(ForMetaClass, DoesNotHaveUpdateCallback);
1404+
1405+
// Record the ro-data globals if this is a pre-specialized class.
1406+
if (specializedGenericType) {
1407+
IGM.addGenericROData(dataPtr);
1408+
}
1409+
14041410
dataPtr = llvm::ConstantExpr::getPtrToInt(dataPtr, IGM.IntPtrTy);
14051411

14061412
llvm::Constant *fields[] = {
@@ -2684,7 +2690,14 @@ static llvm::Constant *doEmitClassPrivateData(
26842690
}
26852691

26862692
// Then build the class RO-data.
2687-
return builder.emitROData(ForClass, hasUpdater);
2693+
auto res = builder.emitROData(ForClass, hasUpdater);
2694+
2695+
// Record the ro-data globals if this is a pre-specialized class.
2696+
if (classUnion.isa<std::pair<ClassDecl*, CanType>>()) {
2697+
IGM.addGenericROData(res);
2698+
}
2699+
2700+
return res;
26882701
}
26892702

26902703
llvm::Constant *irgen::emitSpecializedGenericClassPrivateData(

test/IRGen/generic_class_rodata_list.swift

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-frontend -enable-emit-generic-class-ro_t-list -S %s -o - | %FileCheck %s
1+
// RUN: %target-swift-frontend -prespecialize-generic-metadata -target %target-cpu-apple-macosx12.0 -enable-emit-generic-class-ro_t-list -S %s -o - | %FileCheck %s
22
// REQUIRES: objc_interop
33
// REQUIRES: CPU=x86_64 || CPU=arm64
44
// REQUIRES: OS=macosx
@@ -30,11 +30,33 @@
3030
// CHECK: .quad 0
3131
// CHECK: .quad __CLASS_METHODS__TtC25generic_class_rodata_list9Somethin
3232

33+
34+
// CHECK: __METACLASS_DATA_$s25generic_class_rodata_list9SomethingCySuGMf:
35+
// CHECK: .long 129
36+
// CHECK: .long 40
37+
// CHECK: .long 40
38+
// CHECK: .long 0
39+
// CHECK: .quad _$s25generic_class_rodata_list9SomethingCySuGMf+24
40+
// CHECK: .quad 0
41+
// CHECK: .quad __CLASS_METHODS_$s25generic_class_rodata_list9SomethingCySuGMf
42+
43+
// CHECK: __DATA_$s25generic_class_rodata_list9SomethingCySuGMf:
44+
// CHECK: .long 128
45+
// CHECK: .long 16
46+
// CHECK: .long 16
47+
// CHECK: .long 0
48+
// CHECK: .quad 0
49+
// CHECK: .quad 0
50+
// CHECK: .quad __INSTANCE_METHODS_$s25generic_class_rodata_list9SomethingCySuGMf
51+
52+
3353
// CHECK: .section __DATA,__objc_clsrolist
3454
// CHECK: .p2align 3
3555
// CHECK:_generic_ro_datas:
3656
// CHECK: .quad ___unnamed_1+40
3757
// CHECK: .quad ___unnamed_1+112
58+
// CHECK: .quad __METACLASS_DATA_$s25generic_class_rodata_list9SomethingCySuGMf
59+
// CHECK: .quad __DATA_$s25generic_class_rodata_list9SomethingCySuGMf
3860

3961
import Foundation
4062

@@ -44,3 +66,11 @@ public class Something<T> {
4466
@objc
4567
public static func myStaticMethod() { print("static") }
4668
}
69+
70+
public protocol P {
71+
func t<T>(_ t: T)
72+
}
73+
74+
public func some(_ arr : Something<UInt>, p: P) {
75+
p.t(arr)
76+
}

0 commit comments

Comments
 (0)