Skip to content

Commit 6900efe

Browse files
committed
[embedded] Fix an LLVMARCOpts crash by avoiding direct calls to swift_retain/swift_release
1 parent e4be36b commit 6900efe

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

stdlib/public/core/EmbeddedRuntime.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ public func swift_isUniquelyReferenced_nonNull_native(object: UnsafeMutablePoint
131131

132132
@_silgen_name("swift_retain")
133133
public func swift_retain(object: Builtin.RawPointer) -> Builtin.RawPointer {
134-
return swift_retain_n(object: object, n: 1)
134+
if Int(Builtin.ptrtoint_Word(object)) == 0 { return object }
135+
let o = UnsafeMutablePointer<HeapObject>(object)
136+
return swift_retain_n_(object: o, n: 1)._rawValue
135137
}
136138

137139
// Cannot use UnsafeMutablePointer<HeapObject>? directly in the function argument or return value as it causes IRGen crashes
@@ -155,7 +157,9 @@ func swift_retain_n_(object: UnsafeMutablePointer<HeapObject>, n: UInt32) -> Uns
155157

156158
@_silgen_name("swift_release")
157159
public func swift_release(object: Builtin.RawPointer) {
158-
swift_release_n(object: object, n: 1)
160+
if Int(Builtin.ptrtoint_Word(object)) == 0 { return }
161+
let o = UnsafeMutablePointer<HeapObject>(object)
162+
swift_release_n_(object: o, n: 1)
159163
}
160164

161165
@_silgen_name("swift_release_n")

test/embedded/arc-crash.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %target-swift-frontend -target armv7-apple-none-macho -assert-config Debug -Osize -Xcc -D__MACH__ -emit-ir %s -enable-experimental-feature Embedded | %FileCheck %s
2+
// RUN: %target-swift-frontend -target arm64-apple-none-macho -assert-config Debug -Osize -Xcc -D__MACH__ -Xcc -D__arm64__ -Xcc -D__APPLE__ -emit-ir %s -enable-experimental-feature Embedded | %FileCheck %s
3+
4+
// REQUIRES: VENDOR=apple
5+
// REQUIRES: optimized_stdlib
6+
7+
public func test() {}
8+
test()
9+
10+
// CHECK: define {{.*}}i32 @main

0 commit comments

Comments
 (0)