Skip to content

Commit 9ccc2dd

Browse files
committed
IRGen: super_method: Dynamically get superclass of static base class
After talking with @jckarter and @slavapestov we decided that getting the superclass at runtime for super_method lookup was the right approach if its based in the static base class and the lookup doesn't start with the instance pointer. NFC for current IRGen - SILGen doesn't lead to here yet. rdar://problem/22749732
1 parent 6d831bd commit 9ccc2dd

File tree

3 files changed

+16
-12
lines changed

3 files changed

+16
-12
lines changed

lib/IRGen/GenMeta.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4313,9 +4313,10 @@ llvm::Value *irgen::emitVirtualMethodValue(IRGenFunction &IGF,
43134313
if (auto metaTy = dyn_cast<MetatypeType>(baseType.getSwiftRValueType()))
43144314
baseType = SILType::getPrimitiveObjectType(metaTy.getInstanceType());
43154315

4316-
auto superType = baseType.getSuperclass(/*resolver=*/nullptr);
4317-
metadata = emitClassHeapMetadataRef(IGF, superType.getSwiftRValueType(),
4316+
metadata = emitClassHeapMetadataRef(IGF, baseType.getSwiftRValueType(),
43184317
MetadataValueType::TypeMetadata);
4318+
auto superField = emitAddressOfSuperclassRefInClassMetadata(IGF, metadata);
4319+
metadata = IGF.Builder.CreateLoad(superField);
43194320
} else {
43204321
if ((isa<FuncDecl>(methodDecl) && cast<FuncDecl>(methodDecl)->isStatic()) ||
43214322
(isa<ConstructorDecl>(methodDecl) &&

test/IRGen/super_class_method.sil

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,12 @@ sil_vtable Child {
4747
sil_vtable Grandchild {
4848
#Parent.foo!1: Grandchild_foo
4949
}
50-
5150
// CHECK-LABEL: define void @Grandchild_foo(%swift.type*) #0
52-
// CHECK: [[CHILD_METADATA_PTR:%[0-9]+]] = call %swift.type* @_TMaC18super_class_method5Child()
53-
// CHECK: [[CASTED_CHILD_METADATA_PTR:%[0-9]+]] = bitcast %swift.type* [[CHILD_METADATA_PTR]] to void (%swift.type*)**
54-
// CHECK: [[FOO_VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%swift.type*)*, void (%swift.type*)** [[CASTED_CHILD_METADATA_PTR]]
55-
// CHECK: [[FOO_FNPTR:%[0-9]+]] = load void (%swift.type*)*, void (%swift.type*)** [[FOO_VTABLE_SLOT]]
51+
// CHECK: [[CHILD_METADATA_PTR:%[0-9]+]] = call %swift.type* @_TMaC18super_class_method10Grandchild()
52+
// CHECK: [[OPAQUE_CHILD_METADATA_PTR:%[0-9]+]] = bitcast %swift.type* [[CHILD_METADATA_PTR]] to %swift.type**
53+
// CHECK: [[SUPER_METADATA_PTR:%[0-9]+]] = getelementptr inbounds %swift.type*, %swift.type** [[OPAQUE_CHILD_METADATA_PTR]], i32 1
54+
// CHECK: [[SUPER_METADATA:%[0-9]+]] = load %swift.type*, %swift.type** [[SUPER_METADATA_PTR]]
55+
// CHECK: [[OPAQUE_SUPER_METADATA_PTR:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%swift.type*)**
56+
// CHECK: [[FOO_VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%swift.type*)*, void (%swift.type*)** [[OPAQUE_SUPER_METADATA_PTR]]
57+
// CHECK: [[FOO_FN_PTR:%[0-9]+]] = load void (%swift.type*)*, void (%swift.type*)** [[FOO_VTABLE_SLOT]]
5658
// CHECK: call void
57-

test/IRGen/super_instance_method.sil

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,11 @@ sil_vtable Grandchild {
4949
}
5050

5151
// CHECK-LABEL: define void @Grandchild_foo(%C21super_instance_method10Grandchild*)
52-
// CHECK: [[CHILD_METADATA_PTR:%[0-9]+]] = call %swift.type* @_TMaC21super_instance_method5Child()
53-
// CHECK: [[CASTED_CHILD_METADATA_PTR:%[0-9]+]] = bitcast %swift.type* [[CHILD_METADATA_PTR]] to void (%C21super_instance_method6Parent*)**
54-
// CHECK: [[FOO_VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%C21super_instance_method6Parent*)*, void (%C21super_instance_method6Parent*)** [[CASTED_CHILD_METADATA_PTR]]
52+
// CHECK: [[GRANDCHILD_METADATA_PTR:%[0-9]+]] = call %swift.type* @_TMaC21super_instance_method10Grandchild()
53+
// CHECK: [[OPAQUE_METADATA_PTR:%[0-9]+]] = bitcast %swift.type* %4 to %swift.type**
54+
// CHECK: [[SUPER_METADATA_PTR:%[0-9]+]] = getelementptr inbounds %swift.type*, %swift.type** [[OPAQUE_METADATA_PTR]], i32 1
55+
// CHECK: [[SUPER_METADATA:%[0-9]+]] = load %swift.type*, %swift.type** [[SUPER_METADATA_PTR]]
56+
// CHECK: [[PARENT_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%C21super_instance_method6Parent*)**
57+
// CHECK: [[FOO_VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%C21super_instance_method6Parent*)*, void (%C21super_instance_method6Parent*)** [[PARENT_METADATA]]
5558
// CHECK: [[FOO_FN_PTR:%[0-9]+]] = load void (%C21super_instance_method6Parent*)*, void (%C21super_instance_method6Parent*)** [[FOO_VTABLE_SLOT]]
5659
// CHECK: call void
57-

0 commit comments

Comments
 (0)