Skip to content

Commit 7952a19

Browse files
committed
[Mangling] Introduce known manglings for many more standard library types.
Since the mangling scheme and set of standard library types is effectively fixed now, introduce known mangling substitutions for a number of new standard library types, filling out the S[A-Za-z] space. Reduces standard library binary size by ~195k.
1 parent c0836b9 commit 7952a19

File tree

4 files changed

+80
-13
lines changed

4 files changed

+80
-13
lines changed

docs/ABI/Mangling.rst

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,22 +332,55 @@ Types
332332
any-generic-type ::= 'S' KNOWN-TYPE-KIND // known nominal type substitution
333333
any-generic-type ::= 'S' NATURAL KNOWN-TYPE-KIND // repeated known type substitutions of the same kind
334334

335+
KNOWN-TYPE-KIND ::= 'A' // Swift.AutoreleasingUnsafeMutablePointer
335336
KNOWN-TYPE-KIND ::= 'a' // Swift.Array
337+
KNOWN-TYPE-KIND ::= 'B' // Swift.BinaryFloatingPoint
336338
KNOWN-TYPE-KIND ::= 'b' // Swift.Bool
337339
KNOWN-TYPE-KIND ::= 'c' // Swift.UnicodeScalar
340+
KNOWN-TYPE-KIND ::= 'd' // Swift.Dictionary
338341
KNOWN-TYPE-KIND ::= 'd' // Swift.Float64
342+
KNOWN-TYPE-KIND ::= 'E' // Swift.Encodable
343+
KNOWN-TYPE-KIND ::= 'e' // Swift.Decodable
344+
KNOWN-TYPE-KIND ::= 'F' // Swift.FloatingPoint
339345
KNOWN-TYPE-KIND ::= 'f' // Swift.Float32
346+
KNOWN-TYPE-KIND ::= 'G' // Swift.RandomNumberGenerator
347+
KNOWN-TYPE-KIND ::= 'H' // Swift.Hashable
348+
KNOWN-TYPE-KIND ::= 'h' // Swift.Set
349+
KNOWN-TYPE-KIND ::= 'I' // Swift.DefaultIndices
340350
KNOWN-TYPE-KIND ::= 'i' // Swift.Int
341-
KNOWN-TYPE-KIND ::= 'V' // Swift.UnsafeRawPointer
342-
KNOWN-TYPE-KIND ::= 'v' // Swift.UnsafeMutableRawPointer
351+
KNOWN-TYPE-KIND ::= 'J' // Swift.Character
352+
KNOWN-TYPE-KIND ::= 'j' // Swift.Numeric
353+
KNOWN-TYPE-KIND ::= 'K' // Swift.BidirectionalCollection
354+
KNOWN-TYPE-KIND ::= 'k' // Swift.RandomAccessCollection
355+
KNOWN-TYPE-KIND ::= 'L' // Swift.Comparable
356+
KNOWN-TYPE-KIND ::= 'l' // Swift.Collection
357+
KNOWN-TYPE-KIND ::= 'M' // Swift.MutableCollection
358+
KNOWN-TYPE-KIND ::= 'm' // Swift.RangeReplaceableCollection
359+
KNOWN-TYPE-KIND ::= 'N' // Swift.ClosedRange
360+
KNOWN-TYPE-KIND ::= 'n' // Swift.Range
361+
KNOWN-TYPE-KIND ::= 'O' // Swift.ObjectIdentifier
343362
KNOWN-TYPE-KIND ::= 'P' // Swift.UnsafePointer
344363
KNOWN-TYPE-KIND ::= 'p' // Swift.UnsafeMutablePointer
345-
KNOWN-TYPE-KIND ::= 'Q' // Swift.ImplicitlyUnwrappedOptional
364+
KNOWN-TYPE-KIND ::= 'Q' // Swift.Equatable
346365
KNOWN-TYPE-KIND ::= 'q' // Swift.Optional
347366
KNOWN-TYPE-KIND ::= 'R' // Swift.UnsafeBufferPointer
348367
KNOWN-TYPE-KIND ::= 'r' // Swift.UnsafeMutableBufferPointer
349368
KNOWN-TYPE-KIND ::= 'S' // Swift.String
369+
KNOWN-TYPE-KIND ::= 's' // Swift.Substring
370+
KNOWN-TYPE-KIND ::= 'T' // Swift.Sequence
371+
KNOWN-TYPE-KIND ::= 't' // Swift.IteratorProtocol
372+
KNOWN-TYPE-KIND ::= 'U' // Swift.UnsignedInteger
350373
KNOWN-TYPE-KIND ::= 'u' // Swift.UInt
374+
KNOWN-TYPE-KIND ::= 'V' // Swift.UnsafeRawPointer
375+
KNOWN-TYPE-KIND ::= 'v' // Swift.UnsafeMutableRawPointer
376+
KNOWN-TYPE-KIND ::= 'W' // Swift.UnsafeRawBufferPointer
377+
KNOWN-TYPE-KIND ::= 'w' // Swift.UnsafeMutableRawBufferPointer
378+
KNOWN-TYPE-KIND ::= 'X' // Swift.RangeExpression
379+
KNOWN-TYPE-KIND ::= 'x' // Swift.Strideable
380+
KNOWN-TYPE-KIND ::= 'Y' // Swift.RawRepresentable
381+
KNOWN-TYPE-KIND ::= 'y' // Swift.StringProtocol
382+
KNOWN-TYPE-KIND ::= 'Z' // Swift.SignedInteger
383+
KNOWN-TYPE-KIND ::= 'z' // Swift.BinaryInteger
351384

352385
protocol ::= context decl-name
353386

include/swift/Demangling/StandardTypesMangling.def

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,56 @@
1313
/// STANDARD_TYPE(KIND, MANGLING, TYPENAME)
1414
/// The 1-character MANGLING for a known TYPENAME of KIND.
1515

16+
STANDARD_TYPE(Structure, A, AutoreleasingUnsafeMutablePointer)
1617
STANDARD_TYPE(Structure, a, Array)
1718
STANDARD_TYPE(Structure, b, Bool)
1819
STANDARD_TYPE(Structure, c, UnicodeScalar)
20+
STANDARD_TYPE(Structure, D, Dictionary)
1921
STANDARD_TYPE(Structure, d, Double)
2022
STANDARD_TYPE(Structure, f, Float)
23+
STANDARD_TYPE(Structure, h, Set)
24+
STANDARD_TYPE(Structure, I, DefaultIndices)
2125
STANDARD_TYPE(Structure, i, Int)
22-
STANDARD_TYPE(Structure, V, UnsafeRawPointer)
23-
STANDARD_TYPE(Structure, v, UnsafeMutableRawPointer)
26+
STANDARD_TYPE(Structure, J, Character)
27+
STANDARD_TYPE(Structure, N, ClosedRange)
28+
STANDARD_TYPE(Structure, n, Range)
29+
STANDARD_TYPE(Structure, O, ObjectIdentifier)
2430
STANDARD_TYPE(Structure, P, UnsafePointer)
2531
STANDARD_TYPE(Structure, p, UnsafeMutablePointer)
2632
STANDARD_TYPE(Structure, R, UnsafeBufferPointer)
2733
STANDARD_TYPE(Structure, r, UnsafeMutableBufferPointer)
2834
STANDARD_TYPE(Structure, S, String)
35+
STANDARD_TYPE(Structure, s, Substring)
2936
STANDARD_TYPE(Structure, u, UInt)
37+
STANDARD_TYPE(Structure, V, UnsafeRawPointer)
38+
STANDARD_TYPE(Structure, v, UnsafeMutableRawPointer)
39+
STANDARD_TYPE(Structure, W, UnsafeRawBufferPointer)
40+
STANDARD_TYPE(Structure, w, UnsafeMutableRawBufferPointer)
3041

3142
STANDARD_TYPE(Enum, q, Optional)
32-
STANDARD_TYPE(Enum, Q, ImplicitlyUnwrappedOptional)
43+
44+
STANDARD_TYPE(Protocol, B, BinaryFloatingPoint)
45+
STANDARD_TYPE(Protocol, E, Encodable)
46+
STANDARD_TYPE(Protocol, e, Decodable)
47+
STANDARD_TYPE(Protocol, F, FloatingPoint)
48+
STANDARD_TYPE(Protocol, G, RandomNumberGenerator)
49+
STANDARD_TYPE(Protocol, H, Hashable)
50+
STANDARD_TYPE(Protocol, j, Numeric)
51+
STANDARD_TYPE(Protocol, K, BidirectionalCollection)
52+
STANDARD_TYPE(Protocol, k, RandomAccessCollection)
53+
STANDARD_TYPE(Protocol, L, Comparable)
54+
STANDARD_TYPE(Protocol, l, Collection)
55+
STANDARD_TYPE(Protocol, M, MutableCollection)
56+
STANDARD_TYPE(Protocol, m, RangeReplaceableCollection)
57+
STANDARD_TYPE(Protocol, Q, Equatable)
58+
STANDARD_TYPE(Protocol, T, Sequence)
59+
STANDARD_TYPE(Protocol, t, IteratorProtocol)
60+
STANDARD_TYPE(Protocol, U, UnsignedInteger)
61+
STANDARD_TYPE(Protocol, X, RangeExpression)
62+
STANDARD_TYPE(Protocol, x, Strideable)
63+
STANDARD_TYPE(Protocol, Y, RawRepresentable)
64+
STANDARD_TYPE(Protocol, y, StringProtocol)
65+
STANDARD_TYPE(Protocol, Z, SignedInteger)
66+
STANDARD_TYPE(Protocol, z, BinaryInteger)
3367

3468
#undef STANDARD_TYPE

stdlib/public/runtime/Casting.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,10 +1974,10 @@ static bool tryDynamicCastBoxedSwiftValue(OpaqueValue *dest,
19741974
extern "C" const StructDescriptor NOMINAL_TYPE_DESCR_SYM(Sa);
19751975

19761976
/// Nominal type descriptor for Swift.Dictionary.
1977-
extern "C" const StructDescriptor STRUCT_TYPE_DESCR_SYM(s10Dictionary);
1977+
extern "C" const StructDescriptor NOMINAL_TYPE_DESCR_SYM(SD);
19781978

19791979
/// Nominal type descriptor for Swift.Set.
1980-
extern "C" const StructDescriptor STRUCT_TYPE_DESCR_SYM(s3Set);
1980+
extern "C" const StructDescriptor NOMINAL_TYPE_DESCR_SYM(Sh);
19811981

19821982
// internal func _arrayDownCastIndirect<SourceValue, TargetValue>(
19831983
// _ source: UnsafePointer<Array<SourceValue>>,
@@ -2091,7 +2091,7 @@ static bool _dynamicCastStructToStruct(OpaqueValue *destination,
20912091
}
20922092

20932093
// Dictionaries.
2094-
} else if (descriptor == &STRUCT_TYPE_DESCR_SYM(s10Dictionary)) {
2094+
} else if (descriptor == &NOMINAL_TYPE_DESCR_SYM(SD)) {
20952095
if (flags & DynamicCastFlags::Unconditional) {
20962096
_swift_dictionaryDownCastIndirect(source, destination,
20972097
sourceArgs[0], sourceArgs[1],
@@ -2107,7 +2107,7 @@ static bool _dynamicCastStructToStruct(OpaqueValue *destination,
21072107
}
21082108

21092109
// Sets.
2110-
} else if (descriptor == &STRUCT_TYPE_DESCR_SYM(s3Set)) {
2110+
} else if (descriptor == &NOMINAL_TYPE_DESCR_SYM(Sh)) {
21112111
if (flags & DynamicCastFlags::Unconditional) {
21122112
_swift_setDownCastIndirect(source, destination,
21132113
sourceArgs[0], targetArgs[0],

unittests/runtime/Stdlib.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ void *$Ss32_getErrorEmbeddedNSErrorIndirectyyXlSgSPyxGs0B0RzlF(void *) {
178178
// Hashable
179179

180180
SWIFT_RUNTIME_STDLIB_INTERNAL
181-
const long long $Ss8HashableMp[1] = {0};
181+
const long long $SkMp[1] = {0};
182182

183183
// Array
184184

@@ -188,12 +188,12 @@ const long long $SSaMn[1] = {0};
188188
// Dictionary
189189

190190
SWIFT_RUNTIME_STDLIB_INTERNAL
191-
const long long $Ss10DictionaryVMn[1] = {0};
191+
const long long $SsSdVMn[1] = {0};
192192

193193
// Set
194194

195195
SWIFT_RUNTIME_STDLIB_INTERNAL
196-
const long long $Ss3SetVMn[1] = {0};
196+
const long long $SsSeVMn[1] = {0};
197197

198198
// Mirror
199199

0 commit comments

Comments
 (0)