diff options
-rw-r--r-- | src/tools/wasm-fuzz-types.cpp | 17 | ||||
-rw-r--r-- | test/lit/fuzz-types/isorecursive.test | 46 |
2 files changed, 41 insertions, 22 deletions
diff --git a/src/tools/wasm-fuzz-types.cpp b/src/tools/wasm-fuzz-types.cpp index 4b1f2800e..352a8a5fb 100644 --- a/src/tools/wasm-fuzz-types.cpp +++ b/src/tools/wasm-fuzz-types.cpp @@ -88,8 +88,22 @@ void Fuzzer::printTypes(const std::vector<HeapType>& types) { }; IndexedTypeNameGenerator<FatalTypeNameGenerator> print(types); std::unordered_map<HeapType, size_t> seen; + std::optional<RecGroup> currRecGroup; + auto inRecGroup = [&]() { return currRecGroup && currRecGroup->size() > 1; }; for (size_t i = 0; i < types.size(); ++i) { auto type = types[i]; + if (!type.isBasic() && type.getRecGroup() != currRecGroup) { + if (inRecGroup()) { + std::cout << ")\n"; + } + currRecGroup = type.getRecGroup(); + if (inRecGroup()) { + std::cout << "(rec\n"; + } + } + if (inRecGroup()) { + std::cout << ' '; + } std::cout << "(type $" << i << ' '; if (type.isBasic()) { std::cout << print(type) << ")\n"; @@ -103,6 +117,9 @@ void Fuzzer::printTypes(const std::vector<HeapType>& types) { } std::cout << ")\n"; } + if (inRecGroup()) { + std::cout << ")\n"; + } } void Fuzzer::checkSubtypes( diff --git a/test/lit/fuzz-types/isorecursive.test b/test/lit/fuzz-types/isorecursive.test index 751f8c2a7..1425962d6 100644 --- a/test/lit/fuzz-types/isorecursive.test +++ b/test/lit/fuzz-types/isorecursive.test @@ -1,24 +1,26 @@ ;; RUN: wasm-fuzz-types --hybrid -v --seed=0 | filecheck %s -;; CHECK: Running with seed 0 -;; CHECK-NEXT: Built 20 types: -;; CHECK-NEXT: (type $0 (struct_subtype data)) -;; CHECK-NEXT: (type $1 (func_subtype (param i31ref) (result (ref extern)) func)) -;; CHECK-NEXT: (type $2 (array_subtype (mut (rtt 0 extern)) data)) -;; CHECK-NEXT: (type $3 (array_subtype (mut (rtt 0 extern)) $2)) -;; CHECK-NEXT: (type $4 (array_subtype (mut (rtt 0 extern)) $2)) -;; CHECK-NEXT: (type $5 (array_subtype (mut (rtt 0 extern)) $3)) -;; CHECK-NEXT: (type $6 (array_subtype (mut (rtt 0 extern)) $3)) -;; CHECK-NEXT: (type $7 (struct_subtype (field (mut (ref $8))) $0)) -;; CHECK-NEXT: (type $8 (struct_subtype (field i16 (mut i32) (mut i16)) $0)) -;; CHECK-NEXT: (type $9 (array_subtype (mut (rtt 0 extern)) $6)) -;; CHECK-NEXT: (type $10 (struct_subtype $0)) -;; CHECK-NEXT: (type $11 (array_subtype (mut (rtt 0 extern)) $2)) -;; CHECK-NEXT: (type $12 (struct_subtype (field (mut i8) (rtt $0)) $0)) -;; CHECK-NEXT: (type $13 (array_subtype (mut (rtt 0 extern)) $6)) -;; CHECK-NEXT: (type $14 (struct_subtype (field funcref f64 (mut (rtt $10)) (ref null $15) i8 (ref null $7)) $10)) -;; CHECK-NEXT: (type $15 (func_subtype (param i31ref) (result (ref extern)) $1)) -;; CHECK-NEXT: (type $16 (array_subtype (mut (rtt 0 extern)) $2)) -;; CHECK-NEXT: (type $17 (struct_subtype (field funcref f64 (mut (rtt $10)) (ref null $15) i8 (ref null $7)) $14)) -;; CHECK-NEXT: (type $18 (struct_subtype (field (mut i8) (rtt $0)) $12)) -;; CHECK-NEXT: (type $19 (func_subtype (param i31ref) (result (ref extern)) $15)) +;; CHECK: (rec +;; CHECK-NEXT: (type $0 (struct_subtype data)) +;; CHECK-NEXT: (type $1 (func_subtype (param i31ref) (result (ref extern)) func)) +;; CHECK-NEXT: (type $2 (array_subtype (mut (rtt 0 extern)) data)) +;; CHECK-NEXT: (type $3 (array_subtype (mut (rtt 0 extern)) $2)) +;; CHECK-NEXT: (type $4 (array_subtype (mut (rtt 0 extern)) $2)) +;; CHECK-NEXT: (type $5 (array_subtype (mut (rtt 0 extern)) $3)) +;; CHECK-NEXT: (type $6 (array_subtype (mut (rtt 0 extern)) $3)) +;; CHECK-NEXT: (type $7 (struct_subtype (field (mut (ref $8))) $0)) +;; CHECK-NEXT: (type $8 (struct_subtype (field i16 (mut i32) (mut i16)) $0)) +;; CHECK-NEXT: (type $9 (array_subtype (mut (rtt 0 extern)) $6)) +;; CHECK-NEXT: (type $10 (struct_subtype $0)) +;; CHECK-NEXT: (type $11 (array_subtype (mut (rtt 0 extern)) $2)) +;; CHECK-NEXT: (type $12 (struct_subtype (field (mut i8) (rtt $0)) $0)) +;; CHECK-NEXT: (type $13 (array_subtype (mut (rtt 0 extern)) $6)) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (rec +;; CHECK-NEXT: (type $14 (struct_subtype (field funcref f64 (mut (rtt $10)) (ref null $15) i8 (ref null $7)) $10)) +;; CHECK-NEXT: (type $15 (func_subtype (param i31ref) (result (ref extern)) $1)) +;; CHECK-NEXT: (type $16 (array_subtype (mut (rtt 0 extern)) $2)) +;; CHECK-NEXT: (type $17 (struct_subtype (field funcref f64 (mut (rtt $10)) (ref null $15) i8 (ref null $7)) $14)) +;; CHECK-NEXT: (type $18 (struct_subtype (field (mut i8) (rtt $0)) $12)) + (type $19 (func_subtype (param i31ref) (result (ref extern)) $15)) +) |