@@ -422,29 +422,33 @@ impl JitMemory {
422422 self . labels [ dest] . target . push ( TargetType :: Abs { page, pos } ) ;
423423 }
424424
425+ fn write_reloc ( & mut self , src_page : Page , src_pos : Pos , target : TargetType ) {
426+ let src_ptr = self [ src_page] . contents + src_pos. 0 ;
427+ match target {
428+ TargetType :: Rel { page, offset, pos } => {
429+ let target_ptr = self [ page] . contents + pos. 0 + ( offset as usize ) ;
430+ let disp = ( src_ptr as i128 ) - ( target_ptr as i128 ) ;
431+ match i32:: try_from ( disp) {
432+ Ok ( disp) => self [ page] . write32 ( pos, disp) ,
433+ Err ( _) => panic ! (
434+ "Relocation overflow. src:{:016x} dest:{:016x}" ,
435+ src_ptr, target_ptr
436+ ) ,
437+ }
438+ }
439+ TargetType :: Abs { page, pos } => {
440+ self [ page] . write64 ( pos, src_ptr as _ ) ;
441+ }
442+ }
443+ }
444+
425445 /// Resolve and fill all relocations.
426446 fn fill_relocs ( & mut self ) {
427447 let mut reloc = std:: mem:: take ( & mut self . labels ) ;
428448 for rel in reloc. iter_mut ( ) {
429449 if let Some ( ( src_page, src_pos) ) = rel. loc {
430- let src_ptr = self [ src_page] . contents + src_pos. 0 ;
431450 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- }
451+ self . write_reloc ( src_page, src_pos, target) ;
448452 }
449453 }
450454 }
0 commit comments