bytecodealliance / bytecodealliance/wasmtime

Cranelift: Insert veneers for inter-function relative calls as necessary

Open
#3,277 0 comments 0 reactions 0 assignees View on GitHub
cranelift cranelift:area:aarch64 cranelift:area:x64
Dominant language
Rust
Stars
18.6k
Forks
1.8k
Avg merge
1d 18h
Merged PRs (30d)
126

Description

This issue is intended to track [this FIXME in the code](https://github.com/bytecodealliance/wasmtime/blob/1532516a363eed88b5a36726a1710411a9883049/cranelift/codegen/src/machinst/buffer.rs#L1278-L1310) which specifically relates to how inter-function relative calls, used for the first time in Wasmtime in https://github.com/bytecodealliance/wasmtime/pull/3275, have limited jump ranges (especially on AArch64 with 26-bit jumps), and may need fixups.

Today if a compiled function on AArch64 is greater than 64MB in size then it runs the risk of panicking when "linking" if it needs to call a function defined after that function. The `MachBuffer` used when assembling the function does not keep track of relative calls and where they are, instead it just assumes all relocations will still work once the function is fully generated.

The fix for this issue will be introducing the notion of a permanently unresolved label in `MachBuffer`. This label would then be used for relocations which are recognized as a `LabelUse` (probably via the `LabelUse::from_reloc` function). The `MachBuffer` would automatically insert veneers for these `LabelUse` items and, at the end of a function, would take all the remaining `LabelUse` items and generate relocations for them.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.