@@ -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 ) ]
2749pub 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