MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / append_code

Method append_code

crates/cranelift/src/compiler.rs:675–835  ·  view source on GitHub ↗
(
        &self,
        obj: &mut Object<'static>,
        funcs: &[(String, FuncKey, Box<dyn Any + Send + Sync>)],
        resolve_reloc: &dyn Fn(usize, FuncKey) -> usize,
    )

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 15

clif_to_env_stack_mapsFunction · 0.85
clif_to_env_frame_tablesFunction · 0.85
clif_to_env_breakpointsFunction · 0.85
OkFunction · 0.85
append_funcMethod · 0.80
user_stack_mapsMethod · 0.80
call_sitesMethod · 0.80
append_paddingMethod · 0.80
sort_by_keyMethod · 0.80
add_breakpoint_patchMethod · 0.80
as_bytesMethod · 0.80

Tested by

no test coverage detected