blob: e130c37d86921a4c54d797a777de317394f4dec8 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %{python} %utils/chex.py < %s > %t/class_metadata.swift
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %t/class_metadata.swift -check-prefix=CHECK -check-prefix=CHECK-%target-ptrsize -check-prefix CHECK-%target-import-type
class A {}
// CHECK: [[A_NAME:@.*]] = private constant [2 x i8] c"A\00"
// CHECK-LABEL: @"$s14class_metadata1ACMn" =
// Flags. 0x8000_0050 == HasVTable | Unique | Class
// CHECK-DIRECT-SAME: <i32 0x8000_0050>,
// CHECK-INDIRECT-SAME: <i32 0x8001_0050>,
// Parent.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadataMXM"
// Name.
// CHECK-SAME: i32 {{.*}} [[A_NAME]]
// Metadata access function.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1ACMa"
// Superclass.
// CHECK-SAME: i32 0,
// Negative size in words.
// CHECK-SAME: i32 2,
// Positive size in words.
// CHECK-32-SAME: i32 14,
// CHECK-64-SAME: i32 11,
// Field count.
// CHECK-SAME: i32 0,
// Field offset vector offset.
// CHECK-32-SAME: i32 13,
// CHECK-64-SAME: i32 10,
// V-table offset.
// CHECK-32-SAME: i32 13,
// CHECK-64-SAME: i32 10,
// V-table length.
// CHECK-SAME: i32 1,
// CHECK-SMAE: %swift.method_descriptor {
// V-table entry #1: flags.
// CHECK-SAME: i32 1
// V-table entry #1: invocation function.
// CHECK-SAME: @"$s14class_metadata1ACACycfC"
// CHECK-SAME: }>, section
class B : A {}
// CHECK: [[B_NAME:@.*]] = private constant [2 x i8] c"B\00"
// CHECK-LABEL: @"$s14class_metadata1BCMn" =
// Flags. 0x4000_0050 == HasOverrideTable | Unique | Class
// CHECK-DIRECT-SAME: <i32 0x4000_0050>,
// CHECK-INDIRECT-SAME: <i32 0x4001_0050>,
// Parent.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadataMXM"
// Name.
// CHECK-SAME: i32 {{.*}} [[B_NAME]]
// Metadata access function.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1BCMa"
// Superclass type.
// CHECK-SAME: @"symbolic _____ 14class_metadata1AC"
// Negative size in words.
// CHECK-SAME: i32 2,
// Positive size in words.
// CHECK-32-SAME: i32 14,
// CHECK-64-SAME: i32 11,
// Immediate member count.
// CHECK-SAME: i32 0,
// Field count.
// CHECK-SAME: i32 0,
// Field offset vector offset.
// CHECK-32-SAME: i32 14,
// CHECK-64-SAME: i32 11,
// Number of method overrides.
// CHECK-SAME: i32 1,
// CHECK-SAME: %swift.method_override_descriptor {
// Override table entry #1: base class.
// CHECK-SAME: @"$s14class_metadata1ACMn"
// Override table entry #1: base method.
// CHECK-DIRECT-SAME: @"$s14class_metadata1ACMn", i32 0, i32 13
// CHECK-INDIRECT-SAME: @"$s14class_metadata1ACMn", i32 0, i32 16
// Override table entry #1: invocation function.
// CHECK-SAME: @"$s14class_metadata1BCACycfC"
// CHECK-SAME: }>, section
class C<T> : B {}
// CHECK: [[C_NAME:@.*]] = private constant [2 x i8] c"C\00"
// CHECK-LABEL: @"$s14class_metadata1CCMn" =
// Flags. 0x4000_00d0 == HasOverrideTable | Generic | Unique | Class
// CHECK-SAME: <i32 0x4000_00d0>,
// Parent.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadataMXM"
// Name.
// CHECK-SAME: i32 {{.*}} [[C_NAME]]
// Metadata access function.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1CCMa"
// Superclass type.
// CHECK-SAME: @"symbolic _____ 14class_metadata1BC"
// Negative size in words.
// CHECK-SAME: i32 2,
// Positive size in words.
// CHECK-32-SAME: i32 15,
// CHECK-64-SAME: i32 12,
// Num immediate members.
// CHECK-32-SAME: i32 1,
// Field count.
// CHECK-SAME: i32 0,
// Field offset vector offset.
// CHECK-32-SAME: i32 15,
// CHECK-64-SAME: i32 12,
// Instantiation cache.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1CCMI"
// Instantiation pattern.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1CCMP"
// Generic parameter count.
// CHECK-SAME: i16 1,
// Generic requirement count.
// CHECK-SAME: i16 0,
// Key generic arguments count.
// CHECK-SAME: i16 1,
// Extra generic arguments count.
// CHECK-SAME: i16 0,
// Generic parameter descriptor #1: flags. -128 == 0x80 == Key
// CHECK-SAME: i8 -128,
// Padding.
// CHECK-SAME: i8 0,
// CHECK-SAME: i8 0,
// CHECK-SAME: i8 0,
// Number of method overrides.
// CHECK-SAME: i32 1,
// CHECK-SAME: %swift.method_override_descriptor {
// Override table entry #1: base class.
// CHECK-SAME: @"$s14class_metadata1ACMn"
// Override table entry #1: base method.
// CHECK-DIRECT-SAME: @"$s14class_metadata1ACMn", i32 0, i32 13
// CHECK-INDIRECT-SAME: @"$s14class_metadata1ACMn", i32 0, i32 16
// Override table entry #1: invocation function.
// CHECK-SAME: @"$s14class_metadata1CCACyxGycfC"
// CHECK-SAME: }>, section
// CHECK-LABEL: @"$s14class_metadata1CCMP" =
// Instantiation function.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1CCMi"
// For stupid reasons, when we declare the superclass after the subclass,
// we end up using an indirect reference to the nominal type descriptor.
class D : E {}
// CHECK: [[D_NAME:@.*]] = private constant [2 x i8] c"D\00"
// CHECK-LABEL: @"$s14class_metadata1DCMn" =
// Flags. 0x4200_0050 == HasOverrideTable | Unique | Class
// CHECK-DIRECT-SAME: <i32 0x4000_0050>,
// CHECK-INDIRECT-SAME: <i32 0x4001_0050>,
// Parent.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadataMXM"
// Name.
// CHECK-SAME: i32 {{.*}} [[D_NAME]]
// Metadata access function.
// CHECK-SAME: i32 {{.*}} @"$s14class_metadata1DCMa"
// Superclass type.
// CHECK-SAME: @"symbolic _____ 14class_metadata1EC"
// Negative size in words.
// CHECK-SAME: i32 2,
// Positive size in words.
// CHECK-32-SAME: i32 14,
// CHECK-64-SAME: i32 11,
// Immediate member count.
// CHECK-SAME: i32 0,
// Field count.
// CHECK-SAME: i32 0,
// Field offset vector offset.
// CHECK-32-SAME: i32 14,
// CHECK-64-SAME: i32 11,
// Number of method overrides.
// CHECK-SAME: i32 1,
// CHECK-SAME: %swift.method_override_descriptor {
// Override table entry #1: base class.
// CHECK-SAME: @"$s14class_metadata1ECMn"
// Override table entry #1: base method.
// CHECK-SAME: @"$s14class_metadata1ECMn"
// Override table entry #1: invocation function.
// CHECK-SAME: @"$s14class_metadata1DCACycfC"
// CHECK-SAME: }>, section
class E {}
// CHECK-LABEL: @"$s14class_metadata1FCMn" =
// CHECK-SAME: @"symbolic _____yq_G 14class_metadata1CC"
class F<T, U> : C<U> { }