Skip to content

feat: add 2-pass release build for Dynamic Dispatch table#119

Draft
bdero wants to merge 5 commits intoshorebird/devfrom
bdero/cascade-limiter
Draft

feat: add 2-pass release build for Dynamic Dispatch table#119
bdero wants to merge 5 commits intoshorebird/devfrom
bdero/cascade-limiter

Conversation

@bdero
Copy link
Copy Markdown
Member

@bdero bdero commented Mar 31, 2026

Summary

  • Adds a 2-pass release build for arm64 Apple platforms to compute the Dynamic Dispatch (DD) table
  • Pass 1 produces a temporary ELF snapshot for analyze_snapshot to compute DD table manifest, caller links, and slot mapping
  • Pass 2 produces the final assembly snapshot with indirect calls wired up via --dd_slot_mapping
  • DD table files (App.dd.link, App.dd_callers.link) are copied into the supplement directory alongside existing link files

Test plan

  • Flutter Tools Tests pass on Ubuntu and macOS
  • Shard Runner Tests pass
  • Android Tests pass

bdero added 5 commits March 30, 2026 10:24
When building for arm64 Apple platforms with the linker enabled, run
gen_snapshot twice: first in ELF mode to produce a temporary snapshot
for analyze_snapshot to compute the DD table manifest, caller links,
and slot mapping, then in assembly mode with --dd_slot_mapping to
produce the final snapshot with indirect calls wired up.

The DD table files (App.dd.link, App.dd_callers.link) are copied into
the shorebird supplement directory alongside the existing link files
so they can be bundled with releases and used during patch builds.
The 2-pass DD table build runs gen_snapshot in ELF mode before the
main assembly pass. Update tests to expect this additional command.
The arm64 DD analysis pass delays the arm64 assembly, so x86_64
(which skips DD) completes its build first when both run concurrently
via Future.wait.
Move the analyze_snapshot existence check before the gen_snapshot ELF
pass so the entire DD computation is a no-op on standard Flutter SDKs
that don't ship analyze_snapshot. This fixes iOS smoke test failures
where gen_snapshot was being invoked unnecessarily in ELF mode.

Also reverts test changes that are no longer needed since DD commands
won't appear when analyze_snapshot doesn't exist in the test filesystem.
The arm64 build's async _computeDDTable() check (even a no-op when
analyze_snapshot is absent) introduces an await that lets x86_64
reach gen_snapshot first in Future.wait. Reorder test expectations
to match the actual interleaving: x86_64 before arm64 at each step.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant