summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/wasm-fuzz-types.cpp17
-rw-r--r--test/lit/fuzz-types/isorecursive.test46
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))
+)