diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-08-22 19:00:43 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-13 20:39:49 +0000 | 
| commit | fe6060f10f634930ff71b7c50291ddc610da2475 (patch) | |
| tree | 1483580c790bd4d27b6500a7542b5ee00534d3cc /contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp | |
| parent | b61bce17f346d79cecfd8f195a64b10f77be43b1 (diff) | |
| parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp | 208 | 
1 files changed, 128 insertions, 80 deletions
diff --git a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp index 40f468881edd..a08c648358c0 100644 --- a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp +++ b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp @@ -39,8 +39,8 @@ using namespace object;  void WasmSymbol::print(raw_ostream &Out) const {    Out << "Name=" << Info.Name -      << ", Kind=" << toString(wasm::WasmSymbolType(Info.Kind)) -      << ", Flags=" << Info.Flags; +      << ", Kind=" << toString(wasm::WasmSymbolType(Info.Kind)) << ", Flags=0x" +      << Twine::utohexstr(Info.Flags);    if (!isTypeData()) {      Out << ", ElemIndex=" << Info.ElementIndex;    } else if (isDefined()) { @@ -208,7 +208,7 @@ static Error readInitExpr(wasm::WasmInitExpr &Expr,  static wasm::WasmLimits readLimits(WasmObjectFile::ReadContext &Ctx) {    wasm::WasmLimits Result;    Result.Flags = readVaruint32(Ctx); -  Result.Initial = readVaruint64(Ctx); +  Result.Minimum = readVaruint64(Ctx);    if (Result.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX)      Result.Maximum = readVaruint64(Ctx);    return Result; @@ -316,8 +316,8 @@ Error WasmObjectFile::parseSection(WasmSection &Sec) {      return parseTableSection(Ctx);    case wasm::WASM_SEC_MEMORY:      return parseMemorySection(Ctx); -  case wasm::WASM_SEC_EVENT: -    return parseEventSection(Ctx); +  case wasm::WASM_SEC_TAG: +    return parseTagSection(Ctx);    case wasm::WASM_SEC_GLOBAL:      return parseGlobalSection(Ctx);    case wasm::WASM_SEC_EXPORT: @@ -462,7 +462,7 @@ Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) {        for (uint32_t I = 0; I < Count; I++) {          DataSegments[I].Data.Name = readString(Ctx);          DataSegments[I].Data.Alignment = readVaruint32(Ctx); -        DataSegments[I].Data.LinkerFlags = readVaruint32(Ctx); +        DataSegments[I].Data.LinkingFlags = readVaruint32(Ctx);        }        break;      } @@ -507,19 +507,19 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {    std::vector<wasm::WasmImport *> ImportedGlobals;    std::vector<wasm::WasmImport *> ImportedFunctions; -  std::vector<wasm::WasmImport *> ImportedEvents; +  std::vector<wasm::WasmImport *> ImportedTags;    std::vector<wasm::WasmImport *> ImportedTables;    ImportedGlobals.reserve(Imports.size());    ImportedFunctions.reserve(Imports.size()); -  ImportedEvents.reserve(Imports.size()); +  ImportedTags.reserve(Imports.size());    ImportedTables.reserve(Imports.size());    for (auto &I : Imports) {      if (I.Kind == wasm::WASM_EXTERNAL_FUNCTION)        ImportedFunctions.emplace_back(&I);      else if (I.Kind == wasm::WASM_EXTERNAL_GLOBAL)        ImportedGlobals.emplace_back(&I); -    else if (I.Kind == wasm::WASM_EXTERNAL_EVENT) -      ImportedEvents.emplace_back(&I); +    else if (I.Kind == wasm::WASM_EXTERNAL_TAG) +      ImportedTags.emplace_back(&I);      else if (I.Kind == wasm::WASM_EXTERNAL_TABLE)        ImportedTables.emplace_back(&I);    } @@ -529,7 +529,7 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {      const wasm::WasmSignature *Signature = nullptr;      const wasm::WasmGlobalType *GlobalType = nullptr;      const wasm::WasmTableType *TableType = nullptr; -    const wasm::WasmEventType *EventType = nullptr; +    const wasm::WasmTagType *TagType = nullptr;      Info.Kind = readUint8(Ctx);      Info.Flags = readVaruint32(Ctx); @@ -598,8 +598,8 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {      case wasm::WASM_SYMBOL_TYPE_TABLE:        Info.ElementIndex = readVaruint32(Ctx); -      if (!isValidTableIndex(Info.ElementIndex) || -          IsDefined != isDefinedTableIndex(Info.ElementIndex)) +      if (!isValidTableNumber(Info.ElementIndex) || +          IsDefined != isDefinedTableNumber(Info.ElementIndex))          return make_error<GenericBinaryError>("invalid table symbol index",                                                object_error::parse_failed);        if (!IsDefined && (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) == @@ -608,8 +608,8 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {                                                object_error::parse_failed);        if (IsDefined) {          Info.Name = readString(Ctx); -        unsigned TableIndex = Info.ElementIndex - NumImportedTables; -        wasm::WasmTable &Table = Tables[TableIndex]; +        unsigned TableNumber = Info.ElementIndex - NumImportedTables; +        wasm::WasmTable &Table = Tables[TableNumber];          TableType = &Table.Type;          if (Table.SymbolName.empty())            Table.SymbolName = Info.Name; @@ -637,9 +637,12 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {                                                  object_error::parse_failed);          auto Offset = readVaruint64(Ctx);          auto Size = readVaruint64(Ctx); -        if (Offset + Size > DataSegments[Index].Data.Content.size()) -          return make_error<GenericBinaryError>("invalid data symbol offset", -                                                object_error::parse_failed); +        size_t SegmentSize = DataSegments[Index].Data.Content.size(); +        if (Offset > SegmentSize) +          return make_error<GenericBinaryError>( +              "invalid data symbol offset: `" + Info.Name + "` (offset: " + +                  Twine(Offset) + " segment size: " + Twine(SegmentSize) + ")", +              object_error::parse_failed);          Info.DataRef = wasm::WasmDataReference{Index, Offset, Size};        }        break; @@ -657,11 +660,11 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {        break;      } -    case wasm::WASM_SYMBOL_TYPE_EVENT: { +    case wasm::WASM_SYMBOL_TYPE_TAG: {        Info.ElementIndex = readVaruint32(Ctx); -      if (!isValidEventIndex(Info.ElementIndex) || -          IsDefined != isDefinedEventIndex(Info.ElementIndex)) -        return make_error<GenericBinaryError>("invalid event symbol index", +      if (!isValidTagIndex(Info.ElementIndex) || +          IsDefined != isDefinedTagIndex(Info.ElementIndex)) +        return make_error<GenericBinaryError>("invalid tag symbol index",                                                object_error::parse_failed);        if (!IsDefined && (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) ==                              wasm::WASM_SYMBOL_BINDING_WEAK) @@ -669,23 +672,23 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {                                                object_error::parse_failed);        if (IsDefined) {          Info.Name = readString(Ctx); -        unsigned EventIndex = Info.ElementIndex - NumImportedEvents; -        wasm::WasmEvent &Event = Events[EventIndex]; -        Signature = &Signatures[Event.Type.SigIndex]; -        EventType = &Event.Type; -        if (Event.SymbolName.empty()) -          Event.SymbolName = Info.Name; +        unsigned TagIndex = Info.ElementIndex - NumImportedTags; +        wasm::WasmTag &Tag = Tags[TagIndex]; +        Signature = &Signatures[Tag.Type.SigIndex]; +        TagType = &Tag.Type; +        if (Tag.SymbolName.empty()) +          Tag.SymbolName = Info.Name;        } else { -        wasm::WasmImport &Import = *ImportedEvents[Info.ElementIndex]; +        wasm::WasmImport &Import = *ImportedTags[Info.ElementIndex];          if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) {            Info.Name = readString(Ctx);            Info.ImportName = Import.Field;          } else {            Info.Name = Import.Field;          } -        EventType = &Import.Event; -        Signature = &Signatures[EventType->SigIndex]; +        TagType = &Import.Tag; +        Signature = &Signatures[TagType->SigIndex];          if (!Import.Module.empty()) {            Info.ImportModule = Import.Module;          } @@ -707,7 +710,7 @@ Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {                                              object_error::parse_failed);      LinkingData.SymbolTable.emplace_back(Info);      Symbols.emplace_back(LinkingData.SymbolTable.back(), GlobalType, TableType, -                         EventType, Signature); +                         TagType, Signature);      LLVM_DEBUG(dbgs() << "Adding symbol: " << Symbols.back() << "\n");    } @@ -867,6 +870,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {      case wasm::R_WASM_TABLE_INDEX_I32:      case wasm::R_WASM_TABLE_INDEX_I64:      case wasm::R_WASM_TABLE_INDEX_REL_SLEB: +    case wasm::R_WASM_TABLE_INDEX_REL_SLEB64:        if (!isValidFunctionSymbol(Reloc.Index))          return make_error<GenericBinaryError>(              "invalid relocation function index", object_error::parse_failed); @@ -895,9 +899,9 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {          return make_error<GenericBinaryError>("invalid relocation global index",                                                object_error::parse_failed);        break; -    case wasm::R_WASM_EVENT_INDEX_LEB: -      if (!isValidEventSymbol(Reloc.Index)) -        return make_error<GenericBinaryError>("invalid relocation event index", +    case wasm::R_WASM_TAG_INDEX_LEB: +      if (!isValidTagSymbol(Reloc.Index)) +        return make_error<GenericBinaryError>("invalid relocation tag index",                                                object_error::parse_failed);        break;      case wasm::R_WASM_MEMORY_ADDR_LEB: @@ -905,6 +909,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {      case wasm::R_WASM_MEMORY_ADDR_I32:      case wasm::R_WASM_MEMORY_ADDR_REL_SLEB:      case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB: +    case wasm::R_WASM_MEMORY_ADDR_LOCREL_I32:        if (!isValidDataSymbol(Reloc.Index))          return make_error<GenericBinaryError>("invalid relocation data index",                                                object_error::parse_failed); @@ -914,6 +919,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {      case wasm::R_WASM_MEMORY_ADDR_SLEB64:      case wasm::R_WASM_MEMORY_ADDR_I64:      case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64: +    case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64:        if (!isValidDataSymbol(Reloc.Index))          return make_error<GenericBinaryError>("invalid relocation data index",                                                object_error::parse_failed); @@ -953,6 +959,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {        Size = 10;      if (Reloc.Type == wasm::R_WASM_TABLE_INDEX_I32 ||          Reloc.Type == wasm::R_WASM_MEMORY_ADDR_I32 || +        Reloc.Type == wasm::R_WASM_MEMORY_ADDR_LOCREL_I32 ||          Reloc.Type == wasm::R_WASM_SECTION_OFFSET_I32 ||          Reloc.Type == wasm::R_WASM_FUNCTION_OFFSET_I32 ||          Reloc.Type == wasm::R_WASM_GLOBAL_INDEX_I32) @@ -1058,10 +1065,10 @@ Error WasmObjectFile::parseImportSection(ReadContext &Ctx) {                                                object_error::parse_failed);        break;      } -    case wasm::WASM_EXTERNAL_EVENT: -      NumImportedEvents++; -      Im.Event.Attribute = readVarint32(Ctx); -      Im.Event.SigIndex = readVarint32(Ctx); +    case wasm::WASM_EXTERNAL_TAG: +      NumImportedTags++; +      Im.Tag.Attribute = readUint8(Ctx); +      Im.Tag.SigIndex = readVarint32(Ctx);        break;      default:        return make_error<GenericBinaryError>("unexpected import kind", @@ -1130,20 +1137,20 @@ Error WasmObjectFile::parseMemorySection(ReadContext &Ctx) {    return Error::success();  } -Error WasmObjectFile::parseEventSection(ReadContext &Ctx) { -  EventSection = Sections.size(); -  uint32_t Count = readVarint32(Ctx); -  Events.reserve(Count); +Error WasmObjectFile::parseTagSection(ReadContext &Ctx) { +  TagSection = Sections.size(); +  uint32_t Count = readVaruint32(Ctx); +  Tags.reserve(Count);    while (Count--) { -    wasm::WasmEvent Event; -    Event.Index = NumImportedEvents + Events.size(); -    Event.Type.Attribute = readVaruint32(Ctx); -    Event.Type.SigIndex = readVarint32(Ctx); -    Events.push_back(Event); +    wasm::WasmTag Tag; +    Tag.Index = NumImportedTags + Tags.size(); +    Tag.Type.Attribute = readUint8(Ctx); +    Tag.Type.SigIndex = readVaruint32(Ctx); +    Tags.push_back(Tag);    }    if (Ctx.Ptr != Ctx.End) -    return make_error<GenericBinaryError>("event section ended prematurely", +    return make_error<GenericBinaryError>("tag section ended prematurely",                                            object_error::parse_failed);    return Error::success();  } @@ -1188,9 +1195,9 @@ Error WasmObjectFile::parseExportSection(ReadContext &Ctx) {          return make_error<GenericBinaryError>("invalid global export",                                                object_error::parse_failed);        break; -    case wasm::WASM_EXTERNAL_EVENT: -      if (!isValidEventIndex(Ex.Index)) -        return make_error<GenericBinaryError>("invalid event export", +    case wasm::WASM_EXTERNAL_TAG: +      if (!isValidTagIndex(Ex.Index)) +        return make_error<GenericBinaryError>("invalid tag export",                                                object_error::parse_failed);        break;      case wasm::WASM_EXTERNAL_MEMORY: @@ -1220,7 +1227,7 @@ bool WasmObjectFile::isValidGlobalIndex(uint32_t Index) const {    return Index < NumImportedGlobals + Globals.size();  } -bool WasmObjectFile::isValidTableIndex(uint32_t Index) const { +bool WasmObjectFile::isValidTableNumber(uint32_t Index) const {    return Index < NumImportedTables + Tables.size();  } @@ -1228,16 +1235,16 @@ bool WasmObjectFile::isDefinedGlobalIndex(uint32_t Index) const {    return Index >= NumImportedGlobals && isValidGlobalIndex(Index);  } -bool WasmObjectFile::isDefinedTableIndex(uint32_t Index) const { -  return Index >= NumImportedTables && isValidTableIndex(Index); +bool WasmObjectFile::isDefinedTableNumber(uint32_t Index) const { +  return Index >= NumImportedTables && isValidTableNumber(Index);  } -bool WasmObjectFile::isValidEventIndex(uint32_t Index) const { -  return Index < NumImportedEvents + Events.size(); +bool WasmObjectFile::isValidTagIndex(uint32_t Index) const { +  return Index < NumImportedTags + Tags.size();  } -bool WasmObjectFile::isDefinedEventIndex(uint32_t Index) const { -  return Index >= NumImportedEvents && isValidEventIndex(Index); +bool WasmObjectFile::isDefinedTagIndex(uint32_t Index) const { +  return Index >= NumImportedTags && isValidTagIndex(Index);  }  bool WasmObjectFile::isValidFunctionSymbol(uint32_t Index) const { @@ -1252,8 +1259,8 @@ bool WasmObjectFile::isValidGlobalSymbol(uint32_t Index) const {    return Index < Symbols.size() && Symbols[Index].isTypeGlobal();  } -bool WasmObjectFile::isValidEventSymbol(uint32_t Index) const { -  return Index < Symbols.size() && Symbols[Index].isTypeEvent(); +bool WasmObjectFile::isValidTagSymbol(uint32_t Index) const { +  return Index < Symbols.size() && Symbols[Index].isTypeTag();  }  bool WasmObjectFile::isValidDataSymbol(uint32_t Index) const { @@ -1280,9 +1287,9 @@ wasm::WasmGlobal &WasmObjectFile::getDefinedGlobal(uint32_t Index) {    return Globals[Index - NumImportedGlobals];  } -wasm::WasmEvent &WasmObjectFile::getDefinedEvent(uint32_t Index) { -  assert(isDefinedEventIndex(Index)); -  return Events[Index - NumImportedEvents]; +wasm::WasmTag &WasmObjectFile::getDefinedTag(uint32_t Index) { +  assert(isDefinedTagIndex(Index)); +  return Tags[Index - NumImportedTags];  }  Error WasmObjectFile::parseStartSection(ReadContext &Ctx) { @@ -1340,13 +1347,54 @@ Error WasmObjectFile::parseElemSection(ReadContext &Ctx) {    ElemSegments.reserve(Count);    while (Count--) {      wasm::WasmElemSegment Segment; -    Segment.TableIndex = readVaruint32(Ctx); -    if (Segment.TableIndex != 0) { -      return make_error<GenericBinaryError>("invalid TableIndex", +    Segment.Flags = readVaruint32(Ctx); + +    uint32_t SupportedFlags = wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER | +                              wasm::WASM_ELEM_SEGMENT_IS_PASSIVE | +                              wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS; +    if (Segment.Flags & ~SupportedFlags) +      return make_error<GenericBinaryError>( +          "Unsupported flags for element segment", object_error::parse_failed); + +    if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER) +      Segment.TableNumber = readVaruint32(Ctx); +    else +      Segment.TableNumber = 0; +    if (!isValidTableNumber(Segment.TableNumber)) +      return make_error<GenericBinaryError>("invalid TableNumber",                                              object_error::parse_failed); + +    if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_IS_PASSIVE) { +      Segment.Offset.Opcode = wasm::WASM_OPCODE_I32_CONST; +      Segment.Offset.Value.Int32 = 0; +    } else { +      if (Error Err = readInitExpr(Segment.Offset, Ctx)) +        return Err;      } -    if (Error Err = readInitExpr(Segment.Offset, Ctx)) -      return Err; + +    if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_MASK_HAS_ELEM_KIND) { +      Segment.ElemKind = readUint8(Ctx); +      if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS) { +        if (Segment.ElemKind != uint8_t(wasm::ValType::FUNCREF) && +            Segment.ElemKind != uint8_t(wasm::ValType::EXTERNREF)) { +          return make_error<GenericBinaryError>("invalid reference type", +                                                object_error::parse_failed); +        } +      } else { +        if (Segment.ElemKind != 0) +          return make_error<GenericBinaryError>("invalid elemtype", +                                                object_error::parse_failed); +        Segment.ElemKind = uint8_t(wasm::ValType::FUNCREF); +      } +    } else { +      Segment.ElemKind = uint8_t(wasm::ValType::FUNCREF); +    } + +    if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS) +      return make_error<GenericBinaryError>( +          "elem segment init expressions not yet implemented", +          object_error::parse_failed); +      uint32_t NumElems = readVaruint32(Ctx);      while (NumElems--) {        Segment.Functions.push_back(readVaruint32(Ctx)); @@ -1388,7 +1436,7 @@ Error WasmObjectFile::parseDataSection(ReadContext &Ctx) {      // The rest of these Data fields are set later, when reading in the linking      // metadata section.      Segment.Data.Alignment = 0; -    Segment.Data.LinkerFlags = 0; +    Segment.Data.LinkingFlags = 0;      Segment.Data.Comdat = UINT32_MAX;      Segment.SectionOffset = Ctx.Ptr - Ctx.Start;      Ctx.Ptr += Size; @@ -1468,7 +1516,7 @@ uint64_t WasmObjectFile::getWasmSymbolValue(const WasmSymbol &Sym) const {    switch (Sym.Info.Kind) {    case wasm::WASM_SYMBOL_TYPE_FUNCTION:    case wasm::WASM_SYMBOL_TYPE_GLOBAL: -  case wasm::WASM_SYMBOL_TYPE_EVENT: +  case wasm::WASM_SYMBOL_TYPE_TAG:    case wasm::WASM_SYMBOL_TYPE_TABLE:      return Sym.Info.ElementIndex;    case wasm::WASM_SYMBOL_TYPE_DATA: { @@ -1517,7 +1565,7 @@ WasmObjectFile::getSymbolType(DataRefImpl Symb) const {      return SymbolRef::ST_Data;    case wasm::WASM_SYMBOL_TYPE_SECTION:      return SymbolRef::ST_Debug; -  case wasm::WASM_SYMBOL_TYPE_EVENT: +  case wasm::WASM_SYMBOL_TYPE_TAG:      return SymbolRef::ST_Other;    case wasm::WASM_SYMBOL_TYPE_TABLE:      return SymbolRef::ST_Other; @@ -1553,8 +1601,8 @@ uint32_t WasmObjectFile::getSymbolSectionIdImpl(const WasmSymbol &Sym) const {      return DataSection;    case wasm::WASM_SYMBOL_TYPE_SECTION:      return Sym.Info.ElementIndex; -  case wasm::WASM_SYMBOL_TYPE_EVENT: -    return EventSection; +  case wasm::WASM_SYMBOL_TYPE_TAG: +    return TagSection;    case wasm::WASM_SYMBOL_TYPE_TABLE:      return TableSection;    default: @@ -1576,7 +1624,7 @@ Expected<StringRef> WasmObjectFile::getSectionName(DataRefImpl Sec) const {      ECase(TABLE);      ECase(MEMORY);      ECase(GLOBAL); -    ECase(EVENT); +    ECase(TAG);      ECase(EXPORT);      ECase(START);      ECase(ELEM); @@ -1775,8 +1823,8 @@ int WasmSectionOrderChecker::getSectionOrder(unsigned ID,      return WASM_SEC_ORDER_DATA;    case wasm::WASM_SEC_DATACOUNT:      return WASM_SEC_ORDER_DATACOUNT; -  case wasm::WASM_SEC_EVENT: -    return WASM_SEC_ORDER_EVENT; +  case wasm::WASM_SEC_TAG: +    return WASM_SEC_ORDER_TAG;    default:      return WASM_SEC_ORDER_NONE;    } @@ -1798,9 +1846,9 @@ int WasmSectionOrderChecker::DisallowedPredecessors          // WASM_SEC_ORDER_TABLE          {WASM_SEC_ORDER_TABLE, WASM_SEC_ORDER_MEMORY},          // WASM_SEC_ORDER_MEMORY -        {WASM_SEC_ORDER_MEMORY, WASM_SEC_ORDER_EVENT}, -        // WASM_SEC_ORDER_EVENT -        {WASM_SEC_ORDER_EVENT, WASM_SEC_ORDER_GLOBAL}, +        {WASM_SEC_ORDER_MEMORY, WASM_SEC_ORDER_TAG}, +        // WASM_SEC_ORDER_TAG +        {WASM_SEC_ORDER_TAG, WASM_SEC_ORDER_GLOBAL},          // WASM_SEC_ORDER_GLOBAL          {WASM_SEC_ORDER_GLOBAL, WASM_SEC_ORDER_EXPORT},          // WASM_SEC_ORDER_EXPORT  | 
