1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
// First test: functional correctness
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -O -wmo -parse-as-library -cross-module-optimization -emit-module -emit-module-path=%t/Submodule.swiftmodule -module-name=Submodule %S/Inputs/cross-module/cross-submodule.swift -c -o %t/submodule.o
// RUN: %target-build-swift -O -wmo -parse-as-library -cross-module-optimization -emit-module -emit-module-path=%t/PrivateSubmodule.swiftmodule -module-name=PrivateSubmodule %S/Inputs/cross-module/cross-private-submodule.swift -c -o %t/privatesubmodule.o
// RUN: %target-clang -c --language=c %S/Inputs/cross-module/c-module.c -o %t/c-module.o
// RUN: %target-build-swift -O -wmo -parse-as-library -cross-module-optimization -emit-module -emit-module-path=%t/Test.swiftmodule -module-name=Test -I%t -I%S/Inputs/cross-module %S/Inputs/cross-module/cross-module.swift -c -o %t/test.o
// RUN: %target-build-swift -O -wmo -module-name=Main -I%t %s -c -o %t/main.o
// RUN: %target-swiftc_driver %t/main.o %t/test.o %t/submodule.o %t/privatesubmodule.o %t/c-module.o -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s -check-prefix=CHECK-OUTPUT
// Check if it also works if the main module is compiled with -Onone:
// RUN: %target-build-swift -Onone -wmo -module-name=Main -I%t %s -c -o %t/main-onone.o
// RUN: %target-swiftc_driver %t/main-onone.o %t/test.o %t/submodule.o %t/privatesubmodule.o %t/c-module.o -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s -check-prefix=CHECK-OUTPUT
// REQUIRES: executable_test
// REQUIRES: swift_in_compiler
// Second test: check if CMO really imports the SIL of functions in other modules.
// RUN: %target-build-swift -O -wmo -module-name=Main -I%t %s -Xllvm -sil-disable-pass=FunctionSignatureOpts -emit-sil -o %t/out.sil
// RUN: %FileCheck %s -check-prefix=CHECK-SIL < %t/out.sil
// RUN: %FileCheck %s -check-prefix=CHECK-SIL2 < %t/out.sil
import Test
// CHECK-SIL: sil_global public_external [serialized] @_swiftEmptySetSingleton : $_SwiftEmptySetSingleton
func testNestedTypes() {
let c = Container()
// CHECK-OUTPUT: [Test.Container.Base]
// CHECK-OUTPUT: 27
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test9ContainerV9testclassyxxlFSi_Tg5
print(c.testclass(27))
// CHECK-OUTPUT: [Test.Container.Base]
// CHECK-OUTPUT: 27
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test9ContainerV13testclass_genyxxlF
print(c.testclass_gen(27))
// CHECK-OUTPUT: [Test.PE<Swift.Int>.B(27)]
// CHECK-OUTPUT: 27
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test9ContainerV8testenumyxxlFSi_Tg5
print(c.testenum(27))
// CHECK-OUTPUT: [Test.PE<Swift.Int>.B(27)]
// CHECK-OUTPUT: 27
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test9ContainerV12testenum_genyxxlF
print(c.testenum_gen(27))
}
func testClass() {
// CHECK-OUTPUT: 28
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test11createClassySixlFSi_Tg5
// CHECK-SIL-DAG: sil shared [noinline] @${{.*Test.*getClass}}
print(createClass(0))
// CHECK-OUTPUT: 28
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test15createClass_genySixlF
print(createClass_gen(0))
}
// CHECK-SIL2-LABEL: sil hidden [noinline] @$s4Main9testErroryyF
@inline(never)
func testError() {
// CHECK-OUTPUT: PrivateError()
// CHECK-SIL2: struct $PrivateError ()
// CHECK-SIL2: alloc_existential_box $any Error, $PrivateError
print(returnPrivateError(27))
// CHECK-OUTPUT: InternalError()
// CHECK-SIL2: struct $InternalError ()
// CHECK-SIL2: alloc_existential_box $any Error, $InternalError
print(returnInternalError(27))
// CHECK-SIL2: } // end sil function '$s4Main9testErroryyF'
}
class DerivedFromOpen<T> : OpenClass<T> { }
func testProtocolsAndClasses() {
// CHECK-OUTPUT: false
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test20checkIfClassConformsyyxlFSi_Tg5
checkIfClassConforms(27)
// CHECK-OUTPUT: false
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test24checkIfClassConforms_genyyxlF
checkIfClassConforms_gen(27)
// CHECK-OUTPUT: 123
// CHECK-OUTPUT: 1234
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test7callFooyyxlFSi_Tg5
// CHECK-SIL-DAG: sil [{{.*}}] @$s4Test19printFooExistential33_{{.*}} : $@convention(thin)
callFoo(27)
// CHECK-OUTPUT: 123
// CHECK-OUTPUT: 1234
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test11callFoo_genyyxlF
callFoo_gen(27)
// CHECK-OUTPUT: 55
callClassMethod(55)
// CHECK-OUTPUT: 321
callFooViaConformance(0)
}
func testSubModule() {
// CHECK-OUTPUT: 10
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test24callGenericSubmoduleFuncyyxlFSi_Tg5
// CHECK-SIL-DAG: sil shared [noinline] @$s9Submodule07genericA4FuncyyxlF
callGenericSubmoduleFunc(10)
// CHECK-OUTPUT: 101
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test28callGenericSubmoduleFunc_genyyxlF
callGenericSubmoduleFunc_gen(101)
}
func testClosures() {
// CHECK-OUTPUT: 23
// CHECK-SIL-DAG: sil shared [noinline] @$s4Test14genericClosureyxxlFSi_Tg5
print(genericClosure(23))
// CHECK-OUTPUT: 24
// CHECK-SIL-DAG: sil public_external {{.*}} @$s4Test18genericClosure_genyxxlF
print(genericClosure_gen(24))
}
func testKeypath() {
// CHECK-OUTPUT: 27
print(useStructKeypath(0))
// CHECK-OUTPUT: 29
print(useClassKeypath(0))
}
func testMisc() {
// CHECK-OUTPUT: 43
// CHECK-OUTPUT: 42
// CHECK-SIL-DAG: sil shared {{.*}} @$s4Test13callUnrelatedyxxlFSi_Tg5
print(callUnrelated(42))
// CHECK-OUTPUT: 27
print(classWithPublicProperty(33))
// CHECK-OUTPUT: []
print(getEmptySet())
}
// CHECK-SIL2-LABEL: sil hidden [noinline] @$s4Main10testGlobalyyF
@inline(never)
func testGlobal() {
// CHECK-OUTPUT: 529387
// CHECK-SIL2: integer_literal $Builtin.Int{{[0-9]+}}, 529387
print(globalLet)
// CHECK-OUTPUT: 41
print(StructWithClosure.c(41))
// CHECK-SIL2: } // end sil function '$s4Main10testGlobalyyF'
}
// CHECK-SIL2-LABEL: sil hidden [noinline] @$s4Main22testImplementationOnlyyyF
@inline(never)
func testImplementationOnly() {
// CHECK-OUTPUT: 27
// CHECK-SIL2: function_ref @$s4Test26callImplementationOnlyTypeyxxlF
print(callImplementationOnlyType(27))
// CHECK-OUTPUT: 40
// CHECK-SIL2: function_ref @$s4Test26callImplementationOnlyFuncySixlF
print(callImplementationOnlyFunc(0))
// CHECK-OUTPUT: 123
// CHECK-SIL2: function_ref @$s4Test23callCImplementationOnlyySixlF
print(callCImplementationOnly(0))
// CHECK-SIL2: } // end sil function '$s4Main22testImplementationOnlyyyF'
}
@inline(never)
func testPrivateVar() {
// CHECK-OUTPUT: {{[0-9]+}}
print(getRandom())
}
testNestedTypes()
testClass()
testError()
testProtocolsAndClasses()
testSubModule()
testClosures()
testKeypath()
testMisc()
testGlobal()
testImplementationOnly()
testPrivateVar()
|