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
4 changes: 1 addition & 3 deletions scripts/test/shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,7 @@ def is_exe(fpath):
NODEJS = os.getenv('NODE', which('node') or which('nodejs'))
MOZJS = which('mozjs') or which('spidermonkey')

# TODO: Remove the specific v8 version once we implement structref and can run
# on recent v8.
V8 = which('v8-10.8.104') or which('v8') or which('d8')
V8 = which('v8') or which('d8')

BINARYEN_INSTALL_DIR = os.path.dirname(options.binaryen_bin)
WASM_OPT = [os.path.join(options.binaryen_bin, 'wasm-opt')]
Expand Down
28 changes: 10 additions & 18 deletions src/tools/execution-results.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,25 +143,17 @@ struct ExecutionResults {
}

bool areEqual(Literal a, Literal b) {
// We allow nulls to have different types (as they compare equal regardless)
// but anything else must have an identical type.
// We cannot do this in nominal typing, however, as different modules will
// have different types in general. We could perhaps compare the entire
// graph structurally TODO
if (getTypeSystem() != TypeSystem::Nominal) {
if (a.type != b.type && !(a.isNull() && b.isNull())) {
std::cout << "types not identical! " << a << " != " << b << '\n';
return false;
}
}
if (a.type.isRef()) {
// Don't compare references - only their types. There are several issues
// here that we can't fully handle, see
// https://github.com/WebAssembly/binaryen/issues/3378, but the core issue
// is that we are comparing results between two separate wasm modules (and
// a separate instance of each) - we can't really identify an identical
// reference between such things. We can only compare things structurally,
// for which we compare the types.
// Don't compare references. There are several issues here that we can't
// fully handle, see https://github.com/WebAssembly/binaryen/issues/3378,
// but the core issue is that since we optimize assuming a closed world,
// the types and structure of GC data can arbitrarily change after
// optimizations, even in ways that are externally visible from outside
// the module.
//
// TODO: Once we support optimizing under some form of open-world
// assumption, we should be able to check that the types and/or structure
// of GC data passed out of the module does not change.
return true;
}
if (a != b) {
Expand Down
22 changes: 22 additions & 0 deletions test/lit/exec/no-compare-refs.wast
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
;; NOTE: Assertions have been generated by update_lit_checks.py --output=fuzz-exec and should not be edited.

;; RUN: wasm-opt %s --hybrid -all --signature-pruning --fuzz-exec -q -o /dev/null 2>&1 | filecheck %s

(module
(type $f (func (param i32)))

(func $no-use-param (type $f) (param i32)
(unreachable)
)

;; The type of the reference this function returns will change as a result of
;; signature pruning. The fuzzer should not complain about this.
;; CHECK: [fuzz-exec] calling return-ref
;; CHECK-NEXT: [fuzz-exec] note result: return-ref => funcref
(func "return-ref" (result funcref)
(ref.func $no-use-param)
)
)
;; CHECK: [fuzz-exec] calling return-ref
;; CHECK-NEXT: [fuzz-exec] note result: return-ref => funcref
;; CHECK-NEXT: [fuzz-exec] comparing return-ref