Skip to content

Commit 2fd07f2

Browse files
authored
Merge pull request #7227 from apple/revert-7116-unsafeBitCast-Runtime.swift.gyb
2 parents 0f99d18 + e62a57f commit 2fd07f2

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

stdlib/public/core/Runtime.swift.gyb

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ import SwiftShims
2020
// Atomics
2121
//===----------------------------------------------------------------------===//
2222

23+
public typealias _PointerToPointer = UnsafeMutablePointer<UnsafeRawPointer?>
24+
2325
@_transparent
2426
public // @testable
2527
func _stdlib_atomicCompareExchangeStrongPtr(
26-
object target: UnsafeMutablePointer<UnsafeRawPointer?>,
27-
expected: UnsafeMutablePointer<UnsafeRawPointer?>,
28+
object target: _PointerToPointer,
29+
expected: _PointerToPointer,
2830
desired: UnsafeRawPointer?) -> Bool {
2931

3032
// We use Builtin.Word here because Builtin.RawPointer can't be nil.
@@ -69,16 +71,11 @@ public // @testable
6971
func _stdlib_atomicCompareExchangeStrongPtr<T>(
7072
object target: UnsafeMutablePointer<UnsafeMutablePointer<T>${optional}>,
7173
expected: UnsafeMutablePointer<UnsafeMutablePointer<T>${optional}>,
72-
desired: UnsafeMutablePointer<T>${optional}
73-
) -> Bool {
74-
let rawTarget = UnsafeMutableRawPointer(target).assumingMemoryBound(
75-
to: Optional<UnsafeRawPointer>.self)
76-
let rawExpected = UnsafeMutableRawPointer(expected).assumingMemoryBound(
77-
to: Optional<UnsafeRawPointer>.self)
74+
desired: UnsafeMutablePointer<T>${optional}) -> Bool {
7875
return _stdlib_atomicCompareExchangeStrongPtr(
79-
object: rawTarget,
80-
expected: rawExpected,
81-
desired: UnsafeRawPointer(desired))
76+
object: unsafeBitCast(target, to: _PointerToPointer.self),
77+
expected: unsafeBitCast(expected, to: _PointerToPointer.self),
78+
desired: unsafeBitCast(desired, to: Optional<UnsafeRawPointer>.self))
8279
}
8380
% end # optional
8481

@@ -90,10 +87,10 @@ func _stdlib_atomicInitializeARCRef(
9087
desired: AnyObject) -> Bool {
9188
var expected: UnsafeRawPointer?
9289
let desiredPtr = Unmanaged.passRetained(desired).toOpaque()
93-
let rawTarget = UnsafeMutableRawPointer(target).assumingMemoryBound(
94-
to: Optional<UnsafeRawPointer>.self)
9590
let wonRace = _stdlib_atomicCompareExchangeStrongPtr(
96-
object: rawTarget, expected: &expected, desired: desiredPtr)
91+
object: unsafeBitCast(target, to: _PointerToPointer.self),
92+
expected: &expected,
93+
desired: desiredPtr)
9794
if !wonRace {
9895
// Some other thread initialized the value. Balance the retain that we
9996
// performed on 'desired'.
@@ -226,14 +223,25 @@ public func _swift_stdlib_atomicLoadInt(
226223
#endif
227224
}
228225

226+
@_transparent
227+
public // @testable
228+
func _swift_stdlib_atomicLoadPtrImpl(
229+
object target: UnsafeMutablePointer<OpaquePointer>
230+
) -> OpaquePointer? {
231+
let value = Builtin.atomicload_seqcst_Word(target._rawValue)
232+
return OpaquePointer(bitPattern: Int(value))
233+
}
234+
229235
@_transparent
230236
public // @testable
231237
func _stdlib_atomicLoadARCRef(
232238
object target: UnsafeMutablePointer<AnyObject?>
233239
) -> AnyObject? {
234-
let value = Builtin.atomicload_seqcst_Word(target._rawValue)
235-
if let unwrapped = UnsafeRawPointer(bitPattern: Int(value)) {
236-
return Unmanaged<AnyObject>.fromOpaque(unwrapped).takeUnretainedValue()
240+
let result = _swift_stdlib_atomicLoadPtrImpl(
241+
object: unsafeBitCast(target, to: UnsafeMutablePointer<OpaquePointer>.self))
242+
if let unwrapped = result {
243+
return Unmanaged<AnyObject>.fromOpaque(
244+
UnsafePointer(unwrapped)).takeUnretainedValue()
237245
}
238246
return nil
239247
}
@@ -243,17 +251,17 @@ func _stdlib_atomicLoadARCRef(
243251
public func _swift_stdlib_atomicFetch${operation}Int(
244252
object target: UnsafeMutablePointer<Int>,
245253
operand: Int) -> Int {
246-
let rawTarget = UnsafeMutableRawPointer(target)
247254
#if arch(i386) || arch(arm)
248-
let value = _swift_stdlib_atomicFetch${operation}Int32(
249-
object: rawTarget.assumingMemoryBound(to: Int32.self),
250-
operand: Int32(operand))
255+
return Int(Int32(bitPattern:
256+
_swift_stdlib_atomicFetch${operation}UInt32(
257+
object: unsafeBitCast(target, to: UnsafeMutablePointer<UInt32>.self),
258+
operand: UInt32(bitPattern: Int32(operand)))))
251259
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
252-
let value = _swift_stdlib_atomicFetch${operation}Int64(
253-
object: rawTarget.assumingMemoryBound(to: Int64.self),
254-
operand: Int64(operand))
260+
return Int(Int64(bitPattern:
261+
_swift_stdlib_atomicFetch${operation}UInt64(
262+
object: unsafeBitCast(target, to: UnsafeMutablePointer<UInt64>.self),
263+
operand: UInt64(bitPattern: Int64(operand)))))
255264
#endif
256-
return Int(value)
257265
}
258266
% end
259267

0 commit comments

Comments
 (0)