Skip to content

Commit c1c05e1

Browse files
Merge pull request #85948 from aschwaighofer/embedded_enable_existential_support
[embedded] Enable support for existentials/boxed protocol types per default
2 parents 088bda7 + d019f37 commit c1c05e1

13 files changed

+137
-10
lines changed

include/swift/Basic/Features.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ EXPERIMENTAL_FEATURE(StandaloneSwiftAvailability, true)
557557
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(TildeSendable, false)
558558

559559
/// Allow use of protocol typed values in Embedded mode (`Any` and friends)
560-
EXPERIMENTAL_FEATURE(EmbeddedExistentials, false)
560+
EXPERIMENTAL_FEATURE(EmbeddedExistentials, true)
561561

562562
/// Allow use of the 'anyAppleOS' availability domain.
563563
EXPERIMENTAL_FEATURE(AnyAppleOSAvailability, true)

include/swift/Option/FrontendOptions.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,6 +1597,10 @@ def gen_reproducer_dir
15971597
: Separate<["-"], "gen-reproducer-dir">,
15981598
HelpText<"Path to directory where reproducers write to.">;
15991599

1600+
def disable_embedded_existentials
1601+
: Flag<["-"], "disable-embedded-existentials">,
1602+
HelpText<"Disable embedded existential support.">;
1603+
16001604
} // end let Flags = [FrontendOption, NoDriverOption, HelpHidden]
16011605

16021606
def disable_experimental_parser_round_trip : Flag<["-"],

lib/Frontend/CompilerInvocation.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,11 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
18181818
}
18191819
Opts.BypassResilienceChecks |= Args.hasArg(OPT_bypass_resilience);
18201820

1821+
// Enable support for existentials in embedded per default.
1822+
if (Opts.hasFeature(Feature::Embedded) &&
1823+
!Args.hasArg(OPT_disable_embedded_existentials))
1824+
Opts.enableFeature(Feature::EmbeddedExistentials);
1825+
18211826
if (Opts.hasFeature(Feature::EmbeddedExistentials) &&
18221827
!Opts.hasFeature(Feature::Embedded)) {
18231828
Diags.diagnose(SourceLoc(), diag::embedded_existentials_without_embedded);

test/embedded/basic-errors-no-stdlib.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
// RUN: %target-swift-frontend -emit-ir -verify %s -parse-stdlib -enable-experimental-feature Embedded -wmo
1+
// RUN: %target-swift-frontend -emit-ir -verify %s -parse-stdlib -enable-experimental-feature Embedded -wmo -disable-embedded-existentials
22

33
// REQUIRES: swift_in_compiler
44
// REQUIRES: swift_feature_Embedded
55

6+
// This is only an error if we disable support for existentials in embedded.
7+
68
public protocol Player {}
79
struct Concrete: Player {}
810

test/embedded/classes-generic-no-stdlib.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// RUN: %target-swift-emit-sil %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s --check-prefix CHECK-SIL
2-
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s --check-prefix CHECK-IR
2+
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo -disable-embedded-existentials | %FileCheck %s --check-prefix CHECK-IR
3+
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s --check-prefix CHECK-IR-EXIST
34

45
// UNSUPPORTED: CPU=wasm32
56
// REQUIRES: swift_in_compiler
@@ -69,3 +70,11 @@ public func bar(t: T2) -> MyClass<T2> {
6970
// CHECK-IR-DAG: define {{.*}}void @"$e4main7MyClassCfDAA2T2V_Tg5"(ptr swiftself %0)
7071
// CHECK-IR-DAG: define {{.*}}ptr @"$e4main3foo1tAA7MyClassCyAA2T1VGAG_tF"()
7172
// CHECK-IR-DAG: define {{.*}}ptr @"$e4main3bar1tAA7MyClassCyAA2T2VGAG_tF"(i1 %0)
73+
74+
75+
76+
// CHECK-IR-EXIST-DAG: @"$e4main7MyClassCyAA2T1VGMf" = {{.*}} <{ ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }> <{ ptr @"$eBoWV", ptr null, ptr @"$e4main7MyClassCfDAA2T1V_Tg5", ptr null, ptr @"$e4main7MyClassC1txvgAA2T1V_Tg5", ptr @"$e4main7MyClassC1txvsAA2T1V_Tg5", ptr @"$e4main7MyClassC1txvMAA2T1V_Tg5", ptr @"$e4main7MyClassC1tACyxGx_tcfCAA2T1V_Tg5" }>
77+
// CHECK-IR-EXIST-DAG: @"$e4main7MyClassCyAA2T2VGMf" = {{.*}} <{ ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }> <{ ptr @"$eBoWV", ptr null, ptr @"$e4main7MyClassCfDAA2T2V_Tg5", ptr null, ptr @"$e4main7MyClassC1txvgAA2T2V_Tg5", ptr @"$e4main7MyClassC1txvsAA2T2V_Tg5", ptr @"$e4main7MyClassC1txvMAA2T2V_Tg5", ptr @"$e4main7MyClassC1tACyxGx_tcfCAA2T2V_Tg5" }>
78+
79+
// CHECK-IR-EXIST-DAG: @"$e4main7MyClassCyAA2T1VGN" = {{.*}} alias {{.*}} ptr @"$e4main7MyClassCyAA2T1VGMf", i32 0, i32 1)
80+
// CHECK-IR-EXIST-DAG: @"$e4main7MyClassCyAA2T2VGN" = {{.*}} alias {{.*}} ptr @"$e4main7MyClassCyAA2T2VGMf", i32 0, i32 1)

test/embedded/classes-methods-no-stdlib.swift

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s
1+
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo -disable-embedded-existentials | %FileCheck %s
2+
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s --check-prefix=EXIST
23

34
// REQUIRES: swift_in_compiler
45
// REQUIRES: swift_feature_Embedded
@@ -37,3 +38,38 @@ public func test(x: MyClass) {
3738
// CHECK: call swiftcc void @"$e4main7MyClassC3baryyF"
3839

3940
}
41+
42+
43+
// EXIST: @"$e4main10MySubClassCMf" = {{.*}} <{ ptr @"$eBoWV", ptr getelementptr inbounds (<{ ptr, ptr, ptr, ptr, ptr, ptr, ptr }>, ptr @"$e4main7MyClassCMf", i32 0, i32 1), ptr @"$e4main10MySubClassCfD", ptr null, ptr @"$e4main10MySubClassC3fooyyF", ptr @"$e4main7MyClassC3baryyF", ptr @"$e4main10MySubClassCACycfC" }>
44+
// EXIST: @"$e4main7MyClassCMf" = {{.*}} <{ ptr @"$eBoWV", ptr null, ptr @"$e4main7MyClassCfD", ptr null, ptr @"$e4main7MyClassC3fooyyF", ptr @"$e4main7MyClassC3baryyF", ptr @swift_deletedMethodError }>
45+
46+
// EXIST: @"$e4main10MySubClassCN" = {{.*}}alias{{.*}} ptr @"$e4main10MySubClassCMf", i32 0, i32 1)
47+
// EXIST: @"$e4main7MyClassCN" = {{.*}}alias{{.*}} ptr @"$e4main7MyClassCMf", i32 0, i32 1)
48+
49+
50+
// EXIST: define {{.*}}void @"$e4main4test1xyAA7MyClassC_tF"(ptr %0)
51+
52+
// public func test(x: MyClass) {
53+
54+
// x.foo() // goes through the vtable
55+
56+
// EXIST: %1 = load ptr, ptr %0
57+
// EXIST: %2 = getelementptr inbounds ptr, ptr %1, i64 3
58+
// EXIST: %3 = load ptr, ptr %2
59+
// EXIST: call swiftcc void %3(ptr swiftself %0)
60+
61+
// x.bar() // does not go through the vtable
62+
63+
// EXIST: call swiftcc void @"$e4main7MyClassC3baryyF"
64+
65+
// let y = MySubClass()
66+
67+
// EXIST: call swiftcc ptr @"$e4main10MySubClassCACycfC"
68+
69+
// y.foo() // does not go through the vtable
70+
71+
// EXIST: call swiftcc void @"$e4main10MySubClassC3fooyyF"
72+
73+
// y.bar() // does not go through the vtable
74+
75+
// EXIST: call swiftcc void @"$e4main7MyClassC3baryyF"

test/embedded/classes-no-stdlib.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s
1+
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo -disable-embedded-existentials | %FileCheck %s
2+
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s --check-prefix=EXIST
3+
24

35
// REQUIRES: swift_in_compiler
46
// REQUIRES: swift_feature_Embedded
@@ -28,3 +30,27 @@ public func bar() -> MyClass {
2830
return MySubClass()
2931
}
3032
// CHECK-DAG: define {{.*}}ptr @"$e4main3barAA7MyClassCyF"
33+
34+
35+
// EXIST-DAG: @"$e4main10MySubClassCMf" = {{.*}} <{ ptr @"$eBoWV", ptr getelementptr inbounds (<{ ptr, ptr, ptr, ptr, ptr }>, ptr @"$e4main7MyClassCMf", i32 0, i32 1), ptr @"$e4main10MySubClassCfD", ptr null, ptr @"$e4main10MySubClassCACycfC" }>
36+
// EXIST-DAG: @"$e4main7MyClassCMf" = {{.*}} <{ ptr @"$eBoWV", ptr null, ptr @"$e4main7MyClassCfD", ptr null, ptr @"$e4main7MyClassCACycfC" }>
37+
38+
// EXIST-DAG: @"$e4main10MySubClassCN" = {{.*}} ptr @"$e4main10MySubClassCMf", i32 0, i32 1)
39+
// EXIST-DAG: @"$e4main7MyClassCN" = {{.*}} ptr @"$e4main7MyClassCMf", i32 0, i32 1)
40+
41+
// EXIST-DAG: define {{.*}}ptr @"$e4main3barAA7MyClassCyF"
42+
43+
44+
// EXIST-DAG: define {{.*}}ptr @"$e4main7MyClassCfd"
45+
// EXIST-DAG: define {{.*}}void @"$e4main7MyClassCfD"
46+
// EXIST-DAG: define {{.*}}ptr @"$e4main7MyClassCACycfC"
47+
// EXIST-DAG: define {{.*}}ptr @"$e4main7MyClassCACycfc"
48+
49+
50+
// EXIST-DAG: define {{.*}}ptr @"$e4main3fooAA7MyClassCyF"
51+
52+
53+
// EXIST-DAG: define {{.*}}ptr @"$e4main10MySubClassCACycfC"
54+
// EXIST-DAG: define {{.*}}ptr @"$e4main10MySubClassCACycfc"
55+
// EXIST-DAG: define {{.*}}ptr @"$e4main10MySubClassCfd"
56+
// EXIST-DAG: define {{.*}}void @"$e4main10MySubClassCfD"

test/embedded/concurrency-deleted-method.swift

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-frontend -enable-experimental-feature Embedded -parse-as-library -module-name main %s -emit-ir | %FileCheck --check-prefix=CHECK-IR %s
2+
// RUN: %target-swift-frontend -disable-embedded-existentials -enable-experimental-feature Embedded -parse-as-library -module-name main %s -emit-ir | %FileCheck --check-prefix=CHECK-IR %s
3+
// RUN: %target-swift-frontend -disable-embedded-existentials -enable-experimental-feature Embedded -parse-as-library -module-name main %s -c -o %t/a.o
4+
// RUN: %target-clang %t/a.o -o %t/a.out -L%swift_obj_root/lib/swift/embedded/%module-target-triple %target-clang-resource-dir-opt -lswift_Concurrency %target-swift-default-executor-opt -dead_strip
5+
// RUN: %target-run %t/a.out | %FileCheck %s
6+
7+
// RUN: %empty-directory(%t)
8+
// RUN: %target-swift-frontend -enable-experimental-feature Embedded -parse-as-library -module-name main %s -emit-ir | %FileCheck --check-prefix=EXIST-IR %s
39
// RUN: %target-swift-frontend -enable-experimental-feature Embedded -parse-as-library -module-name main %s -c -o %t/a.o
410
// RUN: %target-clang %t/a.o -o %t/a.out -L%swift_obj_root/lib/swift/embedded/%module-target-triple %target-clang-resource-dir-opt -lswift_Concurrency %target-swift-default-executor-opt -dead_strip
511
// RUN: %target-run %t/a.out | %FileCheck %s
612

13+
714
// REQUIRES: executable_test
815
// REQUIRES: swift_in_compiler
916
// REQUIRES: optimized_stdlib
@@ -48,3 +55,21 @@ actor MyActor {
4855
// CHECK-IR: define weak_odr {{swifttailcc|swiftcc}} void @swift_deletedAsyncMethodError(ptr swiftasync %0)
4956

5057
// CHECK: value: 42
58+
59+
// EXIST-IR: @swift_deletedAsyncMethodErrorTu =
60+
// EXIST-IR: @"$e4main7MyActorCMf" = {{.*}} <{ ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }> <{
61+
// EXIST-IR-SAME: ptr @"$eBoWV",
62+
// EXIST-IR-SAME: ptr null,
63+
// EXIST-IR-SAME: ptr @"$e4main7MyActorCfD",
64+
// EXIST-IR-SAME: ptr null,
65+
// EXIST-IR-SAME: ptr @swift_deletedMethodError,
66+
// EXIST-IR-SAME: ptr @swift_deletedMethodError,
67+
// EXIST-IR-SAME: ptr @swift_deletedMethodError,
68+
// EXIST-IR-SAME: ptr @"$e4main7MyActorC3fooyyYaFTu",
69+
// EXIST-IR-SAME: ptr @got.swift_deletedAsyncMethodErrorTu,
70+
// EXIST-IR-SAME: ptr @"$e4main7MyActorCACycfC" }>
71+
72+
// EXIST-IR-DAG: @"$e4main7MyActorCN" = {{.*}}alias{{.*}} ptr @"$e4main7MyActorCMf", i32 0, i32 1)
73+
74+
75+
// EXIST-IR-NOT: $e4main7MyActorC12thisIsUnusedyyYaF

test/embedded/existential-class-bound5.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-emit-ir -parse-as-library -module-name main -verify %s -enable-experimental-feature Embedded -wmo
1+
// RUN: %target-swift-emit-ir -parse-as-library -module-name main -verify %s -enable-experimental-feature Embedded -wmo -disable-embedded-existentials
22

33
// REQUIRES: swift_in_compiler
44
// REQUIRES: optimized_stdlib

test/embedded/existential-composition.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-emit-ir -parse-as-library -module-name main -verify %s -enable-experimental-feature Embedded -wmo
1+
// RUN: %target-swift-emit-ir -parse-as-library -module-name main -verify %s -enable-experimental-feature Embedded -wmo -disable-embedded-existentials
22

33
// REQUIRES: swift_feature_Embedded
44

0 commit comments

Comments
 (0)