Skip to content

Commit a17f4f4

Browse files
committed
wip: disable all the instructions we think will need special shared handling
1 parent 5947f92 commit a17f4f4

File tree

1 file changed

+69
-13
lines changed

1 file changed

+69
-13
lines changed

crates/wasm-smith/src/core/code_builder.rs

+69-13
Original file line numberDiff line numberDiff line change
@@ -1660,8 +1660,8 @@ fn block(
16601660
}
16611661

16621662
#[inline]
1663-
fn try_table_valid(module: &Module, _: &mut CodeBuilder) -> bool {
1664-
module.config.exceptions_enabled
1663+
fn try_table_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
1664+
module.config.exceptions_enabled && !builder.shared
16651665
}
16661666

16671667
fn try_table(
@@ -1983,6 +1983,7 @@ fn call_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
19831983
.functions
19841984
.keys()
19851985
.any(|func_ty| builder.types_on_stack(module, &func_ty.params))
1986+
&& !builder.shared
19861987
}
19871988

19881989
fn call(
@@ -2019,6 +2020,9 @@ fn call_ref_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
20192020
if module.config.disallow_traps && funcref.nullable {
20202021
return false;
20212022
}
2023+
if builder.shared {
2024+
return false;
2025+
}
20222026
match funcref.heap_type {
20232027
HeapType::Concrete(idx) => {
20242028
let ty = builder.allocs.operands.pop().unwrap();
@@ -2072,6 +2076,9 @@ fn call_indirect_valid_impl(
20722076
// `call_indirect` instructions if we want to avoid traps.
20732077
return false;
20742078
}
2079+
if builder.shared {
2080+
return false;
2081+
}
20752082
let can_call32 = builder.type_on_stack(module, ValType::I32)
20762083
&& builder.allocs.table32_with_funcref.len() > 0;
20772084
let can_call64 = builder.type_on_stack(module, ValType::I64)
@@ -2130,6 +2137,9 @@ fn return_call_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
21302137
if !module.config.tail_call_enabled {
21312138
return false;
21322139
}
2140+
if builder.shared {
2141+
return false;
2142+
}
21332143

21342144
builder.allocs.functions.keys().any(|func_ty| {
21352145
builder.types_on_stack(module, &func_ty.params)
@@ -2167,6 +2177,9 @@ fn return_call_ref_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
21672177
if !module.config.gc_enabled {
21682178
return false;
21692179
}
2180+
if builder.shared {
2181+
return false;
2182+
}
21702183

21712184
let ref_ty = match builder.concrete_funcref_on_stack(module) {
21722185
None => return false,
@@ -2255,6 +2268,7 @@ fn throw_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
22552268
.tags
22562269
.keys()
22572270
.any(|k| builder.types_on_stack(module, k))
2271+
&& !builder.shared
22582272
}
22592273

22602274
fn throw(
@@ -2282,7 +2296,9 @@ fn throw(
22822296

22832297
#[inline]
22842298
fn throw_ref_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2285-
module.config.exceptions_enabled && builder.types_on_stack(module, &[ValType::EXNREF])
2299+
module.config.exceptions_enabled
2300+
&& builder.types_on_stack(module, &[ValType::EXNREF])
2301+
&& !builder.shared
22862302
}
22872303

22882304
fn throw_ref(
@@ -2765,8 +2781,8 @@ fn local_tee(
27652781
}
27662782

27672783
#[inline]
2768-
fn global_get_valid(module: &Module, _: &mut CodeBuilder) -> bool {
2769-
module.globals.len() > 0
2784+
fn global_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2785+
module.globals.len() > 0 && !builder.shared
27702786
}
27712787

27722788
fn global_get(
@@ -2792,6 +2808,7 @@ fn global_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
27922808
.mutable_globals
27932809
.iter()
27942810
.any(|(ty, _)| builder.type_on_stack(module, *ty))
2811+
&& !builder.shared
27952812
}
27962813

27972814
fn global_set(
@@ -5589,7 +5606,7 @@ fn table_fill_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
55895606
module.config.reference_types_enabled
55905607
&& module.config.bulk_memory_enabled
55915608
&& !module.config.disallow_traps // Non-trapping table fill generation not yet implemented
5592-
&& table_fill_candidates(module, builder).next().is_some()
5609+
&& table_fill_candidates(module, builder).next().is_some() && !builder.shared
55935610
}
55945611

55955612
fn table_fill_candidates<'a>(
@@ -5629,7 +5646,7 @@ fn table_fill(
56295646
fn table_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
56305647
module.config.reference_types_enabled
56315648
&& !module.config.disallow_traps // Non-trapping table.set generation not yet implemented
5632-
&& table_set_candidates(module, builder).next().is_some()
5649+
&& table_set_candidates(module, builder).next().is_some() && !builder.shared
56335650
}
56345651

56355652
fn table_set_candidates<'a>(
@@ -5668,6 +5685,9 @@ fn table_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
56685685
if module.config.disallow_traps {
56695686
return false;
56705687
}
5688+
if builder.shared {
5689+
return false;
5690+
}
56715691
if builder.type_on_stack(module, ValType::I32) && builder.allocs.table32.len() > 0 {
56725692
return true;
56735693
}
@@ -5698,8 +5718,8 @@ fn table_get(
56985718
}
56995719

57005720
#[inline]
5701-
fn table_size_valid(module: &Module, _: &mut CodeBuilder) -> bool {
5702-
module.config.reference_types_enabled && module.tables.len() > 0
5721+
fn table_size_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5722+
module.config.reference_types_enabled && module.tables.len() > 0 && !builder.shared
57035723
}
57045724

57055725
fn table_size(
@@ -5717,7 +5737,9 @@ fn table_size(
57175737

57185738
#[inline]
57195739
fn table_grow_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5720-
module.config.reference_types_enabled && table_grow_candidates(module, builder).next().is_some()
5740+
module.config.reference_types_enabled
5741+
&& table_grow_candidates(module, builder).next().is_some()
5742+
&& !builder.shared
57215743
}
57225744

57235745
fn table_grow_candidates<'a>(
@@ -5757,6 +5779,9 @@ fn table_copy_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
57575779
if module.config.disallow_traps {
57585780
return false;
57595781
}
5782+
if builder.shared {
5783+
return false;
5784+
}
57605785
if builder.types_on_stack(module, &[ValType::I64, ValType::I64, ValType::I64]) {
57615786
return builder.allocs.table_copy_64_to_64.len() > 0;
57625787
}
@@ -5802,6 +5827,9 @@ fn table_init_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
58025827
if module.config.disallow_traps {
58035828
return false;
58045829
}
5830+
if builder.shared {
5831+
return false;
5832+
}
58055833
if builder.allocs.table32_init.len() > 0
58065834
&& builder.types_on_stack(module, &[ValType::I32, ValType::I32, ValType::I32])
58075835
{
@@ -5858,6 +5886,7 @@ fn struct_new_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
58585886
.iter()
58595887
.copied()
58605888
.any(|i| builder.field_types_on_stack(module, &module.ty(i).unwrap_struct().fields))
5889+
&& !builder.shared
58615890
}
58625891

58635892
fn struct_new(
@@ -5894,7 +5923,7 @@ fn struct_new(
58945923
}
58955924

58965925
#[inline]
5897-
fn struct_new_default_valid(module: &Module, _builder: &mut CodeBuilder) -> bool {
5926+
fn struct_new_default_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
58985927
module.config.gc_enabled
58995928
&& module.struct_types.iter().copied().any(|i| {
59005929
module
@@ -5904,6 +5933,7 @@ fn struct_new_default_valid(module: &Module, _builder: &mut CodeBuilder) -> bool
59045933
.iter()
59055934
.all(|f| f.element_type.is_defaultable())
59065935
})
5936+
&& !builder.shared
59075937
}
59085938

59095939
fn struct_new_default(
@@ -5955,6 +5985,7 @@ fn struct_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
59555985
module.config.gc_enabled
59565986
&& !module.config.disallow_traps
59575987
&& builder.non_empty_struct_ref_on_stack(module, !module.config.disallow_traps)
5988+
&& !builder.shared
59585989
}
59595990

59605991
fn struct_get(
@@ -5995,6 +6026,9 @@ fn struct_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
59956026
if !module.config.gc_enabled {
59966027
return false;
59976028
}
6029+
if builder.shared {
6030+
return false;
6031+
}
59986032
match builder.concrete_struct_ref_type_on_stack_at(module, 1) {
59996033
None => return false,
60006034
Some((true, _, _)) if module.config.disallow_traps => return false,
@@ -6051,6 +6085,7 @@ fn array_new_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
60516085
.array_types
60526086
.iter()
60536087
.any(|i| builder.field_type_on_stack_at(module, 1, module.ty(*i).unwrap_array().0))
6088+
&& !builder.shared
60546089
}
60556090

60566091
fn array_new(
@@ -6092,6 +6127,7 @@ fn array_new_fixed_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
60926127
.array_types
60936128
.iter()
60946129
.any(|i| builder.field_type_on_stack(module, module.ty(*i).unwrap_array().0))
6130+
&& !builder.shared
60956131
}
60966132

60976133
fn array_new_fixed(
@@ -6151,6 +6187,7 @@ fn array_new_default_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
61516187
.array_types
61526188
.iter()
61536189
.any(|i| module.ty(*i).unwrap_array().0.element_type.is_defaultable())
6190+
&& !builder.shared
61546191
}
61556192

61566193
fn array_new_default(
@@ -6200,7 +6237,7 @@ fn array_new_data_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
62006237
&& module.array_types.iter().any(|i| {
62016238
let ty = module.ty(*i).unwrap_array().0.element_type.unpack();
62026239
ty.is_numeric() | ty.is_vector()
6203-
})
6240+
}) && !builder.shared
62046241
}
62056242

62066243
fn array_new_data(
@@ -6264,6 +6301,7 @@ fn array_new_elem_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
62646301
.array_types
62656302
.iter()
62666303
.any(|i| module_has_elem_segment_of_array_type(module, module.ty(*i).unwrap_array()))
6304+
&& !builder.shared
62676305
}
62686306

62696307
fn array_new_elem(
@@ -6329,6 +6367,7 @@ fn array_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
63296367
&& !module.config.disallow_traps // TODO: add support for disallowing traps
63306368
&& builder.type_on_stack(module, ValType::I32)
63316369
&& builder.concrete_array_ref_type_on_stack_at(module, 1).is_some()
6370+
&& !builder.shared
63326371
}
63336372

63346373
fn array_get(
@@ -6363,6 +6402,9 @@ fn array_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
63636402
{
63646403
return false;
63656404
}
6405+
if builder.shared {
6406+
return false;
6407+
}
63666408
match builder.concrete_array_ref_type_on_stack_at(module, 2) {
63676409
None => false,
63686410
Some((_nullable, _idx, array_ty)) => {
@@ -6386,7 +6428,9 @@ fn array_set(
63866428

63876429
#[inline]
63886430
fn array_len_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6389-
module.config.gc_enabled && builder.type_on_stack(module, ValType::Ref(RefType::ARRAYREF))
6431+
module.config.gc_enabled
6432+
&& builder.type_on_stack(module, ValType::Ref(RefType::ARRAYREF))
6433+
&& !builder.shared
63906434
}
63916435

63926436
fn array_len(
@@ -6411,6 +6455,9 @@ fn array_fill_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
64116455
{
64126456
return false;
64136457
}
6458+
if builder.shared {
6459+
return false;
6460+
}
64146461
match builder.concrete_array_ref_type_on_stack_at(module, 3) {
64156462
None => return false,
64166463
Some((_, _, array_ty)) => {
@@ -6444,6 +6491,9 @@ fn array_copy_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
64446491
{
64456492
return false;
64466493
}
6494+
if builder.shared {
6495+
return false;
6496+
}
64476497
let x = match builder.concrete_array_ref_type_on_stack_at(module, 4) {
64486498
None => return false,
64496499
Some((_, _, x)) => x,
@@ -6493,6 +6543,9 @@ fn array_init_data_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
64936543
{
64946544
return false;
64956545
}
6546+
if builder.shared {
6547+
return false;
6548+
}
64966549
match builder.concrete_array_ref_type_on_stack_at(module, 3) {
64976550
None => return false,
64986551
Some((_, _, ty)) => {
@@ -6533,6 +6586,9 @@ fn array_init_elem_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
65336586
{
65346587
return false;
65356588
}
6589+
if builder.shared {
6590+
return false;
6591+
}
65366592
match builder.concrete_array_ref_type_on_stack_at(module, 3) {
65376593
None => return false,
65386594
Some((_, _, array_ty)) => {

0 commit comments

Comments
 (0)