| // RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -emit-ir | %FileCheck %s |
| |
| // REQUIRES: CPU=x86_64 |
| |
| import Swift |
| |
| // CHECK-LABEL: @_T018field_type_vectors3FooVMn = hidden constant |
| // CHECK: %swift.type** (%swift.type*)* [[FOO_TYPES_ACCESSOR:@[A-Za-z0-9_]*]] |
| struct Foo { |
| var x: Int |
| } |
| |
| // CHECK-LABEL: @_T018field_type_vectors3BarVMn = hidden constant |
| // CHECK: %swift.type** (%swift.type*)* [[BAR_TYPES_ACCESSOR:@[A-Za-z0-9_]*]] |
| // CHECK-LABEL: @_T018field_type_vectors3BarVMP = internal global |
| // -- There should be 4 words between the address point and the field type |
| // vector slot, with type %swift.type** |
| // CHECK: i64, <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i32 }>*, i64, %swift.type*, %swift.type** |
| struct Bar<T> { |
| var y: Int |
| } |
| |
| // CHECK-LABEL: @_T018field_type_vectors3BasVMn = hidden constant |
| // CHECK: %swift.type** (%swift.type*)* [[BAS_TYPES_ACCESSOR:@[A-Za-z0-9_]*]] |
| // CHECK-LABEL: @_T018field_type_vectors3BasVMP = internal global |
| // -- There should be 6 words between the address point and the field type |
| // vector slot, with type %swift.type** |
| // CHECK: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i32 }>*, i64, i64, %swift.type*, %swift.type*, %swift.type** |
| struct Bas<T, U> { |
| var foo: Foo |
| var bar: Bar<T> |
| } |
| |
| // CHECK-LABEL: @_T018field_type_vectors3ZimCMn = hidden constant |
| // CHECK: %swift.type** (%swift.type*)* [[ZIM_TYPES_ACCESSOR:@[A-Za-z0-9_]*]] |
| // CHECK-LABEL: @_T018field_type_vectors3ZimCMP = internal global |
| // -- There should be 14 words between the address point and the field type |
| // vector slot, with type %swift.type** |
| // CHECK: i64, %swift.type*, %swift.opaque*, %swift.opaque*, i64, i32, i32, i32, i16, i16, i32, i32, <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i32, i32, i32, %swift.method_descriptor }>*, i8*, %swift.type*, %swift.type*, i8*, i64, i64, i64, %swift.type** |
| class Zim<T, U> { |
| var foo: Foo? |
| var bar: Bar<T>? |
| var bas: Bas<T, U>? |
| } |
| sil_vtable Zim {} |
| |
| sil @_TFC18field_type_vectors3ZimcU___fMGS0_Q_Q0__FT_GS0_Q_Q0__ : $@convention(method) <T, U> (@owned Zim<T, U>) -> @owned Zim<T, U> |
| |
| // CHECK-LABEL: @_T018field_type_vectors4ZangCMn = hidden constant |
| // CHECK: %swift.type** (%swift.type*)* [[ZANG_TYPES_ACCESSOR:@[A-Za-z0-9_]*]] |
| // CHECK-LABEL: @_T018field_type_vectors4ZangCMP = internal global |
| // -- There should be 16 words between the address point and the field type |
| // vector slot, with type %swift.type** |
| // CHECK: i64, %swift.type*, %swift.opaque*, %swift.opaque*, i64, i32, i32, i32, i16, i16, i32, i32, <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i32 }>*, i8*, %swift.type*, %swift.type*, i8*, i64, i64, i64, %swift.type*, i64, %swift.type** |
| class Zang<V>: Zim<V, V> { |
| var zung: Int = 0 |
| } |
| sil_vtable Zang {} |
| |
| sil @_TFC18field_type_vectors4ZangcU__fMGS0_Q__FT_GS0_Q__ : $@convention(method) <V> (@owned Zang<V>) -> @owned Zang<V> |
| |
| // -- For storage-qualified fields, we just report the formal type. |
| class StorageQualified { |
| unowned var a: StorageQualified |
| weak var b: StorageQualified? |
| |
| init(x: StorageQualified) { |
| a = x |
| b = x |
| } |
| } |
| sil_vtable StorageQualified {} |
| |
| // CHECK: [[FOO_TYPE_VECTOR_SLOT:@.*Foo.*]] = private global %swift.type** null |
| |
| // CHECK: define{{( protected)?}} private %swift.type** [[FOO_TYPES_ACCESSOR]](%swift.type* %Foo) |
| // CHECK: [[EXISTING:%.*]] = load %swift.type**, %swift.type*** [[FOO_TYPE_VECTOR_SLOT]] |
| // CHECK: [[IS_NULL:%.*]] = icmp eq %swift.type** [[EXISTING]], null |
| // CHECK: br i1 [[IS_NULL]], label %[[BUILD_FIELD_TYPES:.*]], label %[[DONE:.*]] |
| // CHECK: [[BUILD_FIELD_TYPES]]: |
| // CHECK: store {{.*}} @_T0SiN |
| // CHECK: cmpxchg {{.*}} [[FOO_TYPE_VECTOR_SLOT]] |
| |
| // CHECK: define{{( protected)?}} private %swift.type** [[BAR_TYPES_ACCESSOR]](%swift.type* %"Bar<T>") |
| // CHECK: [[T0:%.*]] = bitcast %swift.type* %"Bar<T>" to %swift.type*** |
| // -- 4 words between the address point and the slot |
| // CHECK: [[SLOT:%.*]] = getelementptr inbounds %swift.type**, %swift.type*** [[T0]], i32 4 |
| // CHECK: load %swift.type**, %swift.type*** [[SLOT]], align 8 |
| // CHECK: br |
| // CHECK-NOT: load %swift.type*, |
| // CHECK: store {{.*}} @_T0SiN |
| |
| |
| // CHECK: define{{( protected)?}} private %swift.type** [[BAS_TYPES_ACCESSOR]](%swift.type* %"Bas<T, U>") |
| // CHECK: [[T0:%.*]] = bitcast %swift.type* %"Bas<T, U>" to %swift.type*** |
| // -- 6 words between the address point and the slot |
| // CHECK: [[SLOT:%.*]] = getelementptr inbounds %swift.type**, %swift.type*** [[T0]], i32 6 |
| // CHECK: load %swift.type**, %swift.type*** [[SLOT]], align 8 |
| // CHECK: br |
| // CHECK: store {{.*}} @_T018field_type_vectors3FooVMf |
| // CHECK: call %swift.type* @_T018field_type_vectors3BarVMa(%swift.type* %T) |
| |
| // CHECK: define{{( protected)?}} private %swift.type** [[ZIM_TYPES_ACCESSOR]](%swift.type* %"Zim<T, U>") |
| // CHECK: [[T0:%.*]] = bitcast %swift.type* %"Zim<T, U>" to %swift.type*** |
| // -- 14 words between the address point and the slot |
| // CHECK: [[SLOT:%.*]] = getelementptr inbounds %swift.type**, %swift.type*** [[T0]], i32 16 |
| // CHECK: load %swift.type**, %swift.type*** [[SLOT]], align 8 |
| |
| // CHECK: define{{( protected)?}} private %swift.type** [[ZANG_TYPES_ACCESSOR]](%swift.type* %"Zang<V>") |
| // CHECK: [[T0:%.*]] = bitcast %swift.type* %"Zang<V>" to %swift.type*** |
| // -- 16 words between the address point and the slot |
| // CHECK: [[SLOT:%.*]] = getelementptr inbounds %swift.type**, %swift.type*** [[T0]], i32 18 |
| // CHECK: load %swift.type**, %swift.type*** [[SLOT]], align 8 |
| |