mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
205 lines
10 KiB
Plaintext
205 lines
10 KiB
Plaintext
// RUN: %target-swift-frontend %s -emit-ir | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-abi
|
|
|
|
// REQUIRES: CPU=x86_64
|
|
|
|
// Generated from
|
|
// var x : Int32 = 2
|
|
// public func f() -> Int32 { return x }
|
|
// with swiftc -O -parse-as-library -emit-sil
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
struct S {
|
|
var m : Int32
|
|
}
|
|
|
|
public struct S2 {
|
|
public var i, j : Int32
|
|
var s : S
|
|
}
|
|
|
|
// CHECK: %Ts5Int32V = type <{ i32 }>
|
|
// CHECK: %T18static_initializer2S2V = type <{ %Ts5Int32V, %Ts5Int32V, %T18static_initializer1SV }>
|
|
// CHECK: %T18static_initializer1SV = type <{ %Ts5Int32V }>
|
|
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems0c = type { [1 x i64], %T18static_initializer16TestArrayStorageC_tailelems0 }
|
|
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems0 = type <{ %swift.refcounted, %Ts5Int32V, [4 x i8], %Ts5Int64V, %Ts5Int64V }>
|
|
// CHECK-SYSV: %T18static_initializer16TestArrayStorageC_tailelems1c = type { [2 x i64], %T18static_initializer16TestArrayStorageC_tailelems1 }
|
|
// CHECK-WIN: %T18static_initializer16TestArrayStorageC_tailelems1c = type { [1 x i64], %T18static_initializer16TestArrayStorageC_tailelems1 }
|
|
// CHECK-SYSV: %T18static_initializer16TestArrayStorageC_tailelems1 = type <{ %swift.refcounted, %Ts5Int32V, [12 x i8], %Ts7Float80V }>
|
|
// CHECK-WIN: %T18static_initializer16TestArrayStorageC_tailelems1 = type <{ %swift.refcounted, %Ts5Int32V, [1 x i8] }>
|
|
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems3 = type <{ %swift.refcounted, %Ts5Int32V, [1 x i8], [1 x i8] }>
|
|
|
|
sil_global @$s2ch1xSiv : $Int32 = {
|
|
%1 = integer_literal $Builtin.Int32, 2
|
|
%initval = struct $Int32 (%1 : $Builtin.Int32)
|
|
}
|
|
// CHECK: @"$s2ch1xSiv" = {{(dllexport )?}}{{(protected )?}}global %Ts5Int32V <{ i32 2 }>, align 4
|
|
|
|
sil_global @$s6nested1xAA2S2Vv : $S2 = {
|
|
%1 = integer_literal $Builtin.Int32, 2
|
|
%2 = struct $Int32 (%1 : $Builtin.Int32)
|
|
%3 = integer_literal $Builtin.Int32, 3
|
|
%4 = struct $Int32 (%3 : $Builtin.Int32)
|
|
%5 = integer_literal $Builtin.Int32, 4
|
|
%6 = struct $Int32 (%5 : $Builtin.Int32)
|
|
%7 = struct $S (%6 : $Int32)
|
|
%initval = struct $S2 (%2 : $Int32, %4 : $Int32, %7 : $S)
|
|
}
|
|
// CHECK: @"$s6nested1xAA2S2Vv" = {{(dllexport )?}}{{(protected )?}}global %T18static_initializer2S2V <{ %Ts5Int32V <{ i32 2 }>, %Ts5Int32V <{ i32 3 }>, %T18static_initializer1SV <{ %Ts5Int32V <{ i32 4 }> }> }>, align 4
|
|
|
|
final class TestArrayStorage {
|
|
@_hasStorage var count: Int32
|
|
init()
|
|
}
|
|
|
|
sil_vtable TestArrayStorage { }
|
|
|
|
struct TestArray {
|
|
var storage : TestArrayStorage
|
|
}
|
|
|
|
sil_global @static_array : $TestArrayStorage = {
|
|
%0 = integer_literal $Builtin.Int32, 2
|
|
%1 = integer_literal $Builtin.Int64, 10
|
|
%2 = integer_literal $Builtin.Int64, 20
|
|
%3 = struct $Int32 (%0 : $Builtin.Int32)
|
|
%4 = struct $Int64 (%1 : $Builtin.Int64)
|
|
%5 = struct $Int64 (%2 : $Builtin.Int64)
|
|
%initval = object $TestArrayStorage (%3 : $Int32, [tail_elems] %4 : $Int64, %5 : $Int64)
|
|
}
|
|
// CHECK: @static_array = {{(dllexport )?}}{{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems0c { [1 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems0 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [4 x i8] undef, %Ts5Int64V <{ i64 10 }>, %Ts5Int64V <{ i64 20 }> }> }, align 8
|
|
|
|
sil_global @static_aligned_array : $TestArrayStorage = {
|
|
%0 = integer_literal $Builtin.Int32, 2
|
|
%1 = float_literal $Builtin.FPIEEE80, 0x3FFE8000000000000000
|
|
%3 = struct $Int32 (%0 : $Builtin.Int32)
|
|
%4 = struct $Float80 (%1 : $Builtin.FPIEEE80)
|
|
%initval = object $TestArrayStorage (%3 : $Int32, [tail_elems] %4 : $Float80)
|
|
}
|
|
// CHECK-SYSV: @static_aligned_array = {{(dllexport )?}}{{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems1c { [2 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems1 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [12 x i8] undef, %Ts7Float80V <{ x86_fp80 0xK3FFE8000000000000000 }> }> }, align 16
|
|
// CHECK-WIN: @static_aligned_array = {{(dllexport )?}}{{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems1c { [1 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems1 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [1 x i8] undef }> }, align 8
|
|
|
|
final class ClassWithEmptyField {
|
|
@_hasStorage var x: Int32
|
|
@_hasStorage var y: ()
|
|
init()
|
|
}
|
|
|
|
sil_vtable ClassWithEmptyField { }
|
|
|
|
sil_global @static_class_with_empty_field : $ClassWithEmptyField = {
|
|
%0 = integer_literal $Builtin.Int32, 2
|
|
%3 = struct $Int32 (%0 : $Builtin.Int32)
|
|
%5 = tuple ()
|
|
%initval = object $ClassWithEmptyField (%3 : $Int32, %5 : $())
|
|
}
|
|
// CHECK: @static_class_with_empty_field = {{(dllexport )?}}{{(protected )?}}global %T18static_initializer19ClassWithEmptyFieldC_tailelems2c { [1 x i64] zeroinitializer, %T18static_initializer19ClassWithEmptyFieldC_tailelems2 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }> }> }, align 8
|
|
|
|
struct Empty { }
|
|
|
|
sil_global @static_array_with_empty_element : $TestArrayStorage = {
|
|
%0 = struct $Empty () // users: %7, %7
|
|
%1 = integer_literal $Builtin.Int32, 2
|
|
%2 = struct $Int32 (%1 : $Builtin.Int32)
|
|
%initval = object $TestArrayStorage (%2 : $Int32, [tail_elems] %0 : $Empty, %0 : $Empty)
|
|
}
|
|
// CHECK: @static_array_with_empty_element = {{(dllexport )?}}{{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems3c { [1 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems3 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [1 x i8] undef, [1 x i8] undef }> }, align 8
|
|
|
|
struct MyString {
|
|
var buffer: Builtin.BridgeObject
|
|
}
|
|
|
|
sil_global [let] @string_with_offset : $MyString = {
|
|
%0 = integer_literal $Builtin.Int64, -9223372036854775808
|
|
%1 = integer_literal $Builtin.Int1, 0
|
|
%2 = integer_literal $Builtin.Int64, 32
|
|
%3 = string_literal utf8 "abc123asd3sdj3basfasdf"
|
|
%4 = builtin "ptrtoint_Word"(%3 : $Builtin.RawPointer) : $Builtin.Word
|
|
%5 = builtin "zextOrBitCast_Word_Int64"(%4 : $Builtin.Word) : $Builtin.Int64
|
|
%6 = builtin "usub_with_overflow_Int64"(%5 : $Builtin.Int64, %2 : $Builtin.Int64, %1 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
|
|
%7 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 0
|
|
%8 = builtin "stringObjectOr_Int64"(%7 : $Builtin.Int64, %0 : $Builtin.Int64) : $Builtin.Int64
|
|
%9 = value_to_bridge_object %8 : $Builtin.Int64
|
|
%initval = struct $MyString (%9 : $Builtin.BridgeObject)
|
|
}
|
|
// CHECK: @string_with_offset = {{.*global .*}} <{ %swift.bridge* inttoptr (i64 add (i64 ptrtoint ([23 x i8]* @0 to i64), i64 9223372036854775776) to %swift.bridge*) }>, align 8
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8* @_TF2cha1xSi() {{.*}} {
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: ret i8* bitcast (%Ts5Int32V* @"$s2ch1xSiv" to i8*)
|
|
sil [global_init] @_TF2cha1xSi : $@convention(thin) () -> Builtin.RawPointer {
|
|
bb0:
|
|
%0 = global_addr @$s2ch1xSiv : $*Int32
|
|
%1 = address_to_pointer %0 : $*Int32 to $Builtin.RawPointer
|
|
return %1 : $Builtin.RawPointer
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @"$s2ch1fSiyF"() {{.*}} {
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: load i32, i32* getelementptr inbounds (%Ts5Int32V, %Ts5Int32V* @"$s2ch1xSiv", i32 0, i32 0)
|
|
// CHECK-NEXT: ret
|
|
sil @$s2ch1fSiyF : $@convention(thin) () -> Int32 {
|
|
bb0:
|
|
%0 = global_addr @$s2ch1xSiv : $*Int32
|
|
%1 = load %0 : $*Int32
|
|
return %1 : $Int32
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8* @_TF6nesteda1xVS_2S2() {{.*}} {
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: ret i8* bitcast (%T18static_initializer2S2V* @"$s6nested1xAA2S2Vv" to i8*)
|
|
sil [global_init] @_TF6nesteda1xVS_2S2 : $@convention(thin) () -> Builtin.RawPointer {
|
|
bb0:
|
|
%0 = global_addr @$s6nested1xAA2S2Vv : $*S2
|
|
%1 = address_to_pointer %0 : $*S2 to $Builtin.RawPointer
|
|
return %1 : $Builtin.RawPointer
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i64, i32 } @"$s6nested1fAA2S2VyF"() {{.*}} {
|
|
// CHECK-NEXT: entry:
|
|
// CHECK: load i32, i32* getelementptr inbounds (%T18static_initializer2S2V, %T18static_initializer2S2V* @"$s6nested1xAA2S2Vv", i32 0, i32 0, i32 0)
|
|
// CHECK-NEXT: load i32, i32* getelementptr inbounds (%T18static_initializer2S2V, %T18static_initializer2S2V* @"$s6nested1xAA2S2Vv", i32 0, i32 1, i32 0)
|
|
// CHECK-NEXT: load i32, i32* getelementptr inbounds (%T18static_initializer2S2V, %T18static_initializer2S2V* @"$s6nested1xAA2S2Vv", i32 0, i32 2, i32 0, i32 0)
|
|
sil @$s6nested1fAA2S2VyF : $@convention(thin) () -> S2 {
|
|
bb0:
|
|
%0 = global_addr @$s6nested1xAA2S2Vv : $*S2
|
|
%1 = load %0 : $*S2
|
|
return %1 : $S2
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T18static_initializer16TestArrayStorageC* @return_static_array() {{.*}} {
|
|
sil @return_static_array : $@convention(thin) () -> TestArray {
|
|
bb0:
|
|
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s18static_initializer16TestArrayStorageCMa"(i64 0)
|
|
// CHECK: [[MD:%[0-9]+]] = extractvalue %swift.metadata_response [[TMP]], 0
|
|
// CHECK: [[O:%[0-9a-z]+]] = call %swift.refcounted* @swift_initStaticObject(%swift.type* [[MD]], %swift.refcounted* getelementptr inbounds (%T18static_initializer16TestArrayStorageC_tailelems0c, %T18static_initializer16TestArrayStorageC_tailelems0c* @static_array, i32 0, i32 1, i32 0))
|
|
// CHECK: [[R:%[0-9]+]] = bitcast %swift.refcounted* [[O]] to %T18static_initializer16TestArrayStorageC*
|
|
// CHECK: ret %T18static_initializer16TestArrayStorageC* [[R]]
|
|
%0 = global_value @static_array : $TestArrayStorage
|
|
%1 = struct $TestArray (%0 : $TestArrayStorage)
|
|
return %1 : $TestArray
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T18static_initializer16TestArrayStorageC* @phi_nodes(i1 %0, %T18static_initializer16TestArrayStorageC* %1)
|
|
// CHECK: [[T0:%.*]] = call %swift.refcounted* @swift_initStaticObject
|
|
// CHECK: [[T1:%.*]] = bitcast %swift.refcounted* [[T0]] to %T18static_initializer16TestArrayStorageC*
|
|
// CHECK: br
|
|
// CHECK: br
|
|
// CHECK: [[T3:%.*]] = phi %T18static_initializer16TestArrayStorageC* [ %1, {{.*}} ], [ [[T1]], {{.*}} ]
|
|
// CHECK: ret %T18static_initializer16TestArrayStorageC* [[T3]]
|
|
sil @phi_nodes : $@convention(thin) (Builtin.Int1, TestArrayStorage) -> TestArrayStorage {
|
|
bb0(%0 : $Builtin.Int1, %1 : $TestArrayStorage):
|
|
cond_br %0, bb1, bb2
|
|
|
|
bb1:
|
|
%2 = global_value @static_array : $TestArrayStorage
|
|
br bb3(%2 : $TestArrayStorage)
|
|
|
|
bb2:
|
|
br bb3(%1 : $TestArrayStorage)
|
|
|
|
bb3(%3 : $TestArrayStorage):
|
|
return %3 : $TestArrayStorage
|
|
}
|