(
&self,
obj: &mut Object<'static>,
funcs: &[(String, FuncKey, Box<dyn Any + Send + Sync>)],
resolve_reloc: &dyn Fn(usize, FuncKey) -> usize,
)
| 673 | } |
| 674 | |
| 675 | fn append_code( |
| 676 | &self, |
| 677 | obj: &mut Object<'static>, |
| 678 | funcs: &[(String, FuncKey, Box<dyn Any + Send + Sync>)], |
| 679 | resolve_reloc: &dyn Fn(usize, FuncKey) -> usize, |
| 680 | ) -> Result<Vec<(SymbolId, FunctionLoc)>> { |
| 681 | log::trace!( |
| 682 | "appending functions to object file: {:#?}", |
| 683 | funcs.iter().map(|(sym, _, _)| sym).collect::<Vec<_>>() |
| 684 | ); |
| 685 | |
| 686 | let mut builder = |
| 687 | ModuleTextBuilder::new(obj, self, self.isa.text_section_builder(funcs.len())); |
| 688 | if self.linkopts.force_jump_veneers { |
| 689 | builder.force_veneers(); |
| 690 | } |
| 691 | let mut addrs = AddressMapSection::default(); |
| 692 | let mut traps = TrapEncodingBuilder::default(); |
| 693 | let mut stack_maps = StackMapSection::default(); |
| 694 | let mut exception_tables = ExceptionTableBuilder::default(); |
| 695 | let mut frame_tables = FrameTableBuilder::default(); |
| 696 | |
| 697 | let funcs = funcs |
| 698 | .iter() |
| 699 | .map(|(sym, key, func)| { |
| 700 | debug_assert!(!func.is::<Option<CompilerContext>>()); |
| 701 | debug_assert!(func.is::<CompiledFunction>()); |
| 702 | let func = func.downcast_ref::<CompiledFunction>().unwrap(); |
| 703 | (sym, *key, func) |
| 704 | }) |
| 705 | .collect::<Vec<_>>(); |
| 706 | |
| 707 | let mut frame_descriptors = HashMap::new(); |
| 708 | if self.tunables.debug_guest { |
| 709 | for (_, key, func) in &funcs { |
| 710 | frame_descriptors.insert( |
| 711 | *key, |
| 712 | func.debug_slot_descriptor |
| 713 | .as_ref() |
| 714 | .map(|builder| builder.serialize()) |
| 715 | .unwrap_or_else(|| vec![]), |
| 716 | ); |
| 717 | } |
| 718 | } |
| 719 | |
| 720 | let mut breakpoint_table: Vec<(ModulePC, Range<u32>)> = Vec::new(); |
| 721 | let mut nop_units = None; |
| 722 | |
| 723 | let mut ret = Vec::with_capacity(funcs.len()); |
| 724 | for (i, (sym, _key, func)) in funcs.iter().enumerate() { |
| 725 | let (sym_id, range) = builder.append_func(&sym, func, |idx| resolve_reloc(i, idx)); |
| 726 | log::trace!("symbol id {sym_id:?} = {sym:?}"); |
| 727 | |
| 728 | if self.tunables.generate_address_map { |
| 729 | let addr = func.address_map(); |
| 730 | addrs.push(range.clone(), &addr.instructions); |
| 731 | } |
| 732 |
nothing calls this directly
no test coverage detected