Skip to content

Commit a9d149b

Browse files
committed
[embedded] Add a summary of the Embedded Swift ABI
1 parent 53cfd44 commit a9d149b

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

docs/EmbeddedSwift/ABI.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Embedded Swift -- ABI
2+
3+
**⚠️ Embedded Swift is experimental. This document might be out of date with latest development.**
4+
5+
**‼️ Use the latest downloadable 'Trunk Development' snapshot from swift.org to use Embedded Swift. Public releases of Swift do not yet support Embedded Swift.**
6+
7+
For an introduction and motivation into Embedded Swift, please see "[A Vision for Embedded Swift](https://github.com/apple/swift-evolution/blob/main/visions/embedded-swift.md)", a Swift Evolution document highlighting the main goals and approaches.
8+
9+
## Calling convention of Embedded Swift
10+
11+
As of today, Embedded Swift has identical calling convention to full Swift. However, this does not need to continue in the future, and there should not be expectations that the ABI of Embedded Swift is compatible with full Swift.
12+
13+
## Metadata ABI of Embedded Swift
14+
15+
Embedded Swift eliminates almost all metadata compared to full Swift. However, class metadata is still used, because those serve as vtables for dynamic dispatch of methods to implement runtime polymorphism. The layout of Embedded Swift's class metadata is *different* from full Swift:
16+
17+
- The **super pointer** pointing to the class metadata record for the superclass is stored at **offset 0**. If the class is a root class, it is null.
18+
- The **destructor pointer** is stored at **offset 1**. This function is invoked by Swift's deallocator when the class instance is destroyed.
19+
- The **ivar destroyer** is stored at **offset 2**. This function is invoked to destroy instance members when creation of the object is cancelled (e.g. in a failable initializer).
20+
- Lastly, the **vtable** is stored at **offset 3**: For each Swift class in the class's inheritance hierarchy, in order starting
21+
from the root class and working down to the most derived class, the function pointers to the implementation of every method of the class in declaration order in stored.
22+
23+
## Heap object layout in Embedded Swift
24+
25+
Heap objects have the following layout in Embedded Swift:
26+
27+
- The **isa pointer** (pointer to the class metadata) is stored at **offset 0**.
28+
- The **refcount** is stored inline at **offset 1**.
29+
- Normal stored properties follow.

0 commit comments

Comments
 (0)