Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions crates/test-macros/src/wasmtime_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -253,21 +253,17 @@ fn expand(test_config: &TestConfig, func: Fn) -> Result<TokenStream> {
(quote! {}, quote! {})
};
let func_name = &func.sig.ident;
let expect = match &func.sig.output {
ReturnType::Default => quote! {},
ReturnType::Type(..) => quote! { .expect("test is expected to pass") },
match &func.sig.output {
ReturnType::Default => {
return Err(syn::Error::new(func_name.span(), "Expected `Restult<()>`"))
}
ReturnType::Type(..) => {}
};
let test_name = Ident::new(
&format!("{}_{}", strategy_name.to_lowercase(), func_name),
func_name.span(),
);

let should_panic = if strategy.should_fail(&test_config.flags) {
quote!(#[should_panic])
} else {
quote!()
};

let test_config = format!("wasmtime_test_util::wast::{:?}", test_config.flags)
.parse::<proc_macro2::TokenStream>()
.unwrap();
Expand All @@ -276,7 +272,6 @@ fn expand(test_config: &TestConfig, func: Fn) -> Result<TokenStream> {
let tok = quote! {
#test_attr
#target
#should_panic
#(#attrs)*
#asyncness fn #test_name() {
let _ = env_logger::try_init();
Expand All @@ -293,7 +288,12 @@ fn expand(test_config: &TestConfig, func: Fn) -> Result<TokenStream> {
collector: wasmtime_test_util::wast::Collector::Auto,
},
);
#func_name(&mut config) #await_ #expect
let result = #func_name(&mut config) #await_;
if wasmtime_test_util::wast::Compiler::#strategy_ident.should_fail(&#test_config) {
assert!(result.is_err());
} else {
result.unwrap();
}
}
};

Expand Down
269 changes: 184 additions & 85 deletions crates/test-util/src/wast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -341,14 +341,27 @@ impl Compiler {
Compiler::CraneliftNative => config.legacy_exceptions(),

Compiler::Winch => {
config.gc()
let unsupported_base = config.gc()
|| config.tail_call()
|| config.function_references()
|| config.gc()
|| config.relaxed_simd()
|| config.gc_types()
|| config.exceptions()
|| config.legacy_exceptions()
|| config.legacy_exceptions();

if cfg!(target_arch = "x86_64") {
return unsupported_base;
}

if cfg!(target_arch = "aarch64") {
return unsupported_base
|| config.simd()
|| config.wide_arithmetic()
|| config.threads();
}

false
}

Compiler::CraneliftPulley => config.threads() || config.legacy_exceptions(),
Expand All @@ -365,9 +378,7 @@ impl Compiler {
|| cfg!(target_arch = "riscv64")
|| cfg!(target_arch = "s390x")
}
Compiler::Winch => {
cfg!(target_arch = "x86_64")
}
Compiler::Winch => cfg!(target_arch = "x86_64") || cfg!(target_arch = "aarch64"),
Compiler::CraneliftPulley => true,
}
}
Expand All @@ -392,6 +403,51 @@ impl WastTest {
spec_proposal_from_path(&self.path)
}

/// Returns true for tests that should be ignored (not run) for
/// the given config.

/// The infrastructure for `.wast` tests is designed to enable the
/// execution of tests at all times, however, while compiler
/// backends are in partial development state, it becomes harder
/// to guarantee particular tests will run to completion and
/// return a recoverable error, in some cases tests might segfault
/// making it challenging to assert a failure status.
/// It's recommended to avoid ignoring tests as much as possible, instead
/// it's recommended to add tests to `WastTest::should_fail`.
pub fn ignore(&self, config: &WastConfig) -> bool {
if config.compiler == Compiler::Winch {
if cfg!(target_arch = "aarch64") {
let unsupported = [
// Missing stack checks (#8321)
"spec_testsuite/call.wast",
"spec_testsuite/fac.wast",
"spec_testsuite/skip-stack-guard-page.wast",
"misc_testsuite/stack_overflow.wast",
// Fails intermittently
"misc_testsuite/table_copy_on_imported_tables.wast",
// Segfault
"spec_testsuite/conversions.wast",
"spec_testsuite/func.wast",
"spec_testsuite/float_exprs.wast",
"spec_testsuite/int_exprs.wast",
"spec_testsuite/left-to-right.wast",
"spec_testsuite/i32.wast",
"spec_testsuite/traps.wast",
"spec_testsuite/unreachable.wast",
"spec_testsuite/unreached-valid.wast",
"misc_testsuite/component-model/fused.wast",
"misc_testsuite/component-model/strings.wast",
"misc_testsuite/winch/select.wast",
"misc_testsuite/sink-float-but-dont-trap.wast",
"misc_testsuite/issue4840.wast",
];

return unsupported.iter().any(|part| self.path.ends_with(part));
}
}
false
}

/// Returns whether this test should fail under the specified extra
/// configuration.
pub fn should_fail(&self, config: &WastConfig) -> bool {
Expand Down Expand Up @@ -430,13 +486,13 @@ impl WastTest {
return true;
}

// Disable spec tests for proposals that Winch does not implement yet.
// Disable spec tests per target for proposals that Winch does not implement yet.
if config.compiler == Compiler::Winch {
// Common list for tests that fail in all targets supported by Winch.
let unsupported = [
// externref/reference-types related
"component-model/modules.wast",
"extended-const/elem.wast",
"extended-const/global.wast",
"misc_testsuite/component-model/modules.wast",
"misc_testsuite/externref-id-function.wast",
"misc_testsuite/externref-segment.wast",
"misc_testsuite/externref-segments.wast",
Expand All @@ -449,10 +505,7 @@ impl WastTest {
"misc_testsuite/simple_ref_is_null.wast",
"misc_testsuite/table_grow_with_funcref.wast",
"spec_testsuite/br_table.wast",
"spec_testsuite/data-invalid.wast",
"spec_testsuite/elem.wast",
"spec_testsuite/global.wast",
"spec_testsuite/linking.wast",
"spec_testsuite/ref_func.wast",
"spec_testsuite/ref_is_null.wast",
"spec_testsuite/ref_null.wast",
Expand All @@ -462,93 +515,139 @@ impl WastTest {
"spec_testsuite/table_grow.wast",
"spec_testsuite/table_set.wast",
"spec_testsuite/table_size.wast",
// simd-related failures
"misc_testsuite/simd/canonicalize-nan.wast",
"spec_testsuite/elem.wast",
"spec_testsuite/linking.wast",
];

if unsupported.iter().any(|part| self.path.ends_with(part)) {
return true;
}

// SIMD on Winch requires AVX instructions.
#[cfg(target_arch = "aarch64")]
{
let unsupported = [
// Externref / GC related.
"misc_testsuite/winch/table_get.wast",
"misc_testsuite/winch/table_set.wast",
"misc_testsuite/winch/table_fill.wast",
// Known bugs that don't cause segfaults.
"spec_testsuite/call_indirect.wast",
"spec_testsuite/f32_cmp.wast",
"spec_testsuite/f64_cmp.wast",
"spec_testsuite/func_ptrs.wast",
"spec_testsuite/i64.wast",
"spec_testsuite/if.wast",
"spec_testsuite/imports.wast",
"spec_testsuite/local_set.wast",
"spec_testsuite/local_tee.wast",
"spec_testsuite/loop.wast",
"spec_testsuite/table_copy.wast",
"spec_testsuite/table_init.wast",
"misc_testsuite/custom-page-sizes/custom-page-sizes.wast",
"misc_testsuite/winch/table_grow.wast",
"spec_testsuite/proposals/custom-page-sizes/custom-page-sizes.wast",
"misc_testsuite/memory64/more-than-4gb.wast",
"misc_testsuite/call_indirect.wast",
];

if unsupported.iter().any(|part| self.path.ends_with(part)) {
return true;
}
}

#[cfg(target_arch = "x86_64")]
if !(std::is_x86_feature_detected!("avx") && std::is_x86_feature_detected!("avx2")) {
{
let unsupported = [
"annotations/simd_lane.wast",
"memory64/simd.wast",
"misc_testsuite/int-to-float-splat.wast",
"misc_testsuite/issue6562.wast",
"misc_testsuite/simd/almost-extmul.wast",
"misc_testsuite/simd/cvt-from-uint.wast",
"misc_testsuite/simd/issue_3327_bnot_lowering.wast",
"misc_testsuite/simd/issue6725-no-egraph-panic.wast",
"misc_testsuite/simd/replace-lane-preserve.wast",
"misc_testsuite/simd/spillslot-size-fuzzbug.wast",
"misc_testsuite/winch/issue-10331.wast",
"misc_testsuite/winch/replace_lane.wast",
"spec_testsuite/simd_align.wast",
"spec_testsuite/simd_boolean.wast",
"spec_testsuite/simd_conversions.wast",
"spec_testsuite/simd_f32x4.wast",
"spec_testsuite/simd_f32x4_arith.wast",
"spec_testsuite/simd_f32x4_cmp.wast",
"spec_testsuite/simd_f32x4_pmin_pmax.wast",
"spec_testsuite/simd_f32x4_rounding.wast",
"spec_testsuite/simd_f64x2.wast",
"spec_testsuite/simd_f64x2_arith.wast",
"spec_testsuite/simd_f64x2_cmp.wast",
"spec_testsuite/simd_f64x2_pmin_pmax.wast",
"spec_testsuite/simd_f64x2_rounding.wast",
"spec_testsuite/simd_i16x8_cmp.wast",
"spec_testsuite/simd_i32x4_cmp.wast",
"spec_testsuite/simd_i64x2_arith2.wast",
"spec_testsuite/simd_i64x2_cmp.wast",
"spec_testsuite/simd_i8x16_arith2.wast",
"spec_testsuite/simd_i8x16_cmp.wast",
"spec_testsuite/simd_int_to_int_extend.wast",
"spec_testsuite/simd_load.wast",
"spec_testsuite/simd_load_extend.wast",
"spec_testsuite/simd_load_splat.wast",
"spec_testsuite/simd_load_zero.wast",
"spec_testsuite/simd_splat.wast",
"spec_testsuite/simd_store16_lane.wast",
"spec_testsuite/simd_store32_lane.wast",
"spec_testsuite/simd_store64_lane.wast",
"spec_testsuite/simd_store8_lane.wast",
"spec_testsuite/simd_load16_lane.wast",
"spec_testsuite/simd_load32_lane.wast",
"spec_testsuite/simd_load64_lane.wast",
"spec_testsuite/simd_load8_lane.wast",
"spec_testsuite/simd_bitwise.wast",
"misc_testsuite/simd/load_splat_out_of_bounds.wast",
"misc_testsuite/simd/unaligned-load.wast",
"multi-memory/simd_memory-multi.wast",
"misc_testsuite/simd/issue4807.wast",
"spec_testsuite/simd_const.wast",
"spec_testsuite/simd_i8x16_sat_arith.wast",
"spec_testsuite/simd_i64x2_arith.wast",
"spec_testsuite/simd_i16x8_arith.wast",
"spec_testsuite/simd_i16x8_arith2.wast",
"spec_testsuite/simd_i16x8_q15mulr_sat_s.wast",
"spec_testsuite/simd_i16x8_sat_arith.wast",
"spec_testsuite/simd_i32x4_arith.wast",
"spec_testsuite/simd_i32x4_dot_i16x8.wast",
"spec_testsuite/simd_i32x4_trunc_sat_f32x4.wast",
"spec_testsuite/simd_i32x4_trunc_sat_f64x2.wast",
"spec_testsuite/simd_i8x16_arith.wast",
"spec_testsuite/simd_bit_shift.wast",
"spec_testsuite/simd_lane.wast",
"spec_testsuite/simd_i16x8_extmul_i8x16.wast",
"spec_testsuite/simd_i32x4_extmul_i16x8.wast",
"spec_testsuite/simd_i64x2_extmul_i32x4.wast",
"spec_testsuite/simd_i16x8_extadd_pairwise_i8x16.wast",
"spec_testsuite/simd_i32x4_extadd_pairwise_i16x8.wast",
"spec_testsuite/simd_i32x4_arith2.wast",
// externref/reference-types related
// simd-related failures
"misc_testsuite/simd/canonicalize-nan.wast",
];

if unsupported.iter().any(|part| self.path.ends_with(part)) {
return true;
}

// SIMD on Winch requires AVX instructions.
#[cfg(target_arch = "x86_64")]
if !(std::is_x86_feature_detected!("avx") && std::is_x86_feature_detected!("avx2"))
{
let unsupported = [
"annotations/simd_lane.wast",
"memory64/simd.wast",
"misc_testsuite/int-to-float-splat.wast",
"misc_testsuite/issue6562.wast",
"misc_testsuite/simd/almost-extmul.wast",
"misc_testsuite/simd/cvt-from-uint.wast",
"misc_testsuite/simd/issue_3327_bnot_lowering.wast",
"misc_testsuite/simd/issue6725-no-egraph-panic.wast",
"misc_testsuite/simd/replace-lane-preserve.wast",
"misc_testsuite/simd/spillslot-size-fuzzbug.wast",
"misc_testsuite/winch/issue-10331.wast",
"misc_testsuite/winch/replace_lane.wast",
"spec_testsuite/simd_align.wast",
"spec_testsuite/simd_boolean.wast",
"spec_testsuite/simd_conversions.wast",
"spec_testsuite/simd_f32x4.wast",
"spec_testsuite/simd_f32x4_arith.wast",
"spec_testsuite/simd_f32x4_cmp.wast",
"spec_testsuite/simd_f32x4_pmin_pmax.wast",
"spec_testsuite/simd_f32x4_rounding.wast",
"spec_testsuite/simd_f64x2.wast",
"spec_testsuite/simd_f64x2_arith.wast",
"spec_testsuite/simd_f64x2_cmp.wast",
"spec_testsuite/simd_f64x2_pmin_pmax.wast",
"spec_testsuite/simd_f64x2_rounding.wast",
"spec_testsuite/simd_i16x8_cmp.wast",
"spec_testsuite/simd_i32x4_cmp.wast",
"spec_testsuite/simd_i64x2_arith2.wast",
"spec_testsuite/simd_i64x2_cmp.wast",
"spec_testsuite/simd_i8x16_arith2.wast",
"spec_testsuite/simd_i8x16_cmp.wast",
"spec_testsuite/simd_int_to_int_extend.wast",
"spec_testsuite/simd_load.wast",
"spec_testsuite/simd_load_extend.wast",
"spec_testsuite/simd_load_splat.wast",
"spec_testsuite/simd_load_zero.wast",
"spec_testsuite/simd_splat.wast",
"spec_testsuite/simd_store16_lane.wast",
"spec_testsuite/simd_store32_lane.wast",
"spec_testsuite/simd_store64_lane.wast",
"spec_testsuite/simd_store8_lane.wast",
"spec_testsuite/simd_load16_lane.wast",
"spec_testsuite/simd_load32_lane.wast",
"spec_testsuite/simd_load64_lane.wast",
"spec_testsuite/simd_load8_lane.wast",
"spec_testsuite/simd_bitwise.wast",
"misc_testsuite/simd/load_splat_out_of_bounds.wast",
"misc_testsuite/simd/unaligned-load.wast",
"multi-memory/simd_memory-multi.wast",
"misc_testsuite/simd/issue4807.wast",
"spec_testsuite/simd_const.wast",
"spec_testsuite/simd_i8x16_sat_arith.wast",
"spec_testsuite/simd_i64x2_arith.wast",
"spec_testsuite/simd_i16x8_arith.wast",
"spec_testsuite/simd_i16x8_arith2.wast",
"spec_testsuite/simd_i16x8_q15mulr_sat_s.wast",
"spec_testsuite/simd_i16x8_sat_arith.wast",
"spec_testsuite/simd_i32x4_arith.wast",
"spec_testsuite/simd_i32x4_dot_i16x8.wast",
"spec_testsuite/simd_i32x4_trunc_sat_f32x4.wast",
"spec_testsuite/simd_i32x4_trunc_sat_f64x2.wast",
"spec_testsuite/simd_i8x16_arith.wast",
"spec_testsuite/simd_bit_shift.wast",
"spec_testsuite/simd_lane.wast",
"spec_testsuite/simd_i16x8_extmul_i8x16.wast",
"spec_testsuite/simd_i32x4_extmul_i16x8.wast",
"spec_testsuite/simd_i64x2_extmul_i32x4.wast",
"spec_testsuite/simd_i16x8_extadd_pairwise_i8x16.wast",
"spec_testsuite/simd_i32x4_extadd_pairwise_i16x8.wast",
"spec_testsuite/simd_i32x4_arith2.wast",
];

if unsupported.iter().any(|part| self.path.ends_with(part)) {
return true;
}
}
}
}

Expand Down
Loading