Merge pull request #7227 from apple/revert-7116-unsafeBitCast-Runtime.swift.gyb
diff --git a/stdlib/public/core/Runtime.swift.gyb b/stdlib/public/core/Runtime.swift.gyb
index 519959b..1d11ee4 100644
--- a/stdlib/public/core/Runtime.swift.gyb
+++ b/stdlib/public/core/Runtime.swift.gyb
@@ -20,11 +20,13 @@
// Atomics
//===----------------------------------------------------------------------===//
+public typealias _PointerToPointer = UnsafeMutablePointer<UnsafeRawPointer?>
+
@_transparent
public // @testable
func _stdlib_atomicCompareExchangeStrongPtr(
- object target: UnsafeMutablePointer<UnsafeRawPointer?>,
- expected: UnsafeMutablePointer<UnsafeRawPointer?>,
+ object target: _PointerToPointer,
+ expected: _PointerToPointer,
desired: UnsafeRawPointer?) -> Bool {
// We use Builtin.Word here because Builtin.RawPointer can't be nil.
@@ -69,16 +71,11 @@
func _stdlib_atomicCompareExchangeStrongPtr<T>(
object target: UnsafeMutablePointer<UnsafeMutablePointer<T>${optional}>,
expected: UnsafeMutablePointer<UnsafeMutablePointer<T>${optional}>,
- desired: UnsafeMutablePointer<T>${optional}
-) -> Bool {
- let rawTarget = UnsafeMutableRawPointer(target).assumingMemoryBound(
- to: Optional<UnsafeRawPointer>.self)
- let rawExpected = UnsafeMutableRawPointer(expected).assumingMemoryBound(
- to: Optional<UnsafeRawPointer>.self)
+ desired: UnsafeMutablePointer<T>${optional}) -> Bool {
return _stdlib_atomicCompareExchangeStrongPtr(
- object: rawTarget,
- expected: rawExpected,
- desired: UnsafeRawPointer(desired))
+ object: unsafeBitCast(target, to: _PointerToPointer.self),
+ expected: unsafeBitCast(expected, to: _PointerToPointer.self),
+ desired: unsafeBitCast(desired, to: Optional<UnsafeRawPointer>.self))
}
% end # optional
@@ -90,10 +87,10 @@
desired: AnyObject) -> Bool {
var expected: UnsafeRawPointer?
let desiredPtr = Unmanaged.passRetained(desired).toOpaque()
- let rawTarget = UnsafeMutableRawPointer(target).assumingMemoryBound(
- to: Optional<UnsafeRawPointer>.self)
let wonRace = _stdlib_atomicCompareExchangeStrongPtr(
- object: rawTarget, expected: &expected, desired: desiredPtr)
+ object: unsafeBitCast(target, to: _PointerToPointer.self),
+ expected: &expected,
+ desired: desiredPtr)
if !wonRace {
// Some other thread initialized the value. Balance the retain that we
// performed on 'desired'.
@@ -228,12 +225,23 @@
@_transparent
public // @testable
+func _swift_stdlib_atomicLoadPtrImpl(
+ object target: UnsafeMutablePointer<OpaquePointer>
+) -> OpaquePointer? {
+ let value = Builtin.atomicload_seqcst_Word(target._rawValue)
+ return OpaquePointer(bitPattern: Int(value))
+}
+
+@_transparent
+public // @testable
func _stdlib_atomicLoadARCRef(
object target: UnsafeMutablePointer<AnyObject?>
) -> AnyObject? {
- let value = Builtin.atomicload_seqcst_Word(target._rawValue)
- if let unwrapped = UnsafeRawPointer(bitPattern: Int(value)) {
- return Unmanaged<AnyObject>.fromOpaque(unwrapped).takeUnretainedValue()
+ let result = _swift_stdlib_atomicLoadPtrImpl(
+ object: unsafeBitCast(target, to: UnsafeMutablePointer<OpaquePointer>.self))
+ if let unwrapped = result {
+ return Unmanaged<AnyObject>.fromOpaque(
+ UnsafePointer(unwrapped)).takeUnretainedValue()
}
return nil
}
@@ -243,17 +251,17 @@
public func _swift_stdlib_atomicFetch${operation}Int(
object target: UnsafeMutablePointer<Int>,
operand: Int) -> Int {
- let rawTarget = UnsafeMutableRawPointer(target)
#if arch(i386) || arch(arm)
- let value = _swift_stdlib_atomicFetch${operation}Int32(
- object: rawTarget.assumingMemoryBound(to: Int32.self),
- operand: Int32(operand))
+ return Int(Int32(bitPattern:
+ _swift_stdlib_atomicFetch${operation}UInt32(
+ object: unsafeBitCast(target, to: UnsafeMutablePointer<UInt32>.self),
+ operand: UInt32(bitPattern: Int32(operand)))))
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
- let value = _swift_stdlib_atomicFetch${operation}Int64(
- object: rawTarget.assumingMemoryBound(to: Int64.self),
- operand: Int64(operand))
+ return Int(Int64(bitPattern:
+ _swift_stdlib_atomicFetch${operation}UInt64(
+ object: unsafeBitCast(target, to: UnsafeMutablePointer<UInt64>.self),
+ operand: UInt64(bitPattern: Int64(operand)))))
#endif
- return Int(value)
}
% end