Skip to content

Commit b571dd8

Browse files
authored
Merge pull request #12482 from xedin/improve-variadic-mangling
[Mangling] Improve handling of the variadic function parameters
2 parents 17fb338 + 8f26fb8 commit b571dd8

17 files changed

+252
-126
lines changed

lib/AST/ASTMangler.cpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,20 +1480,6 @@ void ASTMangler::appendFunctionSignature(AnyFunctionType *fn) {
14801480

14811481
void ASTMangler::appendFunctionInputType(
14821482
ArrayRef<AnyFunctionType::Param> params) {
1483-
auto getParamType = [](const AnyFunctionType::Param &param) -> Type {
1484-
auto type = param.getType();
1485-
1486-
// FIXME: Change mangling for variadic parameters so
1487-
// the enclosing array type is not required.
1488-
if (param.isVariadic()) {
1489-
auto *arrayDecl = type->getASTContext().getArrayDecl();
1490-
assert(arrayDecl);
1491-
return BoundGenericType::get(arrayDecl, Type(), {type});
1492-
}
1493-
1494-
return type;
1495-
};
1496-
14971483
switch (params.size()) {
14981484
case 0:
14991485
appendOperator("y");
@@ -1520,7 +1506,7 @@ void ASTMangler::appendFunctionInputType(
15201506
default:
15211507
bool isFirstParam = true;
15221508
for (auto &param : params) {
1523-
appendTypeListElement(param.getLabel(), getParamType(param),
1509+
appendTypeListElement(param.getLabel(), param.getType(),
15241510
param.getParameterFlags());
15251511
appendListSeparator(isFirstParam);
15261512
}

lib/Demangling/NodePrinter.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -970,9 +970,6 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
970970
print(id);
971971
}
972972
if (isVariadic) {
973-
SugarType Sugar = findSugar(type);
974-
if (Sugar == SugarType::Array)
975-
type = type->getFirstChild()->getChild(1)->getFirstChild();
976973
print(type);
977974
Printer << "...";
978975
} else {

stdlib/public/Reflection/TypeRef.cpp

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,48 @@ class PrintTypeRef : public TypeRefVisitor<PrintTypeRef, void> {
125125
break;
126126
}
127127

128-
for (const auto &Param : F->getParameters())
129-
printRec(Param.getType());
130-
printRec(F->getResult());
128+
OS << '\n';
129+
Indent += 2;
130+
printHeader("parameters");
131+
132+
auto &parameters = F->getParameters();
133+
for (const auto &param : parameters) {
134+
auto flags = param.getFlags();
135+
136+
if (!flags.isNone()) {
137+
Indent += 2;
138+
OS << '\n';
139+
}
140+
141+
if (flags.isInOut())
142+
printHeader("inout");
143+
144+
if (flags.isVariadic())
145+
printHeader("variadic");
146+
147+
if (flags.isShared())
148+
printHeader("shared");
131149

150+
if (flags.isEscaping())
151+
printHeader("escaping");
152+
153+
printRec(param.getType());
154+
155+
if (!flags.isNone()) {
156+
Indent -= 2;
157+
OS << ')';
158+
}
159+
}
160+
161+
if (parameters.empty())
162+
OS << ')';
163+
164+
OS << '\n';
165+
printHeader("result");
166+
printRec(F->getResult());
132167
OS << ')';
168+
169+
Indent -= 2;
133170
}
134171

135172
void visitProtocolTypeRef(const ProtocolTypeRef *P) {

test/Demangle/Inputs/manglings.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,11 @@ _T04main5innerys5Int32Vz_yADctF25closure_with_box_argumentxz_Bi32__lXXTf1nc_n --
250250
_T03foo6testityyyc_yyctF1a1bTf3pfpf_n ---> function signature specialization <Arg[0] = [Constant Propagated Function : a], Arg[1] = [Constant Propagated Function : b]> of foo.testit(() -> (), () -> ()) -> ()
251251
_SocketJoinOrLeaveMulticast ---> _SocketJoinOrLeaveMulticast
252252
_T0s10DictionaryV3t17E6Index2V1loiSbAEyxq__G_AGtFZ ---> static (extension in t17):Swift.Dictionary.Index2.< infix((extension in t17):[A : B].Index2, (extension in t17):[A : B].Index2) -> Swift.Bool
253-
_T08mangling14varargsVsArrayySaySiG3arrd_SS1ntF ---> mangling.varargsVsArray(arr: Swift.Int..., n: Swift.String) -> ()
254-
_T08mangling14varargsVsArrayySaySiG3arrd_tF ---> mangling.varargsVsArray(arr: Swift.Int...) -> ()
253+
_T08mangling14varargsVsArrayySi3arrd_SS1ntF ---> mangling.varargsVsArray(arr: Swift.Int..., n: Swift.String) -> ()
254+
_T08mangling14varargsVsArrayySaySiG3arr_SS1ntF ---> mangling.varargsVsArray(arr: [Swift.Int], n: Swift.String) -> ()
255+
_T08mangling14varargsVsArrayySaySiG3arrd_SS1ntF ---> mangling.varargsVsArray(arr: [Swift.Int]..., n: Swift.String) -> ()
256+
_T08mangling14varargsVsArrayySi3arrd_tF ---> mangling.varargsVsArray(arr: Swift.Int...) -> ()
257+
_T08mangling14varargsVsArrayySaySiG3arrd_tF ---> mangling.varargsVsArray(arr: [Swift.Int]...) -> ()
255258
_T0s13_UnicodeViewsVss22RandomAccessCollectionRzs0A8EncodingR_11SubSequence_5IndexQZAFRtzsAcERpzAE_AEQZAIRSs15UnsignedInteger8Iterator_7ElementRPzAE_AlMQZANRS13EncodedScalar_AlMQY_AORSr0_lE13CharacterViewVyxq__G ---> (extension in Swift):Swift._UnicodeViews<A, B><A, B where A: Swift.RandomAccessCollection, B: Swift.UnicodeEncoding, A.Index == A.SubSequence.Index, A.SubSequence: Swift.RandomAccessCollection, A.SubSequence == A.SubSequence.SubSequence, A.Iterator.Element: Swift.UnsignedInteger, A.Iterator.Element == A.SubSequence.Iterator.Element, A.SubSequence.Iterator.Element == B.EncodedScalar.Iterator.Element>.CharacterView
256259
_T010Foundation11MeasurementV12SimulatorKitSo9UnitAngleCRszlE11OrientationO2eeoiSbAcDEAGOyAF_G_AKtFZ ---> static (extension in SimulatorKit):Foundation.Measurement<A where A == __ObjC.UnitAngle>.Orientation.== infix((extension in SimulatorKit):Foundation.Measurement<__ObjC.UnitAngle>.Orientation, (extension in SimulatorKit):Foundation.Measurement<__ObjC.UnitAngle>.Orientation) -> Swift.Bool
257260
_T04main1_yyF ---> main._() -> ()

test/IRGen/big_types_corner_cases.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public func enumCallee(_ x: LargeEnum) {
144144
// CHECK-64: alloca %T22big_types_corner_cases9LargeEnumO
145145
// CHECK-64: call void @llvm.memcpy.p0i8.p0i8.i64
146146
// CHECK-64: call void @llvm.memcpy.p0i8.p0i8.i64
147-
// CHECK-64: _T0s5printySayypGd_SS9separatorSS10terminatortF
147+
// CHECK-64: _T0s5printyypd_SS9separatorSS10terminatortF
148148
// CHECK-64: ret void
149149

150150
// CHECK-LABEL: define{{( protected)?}} internal swiftcc void @_T022big_types_corner_cases8SuperSubC1fyyFAA9BigStructVycfU_(%T22big_types_corner_cases9BigStructV* noalias nocapture sret, %T22big_types_corner_cases8SuperSubC*) #0 {

test/Reflection/Inputs/ConcreteTypes.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public class C {
1414
public let aMetatype: C.Type
1515
public let aFunction: (C, S, E, Int) -> (Int)
1616
public let aFunctionWithVarArgs: (C, S...) -> ()
17+
public let aFunctionWithInout1: (inout C) -> Void = { _ in }
18+
public let aFunctionWithInout2: (C, inout Int) -> Void = { _,_ in }
19+
public let aFunctionWithInout3: (inout C, inout Int) -> Void = { _,_ in }
1720
public init(aClass: C, aStruct: S, anEnum: E, aTuple: (C, S, E, Int), aTupleWithLabels: (a: C, s: S, e: E), aMetatype: C.Type, aFunction: @escaping (C, S, E, Int) -> Int, aFunctionWithVarArgs: @escaping (C, S...) -> ()) {
1821
self.aClass = aClass
1922
self.aStruct = aStruct

test/Reflection/capture_descriptors.sil

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,16 @@ bb0:
101101
// CHECK: - Capture types:
102102
// CHECK-NEXT: (bound_generic_enum Swift.Optional
103103
// CHECK-NEXT: (function
104-
// CHECK-NEXT: (tuple)))
104+
// CHECK-NEXT: (parameters)
105+
// CHECK-NEXT: (result
106+
// CHECK-NEXT: (tuple)))
105107
// CHECK-NEXT: - Metadata sources:
106108
// CHECK-NEXT: (bound_generic_enum Swift.Optional
107109
// CHECK-NEXT: (function
108-
// CHECK-NEXT: (generic_type_parameter depth=0 index=0)
109-
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)))
110+
// CHECK-NEXT: (parameters
111+
// CHECK-NEXT: (generic_type_parameter depth=0 index=0)
112+
// CHECK-NEXT: (result
113+
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)))
110114
// CHECK-NEXT: (closure_binding index=0)
111115
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)
112116
// CHECK-NEXT: (closure_binding index=1)
@@ -135,12 +139,16 @@ bb0:
135139
// CHECK-NEXT: (metatype was_abstract
136140
// CHECK-NEXT: (bound_generic_enum Swift.Optional
137141
// CHECK-NEXT: (function
138-
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)
139-
// CHECK-NEXT: (generic_type_parameter depth=0 index=2))))
142+
// CHECK-NEXT: (parameters
143+
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)
144+
// CHECK-NEXT: (result
145+
// CHECK-NEXT: (generic_type_parameter depth=0 index=2))))
140146
// CHECK-NEXT: - Metadata sources:
141147
// CHECK-NEXT: (function
142-
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)
143-
// CHECK-NEXT: (generic_type_parameter depth=0 index=2))
148+
// CHECK-NEXT: (parameters
149+
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)
150+
// CHECK-NEXT: (result
151+
// CHECK-NEXT: (generic_type_parameter depth=0 index=2))
144152
// CHECK-NEXT: (generic_argument index=0
145153
// CHECK-NEXT: (metadata_capture index=0))
146154

@@ -229,17 +237,29 @@ bb0(%thin: $@convention(thin) () -> (), %c: $@convention(c) () -> (), %block: $@
229237

230238
// CHECK: - Capture types:
231239
// CHECK-NEXT: (function convention=thin
232-
// CHECK-NEXT: (tuple))
240+
// CHECK-NEXT: (parameters)
241+
// CHECK-NEXT: (result
242+
// CHECK-NEXT: (tuple))
233243
// CHECK-NEXT: (function convention=c
234-
// CHECK-NEXT: (tuple))
244+
// CHECK-NEXT: (parameters)
245+
// CHECK-NEXT: (result
246+
// CHECK-NEXT: (tuple))
235247
// CHECK-NEXT: (function convention=block
236-
// CHECK-NEXT: (tuple))
248+
// CHECK-NEXT: (parameters)
249+
// CHECK-NEXT: (result
250+
// CHECK-NEXT: (tuple))
237251
// CHECK-NEXT: (function
238-
// CHECK-NEXT: (tuple))
252+
// CHECK-NEXT: (parameters)
253+
// CHECK-NEXT: (result
254+
// CHECK-NEXT: (tuple))
239255
// CHECK-NEXT: (function convention=thin
240-
// CHECK-NEXT: (tuple))
256+
// CHECK-NEXT: (parameters)
257+
// CHECK-NEXT: (result
258+
// CHECK-NEXT: (tuple))
241259
// CHECK-NEXT: (function convention=thin
242-
// CHECK-NEXT: (tuple))
260+
// CHECK-NEXT: (parameters)
261+
// CHECK-NEXT: (result
262+
// CHECK-NEXT: (tuple))
243263
// CHECK-NEXT: - Metadata sources:
244264

245265
// Capturing opened existentials

0 commit comments

Comments
 (0)