summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/Print.cpp47
-rw-r--r--test/passes/optimize-instructions_all-features.txt4
-rw-r--r--test/typed-function-references.wast.from-wast16
-rw-r--r--test/typed-function-references.wast.fromBinary20
-rw-r--r--test/typed-function-references.wast.fromBinary.noDebugInfo20
5 files changed, 73 insertions, 34 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 33b34904e..c597028be 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -133,6 +133,33 @@ std::ostream& operator<<(std::ostream& os, SigName sigName) {
return os;
}
+// Wrapper for printing a type when we try to print the type name as much as
+// possible. For example, for a signature we will print the signature's name,
+// not its contents.
+struct TypeName {
+ Type type;
+ TypeName(Type type) : type(type) {}
+};
+
+std::ostream& operator<<(std::ostream& os, TypeName typeName) {
+ auto type = typeName.type;
+ if (type.isRef() && !type.isBasic()) {
+ os << "(ref ";
+ if (type.isNullable()) {
+ os << "null ";
+ }
+ auto heapType = type.getHeapType();
+ if (heapType.isSignature()) {
+ os << SigName(heapType.getSignature());
+ } else {
+ os << heapType;
+ }
+ os << ')';
+ return os;
+ }
+ return os << SExprType(typeName.type);
+}
+
} // anonymous namespace
// Printing "unreachable" as a instruction prefix type is not valid in wasm text
@@ -2328,11 +2355,23 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
}
if (curr.params.size() > 0) {
o << maybeSpace;
- o << ParamType(curr.params);
+ o << "(param ";
+ auto sep = "";
+ for (auto type : curr.params) {
+ o << sep << TypeName(type);
+ sep = " ";
+ }
+ o << ')';
}
if (curr.results.size() > 0) {
o << maybeSpace;
- o << ResultType(curr.results);
+ o << "(result ";
+ auto sep = "";
+ for (auto type : curr.results) {
+ o << sep << TypeName(type);
+ sep = " ";
+ }
+ o << ')';
}
o << ")";
}
@@ -2438,7 +2477,7 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
o << '(';
printMinor(o, "param ");
printLocal(i, currFunction, o);
- o << ' ' << param << ')';
+ o << ' ' << TypeName(param) << ')';
++i;
}
}
@@ -2452,7 +2491,7 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
o << '(';
printMinor(o, "local ");
printLocal(i, currFunction, o)
- << ' ' << SExprType(curr->getLocalType(i)) << ')';
+ << ' ' << TypeName(curr->getLocalType(i)) << ')';
o << maybeNewLine;
}
// Print the body.
diff --git a/test/passes/optimize-instructions_all-features.txt b/test/passes/optimize-instructions_all-features.txt
index d6c98bc0a..a093fbffa 100644
--- a/test/passes/optimize-instructions_all-features.txt
+++ b/test/passes/optimize-instructions_all-features.txt
@@ -5687,8 +5687,8 @@
)
(module
(type $i32_=>_i32 (func (param i32) (result i32)))
- (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null (func (param i32) (result i32)))) (result i32)))
- (func $call_from-param (param $f (ref null (func (param i32) (result i32)))) (result i32)
+ (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null $i32_=>_i32)) (result i32)))
+ (func $call_from-param (param $f (ref null $i32_=>_i32)) (result i32)
(unreachable)
)
)
diff --git a/test/typed-function-references.wast.from-wast b/test/typed-function-references.wast.from-wast
index c528d7125..794f3acec 100644
--- a/test/typed-function-references.wast.from-wast
+++ b/test/typed-function-references.wast.from-wast
@@ -6,11 +6,11 @@
(type $none_=>_i32 (func (result i32)))
(type $none_=>_anyref (func (result anyref)))
(type $none_=>_anyref_f32_anyref_f32 (func (result anyref f32 anyref f32)))
- (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null (func (param i32) (result i32)))) (result i32)))
- (type $none_=>_i32_ref_null[_->_anyref_f32_anyref_f32]_f64 (func (result i32 (ref null (func (result anyref f32 anyref f32))) f64)))
- (type $none_=>_ref_null[i32_i32_i32_i32_i32_->_] (func (result (ref null (func (param i32 i32 i32 i32 i32))))))
- (type $f64_=>_ref_null[_->_eqref] (func (param f64) (result (ref null (func (result eqref))))))
- (type $none_=>_ref_null[_->_ref_null[i32_i32_i32_i32_i32_->_]] (func (result (ref null (func (result (ref null (func (param i32 i32 i32 i32 i32)))))))))
+ (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null $i32_=>_i32)) (result i32)))
+ (type $none_=>_i32_ref_null[_->_anyref_f32_anyref_f32]_f64 (func (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)))
+ (type $none_=>_ref_null[i32_i32_i32_i32_i32_->_] (func (result (ref null $i32_i32_i32_i32_i32_=>_none))))
+ (type $f64_=>_ref_null[_->_eqref] (func (param f64) (result (ref null $none_=>_eqref))))
+ (type $none_=>_ref_null[_->_ref_null[i32_i32_i32_i32_i32_->_]] (func (result (ref null $none_=>_ref_null[i32_i32_i32_i32_i32_->_]))))
(func $call-ref
(call_ref
(ref.func $call-ref)
@@ -27,20 +27,20 @@
(ref.func $call-ref-more)
)
)
- (func $call_from-param (param $f (ref null (func (param i32) (result i32)))) (result i32)
+ (func $call_from-param (param $f (ref null $i32_=>_i32)) (result i32)
(call_ref
(i32.const 42)
(local.get $f)
)
)
- (func $call_from-param-null (param $f (ref null (func (param i32) (result i32)))) (result i32)
+ (func $call_from-param-null (param $f (ref null $i32_=>_i32)) (result i32)
(call_ref
(i32.const 42)
(local.get $f)
)
)
(func $call_from-local-null (result i32)
- (local $f (ref null (func (param i32) (result i32))))
+ (local $f (ref null $i32_=>_i32))
(local.set $f
(ref.func $call-ref-more)
)
diff --git a/test/typed-function-references.wast.fromBinary b/test/typed-function-references.wast.fromBinary
index 5cb2ff7c6..629f8191f 100644
--- a/test/typed-function-references.wast.fromBinary
+++ b/test/typed-function-references.wast.fromBinary
@@ -6,11 +6,11 @@
(type $i32_i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32 i32)))
(type $none_=>_i32 (func (result i32)))
(type $none_=>_anyref (func (result anyref)))
- (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null (func (param i32) (result i32)))) (result i32)))
- (type $none_=>_i32_ref_null[_->_anyref_f32_anyref_f32]_f64 (func (result i32 (ref null (func (result anyref f32 anyref f32))) f64)))
- (type $none_=>_ref_null[i32_i32_i32_i32_i32_->_] (func (result (ref null (func (param i32 i32 i32 i32 i32))))))
- (type $f64_=>_ref_null[_->_eqref] (func (param f64) (result (ref null (func (result eqref))))))
- (type $none_=>_ref_null[_->_ref_null[i32_i32_i32_i32_i32_->_]] (func (result (ref null (func (result (ref null (func (param i32 i32 i32 i32 i32)))))))))
+ (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null $i32_=>_i32)) (result i32)))
+ (type $none_=>_i32_ref_null[_->_anyref_f32_anyref_f32]_f64 (func (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)))
+ (type $none_=>_ref_null[i32_i32_i32_i32_i32_->_] (func (result (ref null $i32_i32_i32_i32_i32_=>_none))))
+ (type $f64_=>_ref_null[_->_eqref] (func (param f64) (result (ref null $none_=>_eqref))))
+ (type $none_=>_ref_null[_->_ref_null[i32_i32_i32_i32_i32_->_]] (func (result (ref null $none_=>_ref_null[i32_i32_i32_i32_i32_->_]))))
(func $call-ref
(call_ref
(ref.func $call-ref)
@@ -27,20 +27,20 @@
(ref.func $call-ref-more)
)
)
- (func $call_from-param (param $f (ref null (func (param i32) (result i32)))) (result i32)
+ (func $call_from-param (param $f (ref null $i32_=>_i32)) (result i32)
(call_ref
(i32.const 42)
(local.get $f)
)
)
- (func $call_from-param-null (param $f (ref null (func (param i32) (result i32)))) (result i32)
+ (func $call_from-param-null (param $f (ref null $i32_=>_i32)) (result i32)
(call_ref
(i32.const 42)
(local.get $f)
)
)
(func $call_from-local-null (result i32)
- (local $f (ref null (func (param i32) (result i32))))
+ (local $f (ref null $i32_=>_i32))
(local.set $f
(ref.func $call-ref-more)
)
@@ -55,12 +55,12 @@
(func $type-only-in-tuple-local
(local $x i32)
(local $1 f64)
- (local $2 (ref null (func (result anyref))))
+ (local $2 (ref null $none_=>_anyref))
(nop)
)
(func $type-only-in-tuple-block
(local $0 (i32 (ref null (func (result anyref f32 anyref f32))) f64))
- (local $1 (ref null (func (result anyref f32 anyref f32))))
+ (local $1 (ref null $none_=>_anyref_f32_anyref_f32))
(local $2 i32)
(local.set $0
(block $label$1 (result i32 (ref null (func (result anyref f32 anyref f32))) f64)
diff --git a/test/typed-function-references.wast.fromBinary.noDebugInfo b/test/typed-function-references.wast.fromBinary.noDebugInfo
index be3099efa..26586d8e8 100644
--- a/test/typed-function-references.wast.fromBinary.noDebugInfo
+++ b/test/typed-function-references.wast.fromBinary.noDebugInfo
@@ -6,11 +6,11 @@
(type $i32_i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32 i32)))
(type $none_=>_i32 (func (result i32)))
(type $none_=>_anyref (func (result anyref)))
- (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null (func (param i32) (result i32)))) (result i32)))
- (type $none_=>_i32_ref_null[_->_anyref_f32_anyref_f32]_f64 (func (result i32 (ref null (func (result anyref f32 anyref f32))) f64)))
- (type $none_=>_ref_null[i32_i32_i32_i32_i32_->_] (func (result (ref null (func (param i32 i32 i32 i32 i32))))))
- (type $f64_=>_ref_null[_->_eqref] (func (param f64) (result (ref null (func (result eqref))))))
- (type $none_=>_ref_null[_->_ref_null[i32_i32_i32_i32_i32_->_]] (func (result (ref null (func (result (ref null (func (param i32 i32 i32 i32 i32)))))))))
+ (type $ref_null[i32_->_i32]_=>_i32 (func (param (ref null $i32_=>_i32)) (result i32)))
+ (type $none_=>_i32_ref_null[_->_anyref_f32_anyref_f32]_f64 (func (result i32 (ref null $none_=>_anyref_f32_anyref_f32) f64)))
+ (type $none_=>_ref_null[i32_i32_i32_i32_i32_->_] (func (result (ref null $i32_i32_i32_i32_i32_=>_none))))
+ (type $f64_=>_ref_null[_->_eqref] (func (param f64) (result (ref null $none_=>_eqref))))
+ (type $none_=>_ref_null[_->_ref_null[i32_i32_i32_i32_i32_->_]] (func (result (ref null $none_=>_ref_null[i32_i32_i32_i32_i32_->_]))))
(func $0
(call_ref
(ref.func $0)
@@ -27,20 +27,20 @@
(ref.func $2)
)
)
- (func $3 (param $0 (ref null (func (param i32) (result i32)))) (result i32)
+ (func $3 (param $0 (ref null $i32_=>_i32)) (result i32)
(call_ref
(i32.const 42)
(local.get $0)
)
)
- (func $4 (param $0 (ref null (func (param i32) (result i32)))) (result i32)
+ (func $4 (param $0 (ref null $i32_=>_i32)) (result i32)
(call_ref
(i32.const 42)
(local.get $0)
)
)
(func $5 (result i32)
- (local $0 (ref null (func (param i32) (result i32))))
+ (local $0 (ref null $i32_=>_i32))
(local.set $0
(ref.func $2)
)
@@ -55,12 +55,12 @@
(func $7
(local $0 i32)
(local $1 f64)
- (local $2 (ref null (func (result anyref))))
+ (local $2 (ref null $none_=>_anyref))
(nop)
)
(func $8
(local $0 (i32 (ref null (func (result anyref f32 anyref f32))) f64))
- (local $1 (ref null (func (result anyref f32 anyref f32))))
+ (local $1 (ref null $none_=>_anyref_f32_anyref_f32))
(local $2 i32)
(local.set $0
(block $label$1 (result i32 (ref null (func (result anyref f32 anyref f32))) f64)