Skip to content

Commit 66d8892

Browse files
committed
Refactor.
1 parent 4e8f342 commit 66d8892

File tree

1 file changed

+45
-26
lines changed

1 file changed

+45
-26
lines changed

monoasm/src/jit_memory.rs

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,28 @@ pub struct JitMemory {
2323
labels: Labels,
2424
}
2525

26+
impl JitMemory {
27+
fn write_reloc(&mut self, page: Page, pos: Pos, target: TargetType) {
28+
let src_ptr = self[page].contents + pos.0;
29+
match target {
30+
TargetType::Rel { page, offset, pos } => {
31+
let target_ptr = self[page].contents + pos.0 + (offset as usize);
32+
let disp = (src_ptr as i128) - (target_ptr as i128);
33+
match i32::try_from(disp) {
34+
Ok(disp) => self[page].write32(pos, disp),
35+
Err(_) => panic!(
36+
"Relocation overflow. src:{:016x} dest:{:016x}",
37+
src_ptr, target_ptr
38+
),
39+
}
40+
}
41+
TargetType::Abs { page, pos } => {
42+
self[page].write64(pos, src_ptr as _);
43+
}
44+
}
45+
}
46+
}
47+
2648
#[derive(Debug, Clone, Copy, PartialEq)]
2749
pub struct Page(pub usize);
2850

@@ -377,10 +399,13 @@ impl JitMemory {
377399
/// Bind the current location to `label`.
378400
pub fn bind_label(&mut self, label: DestLabel) {
379401
let page = self.page;
380-
self.labels[label].loc = Some((page, self.counter));
402+
self.bind_label_with_page(page, label);
381403
}
382404

383405
pub fn bind_label_with_page(&mut self, page: Page, label: DestLabel) {
406+
//for reloc in std::mem::take(&mut self.labels[label].target) {
407+
// self.write_reloc(page, self[page].counter, reloc);
408+
//}
384409
self.labels[label].loc = Some((page, self[page].counter));
385410
}
386411

@@ -411,40 +436,34 @@ impl JitMemory {
411436
pub fn save_reloc(&mut self, dest: DestLabel, offset: u8) {
412437
let page = self.page;
413438
let pos = self.counter;
414-
self.labels[dest]
415-
.target
416-
.push(TargetType::Rel { page, offset, pos });
439+
let target = TargetType::Rel { page, offset, pos };
440+
if let Some((src_page, src_pos)) = self.labels[dest].loc {
441+
self.write_reloc(src_page, src_pos, target);
442+
} else {
443+
self.labels[dest].target.push(target);
444+
}
445+
self[page].counter = self[page].counter + 4;
417446
}
418447

419448
/// Save relocaton slot for `DestLabel`.
420449
fn save_absolute_reloc(&mut self, page: Page, dest: DestLabel) {
421450
let pos = self[page].counter;
422-
self.labels[dest].target.push(TargetType::Abs { page, pos });
451+
let target = TargetType::Abs { page, pos };
452+
if let Some((src_page, src_pos)) = self.labels[dest].loc {
453+
self.write_reloc(src_page, src_pos, target);
454+
} else {
455+
self.labels[dest].target.push(target);
456+
}
457+
self[page].counter = self[page].counter + 8;
423458
}
424459

425460
/// Resolve and fill all relocations.
426461
fn fill_relocs(&mut self) {
427462
let mut reloc = std::mem::take(&mut self.labels);
428463
for rel in reloc.iter_mut() {
429464
if let Some((src_page, src_pos)) = rel.loc {
430-
let src_ptr = self[src_page].contents + src_pos.0;
431465
for target in std::mem::take(&mut rel.target) {
432-
match target {
433-
TargetType::Rel { page, offset, pos } => {
434-
let target_ptr = self[page].contents + pos.0 + (offset as usize);
435-
let disp = (src_ptr as i128) - (target_ptr as i128);
436-
match i32::try_from(disp) {
437-
Ok(disp) => self[page].write32(pos, disp),
438-
Err(_) => panic!(
439-
"Relocation overflow. src:{:016x} dest:{:016x}",
440-
src_ptr, target_ptr
441-
),
442-
}
443-
}
444-
TargetType::Abs { page, pos } => {
445-
self[page].write64(pos, src_ptr as _);
446-
}
447-
}
466+
self.write_reloc(src_page, src_pos, target);
448467
}
449468
}
450469
}
@@ -478,7 +497,7 @@ impl JitMemory {
478497
self[Page(id)].align8();
479498
self.bind_label_with_page(Page(id), const_label);
480499
self.save_absolute_reloc(Page(id), label);
481-
self[Page(id)].emitq(0);
500+
//self[Page(id)].emitq(0);
482501
}
483502
DataType::Align8 => {
484503
self[Page(id)].align8();
@@ -516,7 +535,7 @@ impl JitMemory {
516535
self[DATA_PAGE].align8();
517536
self.bind_label_with_page(DATA_PAGE, data_label);
518537
self.save_absolute_reloc(DATA_PAGE, label);
519-
self[DATA_PAGE].emitq(0);
538+
//self[DATA_PAGE].emitq(0);
520539
}
521540
DataType::Align8 => {
522541
self[DATA_PAGE].align8();
@@ -650,7 +669,7 @@ impl JitMemory {
650669
pub fn enc_d(&mut self, op: &[u8], dest: DestLabel) {
651670
self.emit(op);
652671
self.save_reloc(dest, 4);
653-
self.emitl(0);
672+
//self.emitl(0);
654673
}
655674

656675
/// Encoding: /n
@@ -871,7 +890,7 @@ impl JitMemory {
871890
Disp::D32(d) => self.emitl(d as u32),
872891
Disp::Label(label) => {
873892
self.save_reloc(label, 4 + imm.offset());
874-
self.emitl(0);
893+
//self.emitl(0);
875894
}
876895
Disp::None => {}
877896
}

0 commit comments

Comments
 (0)