Skip to content

Commit 3ba9d71

Browse files
committed
Resolve reloc immediately if possible.
1 parent 9361c09 commit 3ba9d71

File tree

2 files changed

+10
-13
lines changed

2 files changed

+10
-13
lines changed

monoasm/src/jit_memory.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ impl JitMemory {
377377
/// Bind the current location to `label`.
378378
pub fn bind_label(&mut self, label: DestLabel) {
379379
let page = self.page;
380-
self.labels[label].loc = Some((page, self.counter));
380+
self.bind_label_with_page(page, label);
381381
}
382382

383383
pub fn bind_label_with_page(&mut self, page: Page, label: DestLabel) {
@@ -408,10 +408,11 @@ impl JitMemory {
408408
}
409409

410410
/// Save relocaton slot for `DestLabel`.
411-
pub fn save_reloc(&mut self, dest: DestLabel, offset: u8) {
411+
pub fn emit_reloc(&mut self, dest: DestLabel, offset: u8) {
412412
let page = self.page;
413413
let pos = self.counter;
414414
let target = TargetType::Rel { page, offset, pos };
415+
self.emitl(0);
415416
if let Some((src_page, src_pos)) = self.labels[dest].loc {
416417
self.write_reloc(src_page, src_pos, target);
417418
} else {
@@ -420,9 +421,10 @@ impl JitMemory {
420421
}
421422

422423
/// Save relocaton slot for `DestLabel`.
423-
fn save_absolute_reloc(&mut self, page: Page, dest: DestLabel) {
424+
fn emit_absolute_reloc(&mut self, page: Page, dest: DestLabel) {
424425
let pos = self[page].counter;
425426
let target = TargetType::Abs { page, pos };
427+
self[page].emitq(0);
426428
if let Some((src_page, src_pos)) = self.labels[dest].loc {
427429
self.write_reloc(src_page, src_pos, target);
428430
} else {
@@ -489,8 +491,7 @@ impl JitMemory {
489491
DataType::AbsAddress(label) => {
490492
self[Page(id)].align8();
491493
self.bind_label_with_page(Page(id), const_label);
492-
self.save_absolute_reloc(Page(id), label);
493-
self[Page(id)].emitq(0);
494+
self.emit_absolute_reloc(Page(id), label);
494495
}
495496
DataType::Align8 => {
496497
self[Page(id)].align8();
@@ -527,8 +528,7 @@ impl JitMemory {
527528
DataType::AbsAddress(label) => {
528529
self[DATA_PAGE].align8();
529530
self.bind_label_with_page(DATA_PAGE, data_label);
530-
self.save_absolute_reloc(DATA_PAGE, label);
531-
self[DATA_PAGE].emitq(0);
531+
self.emit_absolute_reloc(DATA_PAGE, label);
532532
}
533533
DataType::Align8 => {
534534
self[DATA_PAGE].align8();
@@ -661,8 +661,7 @@ impl JitMemory {
661661
/// Op cd
662662
pub fn enc_d(&mut self, op: &[u8], dest: DestLabel) {
663663
self.emit(op);
664-
self.save_reloc(dest, 4);
665-
self.emitl(0);
664+
self.emit_reloc(dest, 4);
666665
}
667666

668667
/// Encoding: /n
@@ -882,8 +881,7 @@ impl JitMemory {
882881
Disp::D8(d) => self.emitb(d as u8),
883882
Disp::D32(d) => self.emitl(d as u32),
884883
Disp::Label(label) => {
885-
self.save_reloc(label, 4 + imm.offset());
886-
self.emitl(0);
884+
self.emit_reloc(label, 4 + imm.offset());
887885
}
888886
Disp::None => {}
889887
}

monoasm_macro/src/asm.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,7 @@ pub fn compile(inst: Inst) -> TokenStream {
281281
// E8 cd
282282
quote! {
283283
jit.emitb(0xe8);
284-
jit.save_reloc(#dest, 4);
285-
jit.emitl(0);
284+
jit.emit_reloc(#dest, 4);
286285
}
287286
}
288287
Dest::Disp(imm) => {

0 commit comments

Comments
 (0)