Skip to content

Commit d736501

Browse files
committed
SIL: Serialize default argument generators in Swift 4 mode
1 parent 92b7a33 commit d736501

File tree

4 files changed

+81
-2
lines changed

4 files changed

+81
-2
lines changed

lib/SIL/SILDeclRef.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include "swift/AST/AnyFunctionRef.h"
1616
#include "swift/AST/ASTContext.h"
1717
#include "swift/AST/ASTMangler.h"
18+
#include "swift/AST/Initializer.h"
19+
#include "swift/AST/ParameterList.h"
1820
#include "swift/ClangImporter/ClangImporter.h"
1921
#include "swift/ClangImporter/ClangModule.h"
2022
#include "swift/SIL/SILLinkage.h"
@@ -538,6 +540,19 @@ IsSerialized_t SILDeclRef::isSerialized() const {
538540
dc = closure->getLocalContext();
539541
else {
540542
auto *d = getDecl();
543+
544+
// Default argument generators are serialized if the function was
545+
// type-checked in Swift 4 mode.
546+
if (kind == SILDeclRef::Kind::DefaultArgGenerator) {
547+
auto *afd = cast<AbstractFunctionDecl>(d);
548+
switch (afd->getDefaultArgumentResilienceExpansion()) {
549+
case ResilienceExpansion::Minimal:
550+
return IsSerialized;
551+
case ResilienceExpansion::Maximal:
552+
return IsNotSerialized;
553+
}
554+
}
555+
541556
dc = getDecl()->getInnermostDeclContext();
542557

543558
// Enum element constructors are serialized if the enum is
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
public func otherDefaultArguments(x: Int = 0) {}

test/SILGen/default_arguments.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen %s | %FileCheck %s
2-
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen %s | %FileCheck %s --check-prefix=NEGATIVE
1+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen -swift-version 3 %s | %FileCheck %s
2+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen -swift-version 3 %s | %FileCheck %s --check-prefix=NEGATIVE
3+
4+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen -swift-version 4 %s | %FileCheck %s
5+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen -swift-version 4 %s | %FileCheck %s --check-prefix=NEGATIVE
36

47
// __FUNCTION__ used as top-level parameter produces the module name.
58
// CHECK-LABEL: sil @main
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -emit-module-path %t/default_arguments_other.swiftmodule -emit-module -swift-version 4 -primary-file %S/Inputs/default_arguments_other.swift
3+
4+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen -swift-version 3 -I %t %s | %FileCheck %s --check-prefix=SWIFT3 --check-prefix=CHECK
5+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-silgen -swift-version 4 -I %t %s | %FileCheck %s --check-prefix=SWIFT4 --check-prefix=CHECK
6+
7+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-sil -O -swift-version 3 -I %t %s | %FileCheck %s --check-prefix=OPT
8+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -enable-sil-ownership -emit-sil -O -swift-version 4 -I %t %s | %FileCheck %s --check-prefix=OPT
9+
10+
// Check that default arguments are serialized in Swift 4 mode.
11+
12+
import default_arguments_other
13+
14+
// CHECK-LABEL: sil @_T028default_arguments_serialized0A6StringSSyF : $@convention(thin) () -> @owned String
15+
public func defaultString() -> String { return "hi" }
16+
17+
// SWIFT3-LABEL: sil @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytFfA_ : $@convention(thin) () -> Int
18+
// SWIFT4-LABEL: sil [serialized] @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytFfA_ : $@convention(thin) () -> Int
19+
20+
// SWIFT3-LABEL: sil @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytFfA0_ : $@convention(thin) () -> @owned String
21+
// SWIFT4-LABEL: sil [serialized] @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytFfA0_ : $@convention(thin) () -> @owned String
22+
23+
public func hasDefaultArguments(x: Int = 0, y: String = defaultString()) {}
24+
25+
// CHECK-LABEL: sil @_T028default_arguments_serialized21callsDefaultArgumentsyyF : $@convention(thin) () -> ()
26+
// CHECK: function_ref @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytF : $@convention(thin) (Int, @owned String) -> ()
27+
// CHECK: function_ref @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytFfA_ : $@convention(thin) () -> Int
28+
// CHECK: function_ref @_T028default_arguments_serialized19hasDefaultArgumentsySi1x_SS1ytFfA0_ : $@convention(thin) () -> @owned String
29+
// CHECK: apply
30+
// CHECK: return
31+
public func callsDefaultArguments() {
32+
hasDefaultArguments()
33+
}
34+
35+
// When calling a default argument generator for a function in another module
36+
// that was built in Swift 4 mode, we should always treat it as serialized,
37+
// even if *this* module is built in Swift 3 mode.
38+
39+
// CHECK-LABEL: sil @_T028default_arguments_serialized26callsOtherDefaultArgumentsyyF : $@convention(thin) () -> ()
40+
// CHECK: function_ref @_T023default_arguments_other0C16DefaultArgumentsySi1x_tF : $@convention(thin) (Int) -> ()
41+
// CHECK: function_ref @_T023default_arguments_other0C16DefaultArgumentsySi1x_tFfA_ : $@convention(thin) () -> Int
42+
// CHECK: apply
43+
// CHECK: return
44+
45+
// Make sure the optimizer inlines the default argument generator from the
46+
// other module.
47+
48+
// OPT-LABEL: sil @_T028default_arguments_serialized26callsOtherDefaultArgumentsyyF : $@convention(thin) () -> ()
49+
// OPT: [[FN:%.*]] = function_ref @_T023default_arguments_other0C16DefaultArgumentsySi1x_tF : $@convention(thin) (Int) -> () // user: %3
50+
// OPT: [[INT_VAL:%.*]] = integer_literal [[INT_TYPE:\$Builtin.Int(32|64)]], 0
51+
// OPT: [[INT:%.*]] = struct $Int ([[INT_VAL]] : [[INT_TYPE]]
52+
// OPT: apply [[FN]]([[INT]]) : $@convention(thin) (Int) -> ()
53+
// OPT: return
54+
public func callsOtherDefaultArguments() {
55+
otherDefaultArguments()
56+
}
57+
58+
// CHECK-LABEL: sil @_T023default_arguments_other0C16DefaultArgumentsySi1x_tF : $@convention(thin) (Int) -> ()
59+
60+
// CHECK-LABEL: sil [serialized] @_T023default_arguments_other0C16DefaultArgumentsySi1x_tFfA_ : $@convention(thin) () -> Int

0 commit comments

Comments
 (0)