@@ -244,7 +244,7 @@ public struct UnsafeRawPointer: _Pointer {
244244 /// - Parameter other: The typed pointer to convert.
245245 @_transparent
246246 public init < T> ( @_nonEphemeral _ other: UnsafeMutablePointer < T > ) {
247- _rawValue = other. _rawValue
247+ _rawValue = other. _rawValue
248248 }
249249
250250 /// Creates a new raw pointer from the given typed pointer.
@@ -257,8 +257,8 @@ public struct UnsafeRawPointer: _Pointer {
257257 /// result is `nil`.
258258 @_transparent
259259 public init ? < T> ( @_nonEphemeral _ other: UnsafeMutablePointer < T > ? ) {
260- guard let unwrapped = other else { return nil }
261- _rawValue = unwrapped. _rawValue
260+ guard let unwrapped = other else { return nil }
261+ _rawValue = unwrapped. _rawValue
262262 }
263263
264264 /// Deallocates the previously allocated memory block referenced by this pointer.
@@ -429,7 +429,7 @@ public struct UnsafeRawPointer: _Pointer {
429429 MemoryLayout < T > . alignment. _builtinWordValue)
430430 return Builtin . loadRaw ( alignedPointer)
431431#else
432- return Builtin . loadRaw ( rawPointer)
432+ return Builtin . loadRaw ( rawPointer)
433433#endif
434434 }
435435
@@ -455,13 +455,25 @@ public struct UnsafeRawPointer: _Pointer {
455455 /// - Returns: A new instance of type `T`, read from the raw bytes at
456456 /// `offset`. The returned instance isn't associated
457457 /// with the value in the range of memory referenced by this pointer.
458+ @inlinable
458459 @_alwaysEmitIntoClient
459460 public func loadUnaligned< T> (
460461 fromByteOffset offset: Int = 0 ,
461462 as type: T . Type
462463 ) -> T {
463464 _debugPrecondition ( _isPOD ( T . self) )
464- return Builtin . loadRaw ( ( self + offset) . _rawValue)
465+ return withUnsafeTemporaryAllocation ( of: T . self, capacity: 1 ) {
466+ let temporary = $0. baseAddress. _unsafelyUnwrappedUnchecked
467+ Builtin . int_memcpy_RawPointer_RawPointer_Int64 (
468+ temporary. _rawValue,
469+ ( self + offset) . _rawValue,
470+ UInt64 ( MemoryLayout< T> . size) . _value,
471+ /*volatile:*/ false . _value
472+ )
473+ return temporary. pointee
474+ }
475+ //FIXME: reimplement with `loadRaw` when supported in SIL (rdar://96956089)
476+ // e.g. Builtin.loadRaw((self + offset)._rawValue)
465477 }
466478}
467479
@@ -1180,13 +1192,25 @@ public struct UnsafeMutableRawPointer: _Pointer {
11801192 /// - Returns: A new instance of type `T`, read from the raw bytes at
11811193 /// `offset`. The returned instance isn't associated
11821194 /// with the value in the range of memory referenced by this pointer.
1195+ @inlinable
11831196 @_alwaysEmitIntoClient
11841197 public func loadUnaligned< T> (
11851198 fromByteOffset offset: Int = 0 ,
11861199 as type: T . Type
11871200 ) -> T {
11881201 _debugPrecondition ( _isPOD ( T . self) )
1189- return Builtin . loadRaw ( ( self + offset) . _rawValue)
1202+ return withUnsafeTemporaryAllocation ( of: T . self, capacity: 1 ) {
1203+ let temporary = $0. baseAddress. _unsafelyUnwrappedUnchecked
1204+ Builtin . int_memcpy_RawPointer_RawPointer_Int64 (
1205+ temporary. _rawValue,
1206+ ( self + offset) . _rawValue,
1207+ UInt64 ( MemoryLayout< T> . size) . _value,
1208+ /*volatile:*/ false . _value
1209+ )
1210+ return temporary. pointee
1211+ }
1212+ //FIXME: reimplement with `loadRaw` when supported in SIL (rdar://96956089)
1213+ // e.g. Builtin.loadRaw((self + offset)._rawValue)
11901214 }
11911215
11921216 /// Stores the given value's bytes into raw memory at the specified offset.
0 commit comments