Skip to content

Commit 29ce7a3

Browse files
authored
[Stdlib] Add some prespecializations to the stdlib (#66446)
* [Stdlib] Add some prespecializations to the stdlib This adds prespecializations for commonly used types to the stdlib * Add false positives to ABI checker ignore list * Update multithread_module.swift * Update multithread_module.swift * Update multithread_module.swift
1 parent b6acb6f commit 29ce7a3

File tree

5 files changed

+157
-1
lines changed

5 files changed

+157
-1
lines changed

lib/DriverTool/sil_opt_main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,8 @@ int sil_opt_main(ArrayRef<const char *> argv, void *MainAddr) {
617617
options.EnableObjCInterop ? true :
618618
options.DisableObjCInterop ? false : llvm::Triple(options.Target).isOSDarwin();
619619

620+
Invocation.getLangOptions().Features.insert(Feature::LayoutPrespecialization);
621+
620622
Invocation.getLangOptions().OptimizationRemarkPassedPattern =
621623
createOptRemarkRegex(options.PassRemarksPassed);
622624
Invocation.getLangOptions().OptimizationRemarkMissedPattern =

lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,8 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
873873
if (Args.hasArg(OPT_enable_builtin_module))
874874
Opts.Features.insert(Feature::BuiltinModule);
875875

876+
Opts.Features.insert(Feature::LayoutPrespecialization);
877+
876878
Opts.EnableAppExtensionRestrictions |= Args.hasArg(OPT_enable_app_extension);
877879

878880
Opts.EnableSwift3ObjCInference =

stdlib/public/core/Prespecialize.swift

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,147 @@ internal func _prespecialize() {
117117
consume(UnsafeBufferPointer<Int8>.self)
118118
consume(UnsafePointer<Int8>.self)
119119
}
120+
121+
@_specializeExtension
122+
extension Array {
123+
124+
@_specialize(exported: true,
125+
availability: SwiftStdlib 5.9, *;
126+
target: _endMutation(),
127+
where @_noMetadata Element : _Class)
128+
@available(SwiftStdlib 5.9, *)
129+
@usableFromInline
130+
mutating func __specialize_class__endMutation(){ Builtin.unreachable() }
131+
132+
@_specialize(exported: true,
133+
availability: SwiftStdlib 5.9, *;
134+
target: _createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:),
135+
where @_noMetadata Element : _Class)
136+
@available(SwiftStdlib 5.9, *)
137+
@usableFromInline
138+
mutating func __specialize_class__createNewBuffer(bufferIsUnique: Bool, minimumCapacity: Int, growForAppend: Bool) { Builtin.unreachable() }
139+
140+
@_specialize(exported: true,
141+
availability: SwiftStdlib 5.9, *;
142+
target: _makeUniqueAndReserveCapacityIfNotUnique(),
143+
where @_noMetadata Element : _Class)
144+
@available(SwiftStdlib 5.9, *)
145+
@usableFromInline
146+
mutating func __specialize_class__makeUniqueAndReserveCapacityIfNotUnique() { Builtin.unreachable() }
147+
148+
@_specialize(exported: true,
149+
availability: SwiftStdlib 5.9, *;
150+
target: _appendElementAssumeUniqueAndCapacity(_:newElement:),
151+
where @_noMetadata Element : _Class)
152+
@available(SwiftStdlib 5.9, *)
153+
@usableFromInline
154+
mutating func __specialize_class__appendElementAssumeUniqueAndCapacity(_: Int, newElement: __owned Element) { Builtin.unreachable() }
155+
}
156+
157+
#if _runtime(_ObjC)
158+
@_specializeExtension
159+
extension _ArrayBuffer {
160+
@_specialize(exported: true,
161+
availability: SwiftStdlib 5.9, *;
162+
target: _consumeAndCreateNew(bufferIsUnique:minimumCapacity:growForAppend:),
163+
where @_noMetadata Element : _Class)
164+
@available(SwiftStdlib 5.9, *)
165+
@usableFromInline
166+
func __specialize_class__consumeAndCreateNew(bufferIsUnique: Bool, minimumCapacity: Int, growForAppend: Bool) -> _ArrayBuffer<Element> { Builtin.unreachable() }
167+
168+
@_specialize(exported: true,
169+
availability: SwiftStdlib 5.9, *;
170+
target: _copyContents(initializing:),
171+
where @_noMetadata Element : _Class)
172+
@available(SwiftStdlib 5.9, *)
173+
@usableFromInline
174+
__consuming func __specialize_class__copyContents(
175+
initializing buffer: UnsafeMutableBufferPointer<Element>
176+
) -> (Iterator, UnsafeMutableBufferPointer<Element>.Index) { Builtin.unreachable() }
177+
178+
@_specialize(exported: true,
179+
availability: SwiftStdlib 5.9, *;
180+
target: _copyContents(subRange:initializing:),
181+
where @_noMetadata Element : _Class)
182+
@available(SwiftStdlib 5.9, *)
183+
@usableFromInline
184+
__consuming func __specialize_class__copyContents(subRange: Range<Int>, initializing: Swift.UnsafeMutablePointer<Element>) -> Swift.UnsafeMutablePointer<Element> { Builtin.unreachable() }
185+
186+
@_specialize(exported: true,
187+
availability: SwiftStdlib 5.9, *;
188+
target: _getElementSlowPath(_:),
189+
where @_noMetadata Element : _Class)
190+
@available(SwiftStdlib 5.9, *)
191+
func __specialize_class__getElementSlowPath(_ i: Int) -> AnyObject { Builtin.unreachable() }
192+
}
193+
#endif
194+
195+
@_specializeExtension
196+
extension ContiguousArray {
197+
@_specialize(exported: true,
198+
availability: SwiftStdlib 5.9, *;
199+
target: _endMutation(),
200+
where @_noMetadata Element : _Class)
201+
@available(SwiftStdlib 5.9, *)
202+
@usableFromInline
203+
mutating func __specialize_class__endMutation(){ Builtin.unreachable() }
204+
205+
@_specialize(exported: true,
206+
availability: SwiftStdlib 5.9, *;
207+
target: _createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:),
208+
where @_noMetadata Element : _Class)
209+
@available(SwiftStdlib 5.9, *)
210+
@usableFromInline
211+
mutating func __specialize_class__createNewBuffer(bufferIsUnique: Bool, minimumCapacity: Int, growForAppend: Bool) { Builtin.unreachable() }
212+
213+
@_specialize(exported: true,
214+
availability: SwiftStdlib 5.9, *;
215+
target: _makeUniqueAndReserveCapacityIfNotUnique(),
216+
where @_noMetadata Element : _Class)
217+
@available(SwiftStdlib 5.9, *)
218+
@usableFromInline
219+
mutating func __specialize_class__makeUniqueAndReserveCapacityIfNotUnique() { Builtin.unreachable() }
220+
221+
@_specialize(exported: true,
222+
availability: SwiftStdlib 5.9, *;
223+
target: _appendElementAssumeUniqueAndCapacity(_:newElement:),
224+
where @_noMetadata Element : _Class)
225+
@available(SwiftStdlib 5.9, *)
226+
@usableFromInline
227+
mutating func __specialize_class__appendElementAssumeUniqueAndCapacity(_: Int, newElement: __owned Element) { Builtin.unreachable() }
228+
229+
@_specialize(exported: true,
230+
availability: SwiftStdlib 5.9, *;
231+
target: _reserveCapacityImpl(minimumCapacity:growForAppend:),
232+
where @_noMetadata Element : _Class)
233+
@available(SwiftStdlib 5.9, *)
234+
@usableFromInline
235+
mutating func __specialize_class__reserveCapacityImpl(minimumCapacity: Int, growForAppend: Bool) { Builtin.unreachable() }
236+
237+
@_specialize(exported: true,
238+
availability: SwiftStdlib 5.9, *;
239+
target: _reserveCapacityAssumingUniqueBuffer(oldCount:),
240+
where @_noMetadata Element : _Class)
241+
@available(SwiftStdlib 5.9, *)
242+
@usableFromInline
243+
mutating func __specialize_class__reserveCapacityAssumingUniqueBuffer(oldCount: Int) { Builtin.unreachable() }
244+
245+
@_specialize(exported: true,
246+
availability: SwiftStdlib 5.9, *;
247+
target: reserveCapacity(_:),
248+
where @_noMetadata Element : _Class)
249+
@available(SwiftStdlib 5.9, *)
250+
@usableFromInline
251+
mutating func __specialize_class__reserveCapacity(_ minimumCapacity: Int) { Builtin.unreachable() }
252+
}
253+
254+
@_specializeExtension
255+
extension _ContiguousArrayBuffer {
256+
@_specialize(exported: true,
257+
availability: SwiftStdlib 5.9, *;
258+
target: _consumeAndCreateNew(bufferIsUnique:minimumCapacity:growForAppend:),
259+
where @_noMetadata Element : _Class)
260+
@available(SwiftStdlib 5.9, *)
261+
@usableFromInline
262+
func __specialize_class__consumeAndCreateNew(bufferIsUnique: Bool, minimumCapacity: Int, growForAppend: Bool) -> _ContiguousArrayBuffer<Element> { Builtin.unreachable() }
263+
}

test/IRGen/multithread_module.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ public func mutateBaseArray(_ arr: inout [Base], _ x: Base) {
6969
// Check if all specializations from stdlib functions are created in the same LLVM module.
7070

7171
// CHECK-MAINLL-DAG: define {{.*}} @"$ss{{(12_|22_Contiguous)}}ArrayBufferV20_consumeAndCreateNew14bufferIsUnique15minimumCapacity13growForAppendAByxGSb_SiSbtF4test8MyStructV_Tg5"
72-
// CHECK-MAINLL-DAG: define {{.*}} @"$ss{{(12_|22_Contiguous)}}ArrayBufferV20_consumeAndCreateNew14bufferIsUnique15minimumCapacity13growForAppendAByxGSb_SiSbtF4test4BaseC_Tg5"
7372

7473
// Check if the DI filename is correct and not "<unknown>".
7574

test/api-digester/stability-stdlib-abi-without-asserts.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,13 @@ Var _StringGuts._isContiguousUTF16 has been removed
124124
Var _StringGuts.startUTF16 has been removed
125125
Func _persistCString(_:) has been removed
126126

127+
// These functions have not been renamed, they are pre-specialized versions and purely additive.
128+
// These seem to be false positives in the ABI checker. The original symbols are still present.
129+
Func Array._createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:) has been renamed to Func __specialize_class__createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:)
130+
Func Array._createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:) has mangled name changing from 'Swift.Array._createNewBuffer(bufferIsUnique: Swift.Bool, minimumCapacity: Swift.Int, growForAppend: Swift.Bool) -> ()' to 'Swift.Array.__specialize_class__createNewBuffer(bufferIsUnique: Swift.Bool, minimumCapacity: Swift.Int, growForAppend: Swift.Bool) -> ()'
131+
Func ContiguousArray._createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:) has been renamed to Func __specialize_class__createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:)
132+
Func ContiguousArray._createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:) has mangled name changing from 'Swift.ContiguousArray._createNewBuffer(bufferIsUnique: Swift.Bool, minimumCapacity: Swift.Int, growForAppend: Swift.Bool) -> ()' to 'Swift.ContiguousArray.__specialize_class__createNewBuffer(bufferIsUnique: Swift.Bool, minimumCapacity: Swift.Int, growForAppend: Swift.Bool) -> ()'
133+
Func ContiguousArray._reserveCapacityImpl(minimumCapacity:growForAppend:) has been renamed to Func __specialize_class__reserveCapacityImpl(minimumCapacity:growForAppend:)
134+
Func ContiguousArray._reserveCapacityImpl(minimumCapacity:growForAppend:) has mangled name changing from 'Swift.ContiguousArray._reserveCapacityImpl(minimumCapacity: Swift.Int, growForAppend: Swift.Bool) -> ()' to 'Swift.ContiguousArray.__specialize_class__reserveCapacityImpl(minimumCapacity: Swift.Int, growForAppend: Swift.Bool) -> ()'
135+
127136
// *** DO NOT DISABLE OR XFAIL THIS TEST. *** (See comment above.)

0 commit comments

Comments
 (0)