Merge pull request #2410 from cfallin/x64-gc
Fix and enable GC on new x64 backend.
This commit is contained in:
@@ -22,7 +22,7 @@ use crate::legalize_function;
|
|||||||
use crate::legalizer::simple_legalize;
|
use crate::legalizer::simple_legalize;
|
||||||
use crate::licm::do_licm;
|
use crate::licm::do_licm;
|
||||||
use crate::loop_analysis::LoopAnalysis;
|
use crate::loop_analysis::LoopAnalysis;
|
||||||
use crate::machinst::MachCompileResult;
|
use crate::machinst::{MachCompileResult, MachStackMap};
|
||||||
use crate::nan_canonicalization::do_nan_canonicalization;
|
use crate::nan_canonicalization::do_nan_canonicalization;
|
||||||
use crate::postopt::do_postopt;
|
use crate::postopt::do_postopt;
|
||||||
use crate::redundant_reload_remover::RedundantReloadRemover;
|
use crate::redundant_reload_remover::RedundantReloadRemover;
|
||||||
@@ -239,10 +239,23 @@ impl Context {
|
|||||||
let mut sink = MemoryCodeSink::new(mem, relocs, traps, stack_maps);
|
let mut sink = MemoryCodeSink::new(mem, relocs, traps, stack_maps);
|
||||||
if let Some(ref result) = &self.mach_compile_result {
|
if let Some(ref result) = &self.mach_compile_result {
|
||||||
result.buffer.emit(&mut sink);
|
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 {
|
} else {
|
||||||
isa.emit_function_to_memory(&self.func, &mut sink);
|
isa.emit_function_to_memory(&self.func, &mut sink);
|
||||||
|
sink.info
|
||||||
}
|
}
|
||||||
sink.info
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates unwind information for the function.
|
/// Creates unwind information for the function.
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ impl Drop for GcOnDrop {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature = "experimental_x64", ignore)] // TODO #2079 investigate.
|
|
||||||
fn smoke_test_gc() -> anyhow::Result<()> {
|
fn smoke_test_gc() -> anyhow::Result<()> {
|
||||||
let (store, module) = ref_types_module(
|
let (store, module) = ref_types_module(
|
||||||
r#"
|
r#"
|
||||||
@@ -121,7 +120,6 @@ fn wasm_dropping_refs() -> anyhow::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature = "experimental_x64", ignore)] // TODO #2079 investigate.
|
|
||||||
fn many_live_refs() -> anyhow::Result<()> {
|
fn many_live_refs() -> anyhow::Result<()> {
|
||||||
let mut wat = r#"
|
let mut wat = r#"
|
||||||
(module
|
(module
|
||||||
@@ -375,7 +373,6 @@ fn gc_during_gc_when_passing_refs_into_wasm() -> anyhow::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature = "experimental_x64", ignore)] // TODO #2079 investigate.
|
|
||||||
fn gc_during_gc_from_many_table_gets() -> anyhow::Result<()> {
|
fn gc_during_gc_from_many_table_gets() -> anyhow::Result<()> {
|
||||||
let (store, module) = ref_types_module(
|
let (store, module) = ref_types_module(
|
||||||
r#"
|
r#"
|
||||||
|
|||||||
Reference in New Issue
Block a user