diff options
-rw-r--r-- | src/passes/Print.cpp | 47 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.txt | 4 | ||||
-rw-r--r-- | test/typed-function-references.wast.from-wast | 16 | ||||
-rw-r--r-- | test/typed-function-references.wast.fromBinary | 20 | ||||
-rw-r--r-- | test/typed-function-references.wast.fromBinary.noDebugInfo | 20 |
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) |