mirror of
https://github.com/odin-lang/Odin.git
synced 2026-07-31 10:17:44 -04:00
Add mem_rip_label(label_id) so a RIP-relative memory operand can reference a label: the encoder writes a placeholder disp32 and emits a REL32 relocation (addend 0) at the field's byte offset, mirroring the existing .RELATIVE jump/call path. This expresses lea reg, [rip + <label>] (position-independent data addressing). Add op_imm_label(label_id) for movabs reg, <label>: the imm stays kind .IMMEDIATE (form matching unchanged) but is flagged so the encoder emits an ABS64 relocation for the imm64 instead of a literal; imm_matches_inline forces the full IMM64 form so a small id can't collapse to mov r64, imm32. Both labeled forms bypass the contextless recipe fast-path (which cannot append relocations) and fall back to the interpreter. Flags reuse spare bits in Memory (disp_is_label) and Operand_Flags (imm_is_label) -- no struct growth. Section 11 tests cover resolved/unresolved disp, the ABS64 movabs, and an end-to-end executed lea+load. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>