Skip to content

Commit 54423c7

Browse files
committed
SILGen: Don't emit generator functions for caller-side default parameters
Some default parameter expressions like #file, #line, #function etc are emitted into the caller directly by SILGen, instead of being emitted as a call to a generator function. In these cases, we don't need to emit the generator function at all.
1 parent 3283efb commit 54423c7

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

lib/SILGen/SILGen.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,29 @@ void SILGenModule::emitDestructor(ClassDecl *cd, DestructorDecl *dd) {
916916
}
917917
}
918918

919-
void SILGenModule::emitDefaultArgGenerator(SILDeclRef constant, Expr *arg) {
919+
void SILGenModule::emitDefaultArgGenerator(SILDeclRef constant, Expr *arg,
920+
DefaultArgumentKind kind) {
921+
switch (kind) {
922+
case DefaultArgumentKind::None:
923+
llvm_unreachable("No default argument here?");
924+
925+
case DefaultArgumentKind::Normal:
926+
break;
927+
928+
case DefaultArgumentKind::Inherited:
929+
return;
930+
931+
case DefaultArgumentKind::Column:
932+
case DefaultArgumentKind::File:
933+
case DefaultArgumentKind::Line:
934+
case DefaultArgumentKind::Function:
935+
case DefaultArgumentKind::DSOHandle:
936+
case DefaultArgumentKind::Nil:
937+
case DefaultArgumentKind::EmptyArray:
938+
case DefaultArgumentKind::EmptyDictionary:
939+
return;
940+
}
941+
920942
emitOrDelayFunction(*this, constant, [this,constant,arg](SILFunction *f) {
921943
preEmitFunction(constant, arg, f, arg);
922944
PrettyStackTraceSILFunction X("silgen emitDefaultArgGenerator ", f);
@@ -1004,7 +1026,7 @@ void SILGenModule::emitDefaultArgGenerators(SILDeclRef::Loc decl,
10041026
for (auto param : *paramList) {
10051027
if (auto defaultArg = param->getDefaultValue())
10061028
emitDefaultArgGenerator(SILDeclRef::getDefaultArgGenerator(decl, index),
1007-
defaultArg);
1029+
defaultArg, param->getDefaultArgumentKind());
10081030
++index;
10091031
}
10101032
}

lib/SILGen/SILGen.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ class LLVM_LIBRARY_VISIBILITY SILGenModule : public ASTVisitor<SILGenModule> {
264264
void emitEnumConstructor(EnumElementDecl *decl);
265265

266266
/// Emits the default argument generator with the given expression.
267-
void emitDefaultArgGenerator(SILDeclRef constant, Expr *arg);
267+
void emitDefaultArgGenerator(SILDeclRef constant, Expr *arg,
268+
DefaultArgumentKind kind);
268269

269270
/// Emits the stored property initializer for the given pattern.
270271
void emitStoredPropertyInitialization(PatternBindingDecl *pd, unsigned i);

test/SILGen/default_arguments.swift

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

34
// __FUNCTION__ used as top-level parameter produces the module name.
45
// CHECK-LABEL: sil @main
@@ -74,17 +75,13 @@ func testMagicLiterals(file: String = #file,
7475
// Check that default argument generator functions don't leak information about
7576
// user's source.
7677
//
77-
// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA_
78-
// CHECK: string_literal utf16 ""
78+
// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA_
7979
//
80-
// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA0_
81-
// CHECK: string_literal utf16 ""
80+
// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA0_
8281
//
83-
// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA1_
84-
// CHECK: integer_literal $Builtin.Int2048, 0
82+
// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA1_
8583
//
86-
// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA2_
87-
// CHECK: integer_literal $Builtin.Int2048, 0
84+
// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA2_
8885

8986
func closure(_: () -> ()) {}
9087
func autoclosure(_: @autoclosure () -> ()) {}

test/SILGen/dso_handle.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,9 @@
88
// CHECK-NEXT: [[DSOPtr:%[0-9]+]] = address_to_pointer [[DSOAddr]] : $*Builtin.RawPointer to $Builtin.RawPointer
99
// CHECK-NEXT: [[DSOPtrStruct:[0-9]+]] = struct $UnsafeRawPointer ([[DSOPtr]] : $Builtin.RawPointer)
1010

11-
12-
// CHECK-LABEL: sil hidden @_T010dso_handle14printDSOHandleS2V0A0_tFfA_
13-
// CHECK: [[DSOAddr:%[0-9]+]] = global_addr [[DSO]] : $*Builtin.RawPointer
14-
// CHECK-NEXT: [[DSOPtr:%[0-9]+]] = address_to_pointer [[DSOAddr]] : $*Builtin.RawPointer to $Builtin.RawPointer
15-
// CHECK-NEXT: [[DSOPtrStruct:%[0-9]+]] = struct $UnsafeRawPointer ([[DSOPtr]] : $Builtin.RawPointer)
16-
// CHECK-NEXT: return [[DSOPtrStruct]] : $UnsafeRawPointer
1711
func printDSOHandle(dso: UnsafeRawPointer = #dsohandle) -> UnsafeRawPointer {
1812
print(dso)
1913
return dso
2014
}
2115

2216
_ = printDSOHandle()
23-

0 commit comments

Comments
 (0)