diff --git a/cranelift/codegen/src/context.rs b/cranelift/codegen/src/context.rs index 4eb0c3b127a6..ef092fb8183a 100644 --- a/cranelift/codegen/src/context.rs +++ b/cranelift/codegen/src/context.rs @@ -22,7 +22,7 @@ use crate::legalize_function; use crate::legalizer::simple_legalize; use crate::licm::do_licm; use crate::loop_analysis::LoopAnalysis; -use crate::machinst::MachCompileResult; +use crate::machinst::{MachCompileResult, MachStackMap}; use crate::nan_canonicalization::do_nan_canonicalization; use crate::postopt::do_postopt; use crate::redundant_reload_remover::RedundantReloadRemover; @@ -239,10 +239,23 @@ impl Context { let mut sink = MemoryCodeSink::new(mem, relocs, traps, stack_maps); if let Some(ref result) = &self.mach_compile_result { result.buffer.emit(&mut sink); + let info = sink.info; + // New backends do not emit StackMaps through the `CodeSink` because its interface + // requires `Value`s; instead, the `StackMap` objects are directly accessible via + // `result.buffer.stack_maps()`. + for &MachStackMap { + offset_end, + ref stack_map, + .. + } in result.buffer.stack_maps() + { + stack_maps.add_stack_map(offset_end, stack_map.clone()); + } + info } else { isa.emit_function_to_memory(&self.func, &mut sink); + sink.info } - sink.info } /// Creates unwind information for the function. diff --git a/tests/all/gc.rs b/tests/all/gc.rs index 0f278cd96119..e616b2d0c8ad 100644 --- a/tests/all/gc.rs +++ b/tests/all/gc.rs @@ -24,7 +24,6 @@ impl Drop for GcOnDrop { } #[test] -#[cfg_attr(feature = "experimental_x64", ignore)] // TODO #2079 investigate. fn smoke_test_gc() -> anyhow::Result<()> { let (store, module) = ref_types_module( r#" @@ -121,7 +120,6 @@ fn wasm_dropping_refs() -> anyhow::Result<()> { } #[test] -#[cfg_attr(feature = "experimental_x64", ignore)] // TODO #2079 investigate. fn many_live_refs() -> anyhow::Result<()> { let mut wat = r#" (module @@ -375,7 +373,6 @@ fn gc_during_gc_when_passing_refs_into_wasm() -> anyhow::Result<()> { } #[test] -#[cfg_attr(feature = "experimental_x64", ignore)] // TODO #2079 investigate. fn gc_during_gc_from_many_table_gets() -> anyhow::Result<()> { let (store, module) = ref_types_module( r#"