From 6759371b5239efa3daa9d988455abdd14a8b18ca Mon Sep 17 00:00:00 2001 From: Thomas Lively <7121787+tlively@users.noreply.github.com> Date: Thu, 4 Aug 2022 17:05:54 -0700 Subject: Remove RTTs (#4848) RTTs were removed from the GC spec and if they are added back in in the future, they will be heap types rather than value types as in our implementation. Updating our implementation to have RTTs be heap types would have been more work than deleting them for questionable benefit since we don't know how long it will be before they are specced again. --- src/wasm/wasm-s-parser.cpp | 127 ++------------------------------------------- 1 file changed, 3 insertions(+), 124 deletions(-) (limited to 'src/wasm/wasm-s-parser.cpp') diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 38ec788ba..f13091c91 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -54,7 +54,7 @@ namespace wasm { static Name STRUCT("struct"), FIELD("field"), ARRAY("array"), FUNC_SUBTYPE("func_subtype"), STRUCT_SUBTYPE("struct_subtype"), ARRAY_SUBTYPE("array_subtype"), EXTENDS("extends"), REC("rec"), I8("i8"), - I16("i16"), RTT("rtt"), DECLARE("declare"), ITEM("item"), OFFSET("offset"); + I16("i16"), DECLARE("declare"), ITEM("item"), OFFSET("offset"); static Address getAddress(const Element* s) { return atoll(s->c_str()); } @@ -752,46 +752,11 @@ void SExpressionWasmBuilder::preParseHeapTypes(Element& module) { } }; - auto parseRttType = [&](Element& elem) -> Type { - // '(' 'rtt' depth? typeidx ')' - uint32_t depth; - Element* idx; - switch (elem.size()) { - default: - throw ParseException( - "unexpected number of rtt parameters", elem.line, elem.col); - case 2: - depth = Rtt::NoDepth; - idx = elem[1]; - break; - case 3: - if (!String::isNumber(elem[1]->c_str())) { - throw ParseException( - "invalid rtt depth", elem[1]->line, elem[1]->col); - } - depth = atoi(elem[1]->c_str()); - idx = elem[2]; - break; - } - if (idx->dollared()) { - HeapType type = builder[typeIndices[idx->c_str()]]; - return builder.getTempRttType(Rtt(depth, type)); - } else if (String::isNumber(idx->c_str())) { - size_t index = atoi(idx->c_str()); - if (index < numTypes) { - return builder.getTempRttType(Rtt(depth, builder[index])); - } - } - throw ParseException("invalid type index", idx->line, idx->col); - }; - auto parseValType = [&](Element& elem) { if (elem.isStr()) { return stringToType(elem.c_str()); } else if (*elem[0] == REF) { return parseRefType(elem); - } else if (*elem[0] == RTT) { - return parseRttType(elem); } else { throw ParseException("unknown valtype kind", elem[0]->line, elem[0]->col); } @@ -1281,18 +1246,6 @@ Type SExpressionWasmBuilder::elementToType(Element& s) { } return Type(parseHeapType(*s[i]), nullable); } - if (elementStartsWith(s, RTT)) { - // It's an RTT, something like (rtt N $typename) or just (rtt $typename) - // if there is no depth. - if (s[1]->dollared()) { - auto heapType = parseHeapType(*s[1]); - return Type(Rtt(heapType)); - } else { - auto depth = atoi(s[1]->str().c_str()); - auto heapType = parseHeapType(*s[2]); - return Type(Rtt(depth, heapType)); - } - } // It's a tuple. std::vector types; for (size_t i = 0; i < s.size(); ++i) { @@ -2702,24 +2655,12 @@ Expression* SExpressionWasmBuilder::makeI31Get(Element& s, bool signed_) { return ret; } -Expression* SExpressionWasmBuilder::makeRefTest(Element& s) { - auto* ref = parseExpression(*s[1]); - auto* rtt = parseExpression(*s[2]); - return Builder(wasm).makeRefTest(ref, rtt); -} - Expression* SExpressionWasmBuilder::makeRefTestStatic(Element& s) { auto heapType = parseHeapType(*s[1]); auto* ref = parseExpression(*s[2]); return Builder(wasm).makeRefTest(ref, heapType); } -Expression* SExpressionWasmBuilder::makeRefCast(Element& s) { - auto* ref = parseExpression(*s[1]); - auto* rtt = parseExpression(*s[2]); - return Builder(wasm).makeRefCast(ref, rtt); -} - Expression* SExpressionWasmBuilder::makeRefCastStatic(Element& s) { auto heapType = parseHeapType(*s[1]); auto* ref = parseExpression(*s[2]); @@ -2735,12 +2676,8 @@ Expression* SExpressionWasmBuilder::makeRefCastNopStatic(Element& s) { Expression* SExpressionWasmBuilder::makeBrOn(Element& s, BrOnOp op) { auto name = getLabel(*s[1]); auto* ref = parseExpression(*s[2]); - Expression* rtt = nullptr; - if (op == BrOnCast || op == BrOnCastFail) { - rtt = parseExpression(*s[3]); - } return ValidatingBuilder(wasm, s.line, s.col) - .validateAndMakeBrOn(op, name, ref, rtt); + .validateAndMakeBrOn(op, name, ref); } Expression* SExpressionWasmBuilder::makeBrOnStatic(Element& s, BrOnOp op) { @@ -2750,39 +2687,6 @@ Expression* SExpressionWasmBuilder::makeBrOnStatic(Element& s, BrOnOp op) { return Builder(wasm).makeBrOn(op, name, ref, heapType); } -Expression* SExpressionWasmBuilder::makeRttCanon(Element& s) { - return Builder(wasm).makeRttCanon(parseHeapType(*s[1])); -} - -Expression* SExpressionWasmBuilder::makeRttSub(Element& s) { - auto heapType = parseHeapType(*s[1]); - auto parent = parseExpression(*s[2]); - return Builder(wasm).makeRttSub(heapType, parent); -} - -Expression* SExpressionWasmBuilder::makeRttFreshSub(Element& s) { - auto heapType = parseHeapType(*s[1]); - auto parent = parseExpression(*s[2]); - return Builder(wasm).makeRttFreshSub(heapType, parent); -} - -Expression* SExpressionWasmBuilder::makeStructNew(Element& s, bool default_) { - auto heapType = parseHeapType(*s[1]); - auto numOperands = s.size() - 3; - if (default_ && numOperands > 0) { - throw ParseException( - "arguments provided for struct.new_with_default", s.line, s.col); - } - std::vector operands; - operands.resize(numOperands); - for (Index i = 0; i < numOperands; i++) { - operands[i] = parseExpression(*s[i + 2]); - } - auto* rtt = parseExpression(*s[s.size() - 1]); - validateHeapTypeUsingChild(rtt, heapType, s); - return Builder(wasm).makeStructNew(rtt, operands); -} - Expression* SExpressionWasmBuilder::makeStructNewStatic(Element& s, bool default_) { auto heapType = parseHeapType(*s[1]); @@ -2841,19 +2745,6 @@ Expression* SExpressionWasmBuilder::makeStructSet(Element& s) { return Builder(wasm).makeStructSet(index, ref, value); } -Expression* SExpressionWasmBuilder::makeArrayNew(Element& s, bool default_) { - auto heapType = parseHeapType(*s[1]); - Expression* init = nullptr; - size_t i = 2; - if (!default_) { - init = parseExpression(*s[i++]); - } - auto* size = parseExpression(*s[i++]); - auto* rtt = parseExpression(*s[i++]); - validateHeapTypeUsingChild(rtt, heapType, s); - return Builder(wasm).makeArrayNew(rtt, size, init); -} - Expression* SExpressionWasmBuilder::makeArrayNewStatic(Element& s, bool default_) { auto heapType = parseHeapType(*s[1]); @@ -2866,18 +2757,6 @@ Expression* SExpressionWasmBuilder::makeArrayNewStatic(Element& s, return Builder(wasm).makeArrayNew(heapType, size, init); } -Expression* SExpressionWasmBuilder::makeArrayInit(Element& s) { - auto heapType = parseHeapType(*s[1]); - size_t i = 2; - std::vector values; - while (i < s.size() - 1) { - values.push_back(parseExpression(*s[i++])); - } - auto* rtt = parseExpression(*s[i++]); - validateHeapTypeUsingChild(rtt, heapType, s); - return Builder(wasm).makeArrayInit(rtt, values); -} - Expression* SExpressionWasmBuilder::makeArrayInitStatic(Element& s) { auto heapType = parseHeapType(*s[1]); size_t i = 2; @@ -3853,7 +3732,7 @@ void SExpressionWasmBuilder::validateHeapTypeUsingChild(Expression* child, if (child->type == Type::unreachable) { return; } - if ((!child->type.isRef() && !child->type.isRtt()) || + if (!child->type.isRef() || !HeapType::isSubType(child->type.getHeapType(), heapType)) { throw ParseException("bad heap type: expected " + heapType.toString() + " but found " + child->type.toString(), -- cgit v1.2.3