diff --git a/core/rexcode/docs/x86_api.md b/core/rexcode/docs/x86_api.md index 358367e8e..2f913159d 100644 --- a/core/rexcode/docs/x86_api.md +++ b/core/rexcode/docs/x86_api.md @@ -122,6 +122,7 @@ Memory :: bit_field u64 { addr_size_override: bool | 1, base_class: u8 | 5, index_class: u8 | 5, + disp_is_label: bool | 1, // disp holds a label id -> REL32 relocation } MEM_BASE_RIP :: 30 MEM_BASE_NONE :: 31 MEM_INDEX_NONE :: 31 ``` @@ -131,7 +132,17 @@ MEM_BASE_RIP :: 30 MEM_BASE_NONE :: 31 MEM_INDEX_NONE :: 31 **Convenience constructors** (current names after the in-tree refactor): `mem_base_only(base)`, `mem_base_disp(base, disp)`, `mem_base_index(base, index, scale)`, -`mem_base_index_disp(base, index, scale, disp)`, `mem_rip_disp(disp)`. +`mem_base_index_disp(base, index, scale, disp)`, `mem_rip_disp(disp)`, +`mem_rip_label(label_id)`. + +> **Label addressing.** `mem_rip_label(label_id)` builds a RIP-relative operand +> whose displacement references a **label** rather than a literal: the encoder +> writes a placeholder disp32 and emits a `REL32` relocation for `label_id` at +> that field (addend 0), exactly as the `.RELATIVE` jump/call path does. This is +> how `lea reg, [rip +