Lines Matching full:wasm

1 //===- WasmObjectFile.cpp - Wasm object file implementation ---------------===//
15 #include "llvm/BinaryFormat/Wasm.h"
20 #include "llvm/Object/Wasm.h"
32 #define DEBUG_TYPE "wasm-object"
39 << ", Kind=" << toString(wasm::WasmSymbolType(Info.Kind)) << ", Flags=0x"
42 case wasm::WASM_SYMBOL_BINDING_GLOBAL: Out << "global"; break;
43 case wasm::WASM_SYMBOL_BINDING_LOCAL: Out << "local"; break;
44 case wasm::WASM_SYMBOL_BINDING_WEAK: Out << "weak"; break;
175 static wasm::ValType parseValType(WasmObjectFile::ReadContext &Ctx,
180 case wasm::WASM_TYPE_I32:
181 case wasm::WASM_TYPE_I64:
182 case wasm::WASM_TYPE_F32:
183 case wasm::WASM_TYPE_F64:
184 case wasm::WASM_TYPE_V128:
185 case wasm::WASM_TYPE_FUNCREF:
186 case wasm::WASM_TYPE_EXTERNREF:
187 case wasm::WASM_TYPE_EXNREF:
188 return wasm::ValType(Code);
190 if (Code == wasm::WASM_TYPE_NULLABLE || Code == wasm::WASM_TYPE_NONNULLABLE) {
193 return wasm::ValType(wasm::ValType::OTHERREF);
196 static Error readInitExpr(wasm::WasmInitExpr &Expr,
203 case wasm::WASM_OPCODE_I32_CONST:
206 case wasm::WASM_OPCODE_I64_CONST:
209 case wasm::WASM_OPCODE_F32_CONST:
212 case wasm::WASM_OPCODE_F64_CONST:
215 case wasm::WASM_OPCODE_GLOBAL_GET:
218 case wasm::WASM_OPCODE_REF_NULL: {
228 if (EndOpcode != wasm::WASM_OPCODE_END)
237 case wasm::WASM_OPCODE_I32_CONST:
238 case wasm::WASM_OPCODE_GLOBAL_GET:
239 case wasm::WASM_OPCODE_REF_NULL:
240 case wasm::WASM_OPCODE_REF_FUNC:
241 case wasm::WASM_OPCODE_I64_CONST:
244 case wasm::WASM_OPCODE_F32_CONST:
247 case wasm::WASM_OPCODE_F64_CONST:
250 case wasm::WASM_OPCODE_I32_ADD:
251 case wasm::WASM_OPCODE_I32_SUB:
252 case wasm::WASM_OPCODE_I32_MUL:
253 case wasm::WASM_OPCODE_I64_ADD:
254 case wasm::WASM_OPCODE_I64_SUB:
255 case wasm::WASM_OPCODE_I64_MUL:
257 case wasm::WASM_OPCODE_GC_PREFIX:
262 case wasm::WASM_OPCODE_STRUCT_NEW:
263 case wasm::WASM_OPCODE_STRUCT_NEW_DEFAULT:
264 case wasm::WASM_OPCODE_ARRAY_NEW:
265 case wasm::WASM_OPCODE_ARRAY_NEW_DEFAULT:
268 case wasm::WASM_OPCODE_ARRAY_NEW_FIXED:
272 case wasm::WASM_OPCODE_REF_I31:
274 case wasm::WASM_OPCODE_END:
288 static wasm::WasmLimits readLimits(WasmObjectFile::ReadContext &Ctx) {
289 wasm::WasmLimits Result;
292 if (Result.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX)
297 static wasm::WasmTableType readTableType(WasmObjectFile::ReadContext &Ctx) {
298 wasm::WasmTableType TableType;
321 if (Section.Type == wasm::WASM_SEC_CUSTOM) {
367 if (Header.Version != wasm::WasmVersion) {
392 case wasm::WASM_SEC_CUSTOM:
394 case wasm::WASM_SEC_TYPE:
396 case wasm::WASM_SEC_IMPORT:
398 case wasm::WASM_SEC_FUNCTION:
400 case wasm::WASM_SEC_TABLE:
402 case wasm::WASM_SEC_MEMORY:
404 case wasm::WASM_SEC_TAG:
406 case wasm::WASM_SEC_GLOBAL:
408 case wasm::WASM_SEC_EXPORT:
410 case wasm::WASM_SEC_START:
412 case wasm::WASM_SEC_ELEM:
414 case wasm::WASM_SEC_CODE:
416 case wasm::WASM_SEC_DATA:
418 case wasm::WASM_SEC_DATACOUNT:
460 case wasm::WASM_DYLINK_MEM_INFO:
466 case wasm::WASM_DYLINK_NEEDED:
472 case wasm::WASM_DYLINK_EXPORT_INFO: {
479 case wasm::WASM_DYLINK_IMPORT_INFO: {
524 case wasm::WASM_NAMES_FUNCTION:
525 case wasm::WASM_NAMES_GLOBAL:
526 case wasm::WASM_NAMES_DATA_SEGMENT: {
531 wasm::NameType nameType = wasm::NameType::FUNCTION;
532 wasm::WasmSymbolInfo Info{Name,
533 /*Kind */ wasm::WASM_SYMBOL_TYPE_FUNCTION,
539 const wasm::WasmSignature *Signature = nullptr;
540 const wasm::WasmGlobalType *GlobalType = nullptr;
541 const wasm::WasmTableType *TableType = nullptr;
542 if (Type == wasm::WASM_NAMES_FUNCTION) {
551 wasm::WasmFunction &F = getDefinedFunction(Index);
556 Info.Flags |= wasm::WASM_SYMBOL_BINDING_GLOBAL;
558 Info.Flags |= wasm::WASM_SYMBOL_BINDING_LOCAL;
561 Info.Flags |= wasm::WASM_SYMBOL_UNDEFINED;
563 } else if (Type == wasm::WASM_NAMES_GLOBAL) {
570 nameType = wasm::NameType::GLOBAL;
571 Info.Kind = wasm::WASM_SYMBOL_TYPE_GLOBAL;
575 Info.Flags |= wasm::WASM_SYMBOL_UNDEFINED;
584 nameType = wasm::NameType::DATA_SEGMENT;
585 Info.Kind = wasm::WASM_SYMBOL_TYPE_DATA;
586 Info.Flags |= wasm::WASM_SYMBOL_BINDING_LOCAL;
588 Info.DataRef = wasm::WasmDataReference{
591 DebugNames.push_back(wasm::WasmDebugName{nameType, Index, Name});
598 case wasm::WASM_NAMES_LOCAL:
618 if (LinkingData.Version != wasm::WasmMetadataVersion) {
621 " (Expected: " + Twine(wasm::WasmMetadataVersion) + ")",
634 case wasm::WASM_SYMBOL_TABLE:
638 case wasm::WASM_SEGMENT_INFO: {
650 case wasm::WASM_INIT_FUNCS: {
654 wasm::WasmInitFunc Init;
665 case wasm::WASM_COMDAT_INFO:
691 std::vector<wasm::WasmImport *> ImportedGlobals;
692 std::vector<wasm::WasmImport *> ImportedFunctions;
693 std::vector<wasm::WasmImport *> ImportedTags;
694 std::vector<wasm::WasmImport *> ImportedTables;
700 if (I.Kind == wasm::WASM_EXTERNAL_FUNCTION)
702 else if (I.Kind == wasm::WASM_EXTERNAL_GLOBAL)
704 else if (I.Kind == wasm::WASM_EXTERNAL_TAG)
706 else if (I.Kind == wasm::WASM_EXTERNAL_TABLE)
711 wasm::WasmSymbolInfo Info;
712 const wasm::WasmSignature *Signature = nullptr;
713 const wasm::WasmGlobalType *GlobalType = nullptr;
714 const wasm::WasmTableType *TableType = nullptr;
718 bool IsDefined = (Info.Flags & wasm::WASM_SYMBOL_UNDEFINED) == 0;
721 case wasm::WASM_SYMBOL_TYPE_FUNCTION:
730 wasm::WasmFunction &Function = Functions[FuncIndex];
735 wasm::WasmImport &Import = *ImportedFunctions[Info.ElementIndex];
736 if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) {
747 case wasm::WASM_SYMBOL_TYPE_GLOBAL:
753 if (!IsDefined && (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) ==
754 wasm::WASM_SYMBOL_BINDING_WEAK)
760 wasm::WasmGlobal &Global = Globals[GlobalIndex];
765 wasm::WasmImport &Import = *ImportedGlobals[Info.ElementIndex];
766 if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) {
777 case wasm::WASM_SYMBOL_TYPE_TABLE:
783 if (!IsDefined && (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) ==
784 wasm::WASM_SYMBOL_BINDING_WEAK)
790 wasm::WasmTable &Table = Tables[TableNumber];
795 wasm::WasmImport &Import = *ImportedTables[Info.ElementIndex];
796 if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) {
807 case wasm::WASM_SYMBOL_TYPE_DATA:
813 if (!(Info.Flags & wasm::WASM_SYMBOL_ABSOLUTE)) {
826 Info.DataRef = wasm::WasmDataReference{Index, Offset, Size};
830 case wasm::WASM_SYMBOL_TYPE_SECTION: {
831 if ((Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) !=
832 wasm::WASM_SYMBOL_BINDING_LOCAL)
843 case wasm::WASM_SYMBOL_TYPE_TAG: {
849 if (!IsDefined && (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) ==
850 wasm::WASM_SYMBOL_BINDING_WEAK)
856 wasm::WasmTag &Tag = Tags[TagIndex];
862 wasm::WasmImport &Import = *ImportedTags[Info.ElementIndex];
863 if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) {
881 if ((Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) !=
882 wasm::WASM_SYMBOL_BINDING_LOCAL &&
917 case wasm::WASM_COMDAT_DATA:
926 case wasm::WASM_COMDAT_FUNCTION:
935 case wasm::WASM_COMDAT_SECTION:
939 if (Sections[Index].Type != wasm::WASM_SEC_CUSTOM)
995 wasm::WasmFeatureEntry Feature;
998 case wasm::WASM_FEATURE_PREFIX_USED:
999 case wasm::WASM_FEATURE_PREFIX_DISALLOWED:
1030 wasm::WasmRelocation Reloc = {};
1047 case wasm::R_WASM_FUNCTION_INDEX_LEB:
1048 case wasm::R_WASM_FUNCTION_INDEX_I32:
1049 case wasm::R_WASM_TABLE_INDEX_SLEB:
1050 case wasm::R_WASM_TABLE_INDEX_SLEB64:
1051 case wasm::R_WASM_TABLE_INDEX_I32:
1052 case wasm::R_WASM_TABLE_INDEX_I64:
1053 case wasm::R_WASM_TABLE_INDEX_REL_SLEB:
1054 case wasm::R_WASM_TABLE_INDEX_REL_SLEB64:
1058 case wasm::R_WASM_TABLE_NUMBER_LEB:
1062 case wasm::R_WASM_TYPE_INDEX_LEB:
1066 case wasm::R_WASM_GLOBAL_INDEX_LEB:
1074 case wasm::R_WASM_GLOBAL_INDEX_I32:
1078 case wasm::R_WASM_TAG_INDEX_LEB:
1082 case wasm::R_WASM_MEMORY_ADDR_LEB:
1083 case wasm::R_WASM_MEMORY_ADDR_SLEB:
1084 case wasm::R_WASM_MEMORY_ADDR_I32:
1085 case wasm::R_WASM_MEMORY_ADDR_REL_SLEB:
1086 case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB:
1087 case wasm::R_WASM_MEMORY_ADDR_LOCREL_I32:
1092 case wasm::R_WASM_MEMORY_ADDR_LEB64:
1093 case wasm::R_WASM_MEMORY_ADDR_SLEB64:
1094 case wasm::R_WASM_MEMORY_ADDR_I64:
1095 case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64:
1096 case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64:
1101 case wasm::R_WASM_FUNCTION_OFFSET_I32:
1106 case wasm::R_WASM_FUNCTION_OFFSET_I64:
1111 case wasm::R_WASM_SECTION_OFFSET_I32:
1126 if (Reloc.Type == wasm::R_WASM_MEMORY_ADDR_LEB64 ||
1127 Reloc.Type == wasm::R_WASM_MEMORY_ADDR_SLEB64 ||
1128 Reloc.Type == wasm::R_WASM_MEMORY_ADDR_REL_SLEB64)
1130 if (Reloc.Type == wasm::R_WASM_TABLE_INDEX_I32 ||
1131 Reloc.Type == wasm::R_WASM_MEMORY_ADDR_I32 ||
1132 Reloc.Type == wasm::R_WASM_MEMORY_ADDR_LOCREL_I32 ||
1133 Reloc.Type == wasm::R_WASM_SECTION_OFFSET_I32 ||
1134 Reloc.Type == wasm::R_WASM_FUNCTION_OFFSET_I32 ||
1135 Reloc.Type == wasm::R_WASM_FUNCTION_INDEX_I32 ||
1136 Reloc.Type == wasm::R_WASM_GLOBAL_INDEX_I32)
1138 if (Reloc.Type == wasm::R_WASM_TABLE_INDEX_I64 ||
1139 Reloc.Type == wasm::R_WASM_MEMORY_ADDR_I64 ||
1140 Reloc.Type == wasm::R_WASM_FUNCTION_OFFSET_I64)
1190 wasm::WasmSignature Sig;
1192 if (Form == wasm::WASM_TYPE_REC) {
1201 Sig.Kind = wasm::WasmSignature::Placeholder;
1206 if (Form != wasm::WASM_TYPE_FUNC) {
1210 if (Form == wasm::WASM_TYPE_SUB || Form == wasm::WASM_TYPE_SUB_FINAL) {
1220 if (Form == wasm::WASM_TYPE_STRUCT) {
1225 } else if (Form == wasm::WASM_TYPE_ARRAY) {
1231 Sig.Kind = wasm::WasmSignature::Placeholder;
1262 wasm::WasmImport Im;
1267 case wasm::WASM_EXTERNAL_FUNCTION:
1274 case wasm::WASM_EXTERNAL_GLOBAL:
1279 case wasm::WASM_EXTERNAL_MEMORY:
1281 if (Im.Memory.Flags & wasm::WASM_LIMITS_FLAG_IS_64)
1284 case wasm::WASM_EXTERNAL_TABLE: {
1288 if (ElemType != wasm::ValType::FUNCREF &&
1289 ElemType != wasm::ValType::EXTERNREF &&
1290 ElemType != wasm::ValType::EXNREF &&
1291 ElemType != wasm::ValType::OTHERREF)
1296 case wasm::WASM_EXTERNAL_TAG:
1327 wasm::WasmFunction F;
1342 wasm::WasmTable T;
1347 if (ElemType != wasm::ValType::FUNCREF &&
1348 ElemType != wasm::ValType::EXTERNREF &&
1349 ElemType != wasm::ValType::EXNREF &&
1350 ElemType != wasm::ValType::OTHERREF) {
1366 if (Limits.Flags & wasm::WASM_LIMITS_FLAG_IS_64)
1389 wasm::WasmTag Tag;
1392 Signatures[Type].Kind = wasm::WasmSignature::Tag;
1408 wasm::WasmGlobal Global;
1431 wasm::WasmExport Ex;
1435 const wasm::WasmSignature *Signature = nullptr;
1436 const wasm::WasmGlobalType *GlobalType = nullptr;
1437 const wasm::WasmTableType *TableType = nullptr;
1438 wasm::WasmSymbolInfo Info;
1442 case wasm::WASM_EXTERNAL_FUNCTION: {
1446 Info.Kind = wasm::WASM_SYMBOL_TYPE_FUNCTION;
1451 wasm::WasmFunction &Function = Functions[FuncIndex];
1459 case wasm::WASM_EXTERNAL_GLOBAL: {
1463 Info.Kind = wasm::WASM_SYMBOL_TYPE_DATA;
1469 if (Inst.Opcode == wasm::WASM_OPCODE_I32_CONST) {
1471 } else if (Inst.Opcode == wasm::WASM_OPCODE_I64_CONST) {
1476 Info.DataRef = wasm::WasmDataReference{0, Offset, 0};
1479 case wasm::WASM_EXTERNAL_TAG:
1483 Info.Kind = wasm::WASM_SYMBOL_TYPE_TAG;
1486 case wasm::WASM_EXTERNAL_MEMORY:
1488 case wasm::WASM_EXTERNAL_TABLE:
1489 Info.Kind = wasm::WASM_SYMBOL_TYPE_TABLE;
1497 if (Ex.Kind != wasm::WASM_EXTERNAL_MEMORY) {
1564 wasm::WasmFunction &WasmObjectFile::getDefinedFunction(uint32_t Index) {
1569 const wasm::WasmFunction &
1575 const wasm::WasmGlobal &WasmObjectFile::getDefinedGlobal(uint32_t Index) const {
1580 wasm::WasmTag &WasmObjectFile::getDefinedTag(uint32_t Index) {
1602 wasm::WasmFunction& Function = Functions[i];
1615 wasm::WasmLocalDecl Decl;
1643 wasm::WasmElemSegment Segment;
1646 uint32_t SupportedFlags = wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER |
1647 wasm::WASM_ELEM_SEGMENT_IS_PASSIVE |
1648 wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS;
1653 wasm::ElemSegmentMode Mode;
1654 if ((Segment.Flags & wasm::WASM_ELEM_SEGMENT_IS_PASSIVE) == 0) {
1655 Mode = wasm::ElemSegmentMode::Active;
1656 } else if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_IS_DECLARATIVE) {
1657 Mode = wasm::ElemSegmentMode::Declarative;
1659 Mode = wasm::ElemSegmentMode::Passive;
1662 Mode == wasm::ElemSegmentMode::Active &&
1663 (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER);
1665 (Segment.Flags & wasm::WASM_ELEM_SEGMENT_MASK_HAS_ELEM_DESC) &&
1666 !(Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS);
1668 (Segment.Flags & wasm::WASM_ELEM_SEGMENT_MASK_HAS_ELEM_DESC) &&
1669 (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS);
1671 (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS);
1682 if (Mode != wasm::ElemSegmentMode::Active) {
1684 Segment.Offset.Inst.Opcode = wasm::WASM_OPCODE_I32_CONST;
1693 if (Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS) {
1695 if (Segment.ElemKind != wasm::ValType::FUNCREF &&
1696 Segment.ElemKind != wasm::ValType::EXTERNREF &&
1697 Segment.ElemKind != wasm::ValType::EXNREF &&
1698 Segment.ElemKind != wasm::ValType::OTHERREF) {
1706 Segment.ElemKind = wasm::ValType::FUNCREF;
1712 Segment.ElemKind = wasm::ValType::FUNCREF;
1719 wasm::WasmInitExpr Expr;
1747 (Segment.Data.InitFlags & wasm::WASM_DATA_SEGMENT_HAS_MEMINDEX)
1750 if ((Segment.Data.InitFlags & wasm::WASM_DATA_SEGMENT_IS_PASSIVE) == 0) {
1755 Segment.Data.Offset.Inst.Opcode = wasm::WASM_OPCODE_I32_CONST;
1783 const wasm::WasmObjectHeader &WasmObjectFile::getHeader() const {
1841 if (Sym.Info.Kind == wasm::WASM_SYMBOL_TYPE_FUNCTION &&
1846 if (Sym.Info.Kind == wasm::WASM_SYMBOL_TYPE_GLOBAL &&
1856 case wasm::WASM_SYMBOL_TYPE_FUNCTION:
1857 case wasm::WASM_SYMBOL_TYPE_GLOBAL:
1858 case wasm::WASM_SYMBOL_TYPE_TAG:
1859 case wasm::WASM_SYMBOL_TYPE_TABLE:
1861 case wasm::WASM_SYMBOL_TYPE_DATA: {
1865 const wasm::WasmDataSegment &Segment = DataSegments[SegmentIndex].Data;
1868 } else if (Segment.Offset.Inst.Opcode == wasm::WASM_OPCODE_I32_CONST) {
1870 } else if (Segment.Offset.Inst.Opcode == wasm::WASM_OPCODE_I64_CONST) {
1872 } else if (Segment.Offset.Inst.Opcode == wasm::WASM_OPCODE_GLOBAL_GET) {
1878 case wasm::WASM_SYMBOL_TYPE_SECTION:
1903 case wasm::WASM_SYMBOL_TYPE_FUNCTION:
1905 case wasm::WASM_SYMBOL_TYPE_GLOBAL:
1907 case wasm::WASM_SYMBOL_TYPE_DATA:
1909 case wasm::WASM_SYMBOL_TYPE_SECTION:
1911 case wasm::WASM_SYMBOL_TYPE_TAG:
1913 case wasm::WASM_SYMBOL_TYPE_TABLE:
1939 case wasm::WASM_SYMBOL_TYPE_FUNCTION:
1941 case wasm::WASM_SYMBOL_TYPE_GLOBAL:
1943 case wasm::WASM_SYMBOL_TYPE_DATA:
1945 case wasm::WASM_SYMBOL_TYPE_SECTION:
1947 case wasm::WASM_SYMBOL_TYPE_TAG:
1949 case wasm::WASM_SYMBOL_TYPE_TABLE:
1976 if (S.Type == wasm::WASM_SEC_CUSTOM)
1978 if (S.Type > wasm::WASM_SEC_LAST_KNOWN)
1980 return wasm::sectionTypeToString(S.Type);
2003 // This will never fail since wasm sections can never be empty (user-sections
2017 return getWasmSection(Sec).Type == wasm::WASM_SEC_CODE;
2021 return getWasmSection(Sec).Type == wasm::WASM_SEC_DATA;
2046 const wasm::WasmRelocation &Rel = getWasmRelocation(Ref);
2051 const wasm::WasmRelocation &Rel = getWasmRelocation(Ref);
2052 if (Rel.Type == wasm::R_WASM_TYPE_INDEX_LEB)
2061 const wasm::WasmRelocation &Rel = getWasmRelocation(Ref);
2067 const wasm::WasmRelocation &Rel = getWasmRelocation(Ref);
2071 case wasm::name: \
2100 StringRef WasmObjectFile::getFileFormatName() const { return "WASM"; }
2124 const wasm::WasmRelocation &
2129 const wasm::WasmRelocation &
2140 case wasm::WASM_SEC_CUSTOM:
2150 case wasm::WASM_SEC_TYPE:
2152 case wasm::WASM_SEC_IMPORT:
2154 case wasm::WASM_SEC_FUNCTION:
2156 case wasm::WASM_SEC_TABLE:
2158 case wasm::WASM_SEC_MEMORY:
2160 case wasm::WASM_SEC_GLOBAL:
2162 case wasm::WASM_SEC_EXPORT:
2164 case wasm::WASM_SEC_START:
2166 case wasm::WASM_SEC_ELEM:
2168 case wasm::WASM_SEC_CODE:
2170 case wasm::WASM_SEC_DATA:
2172 case wasm::WASM_SEC_DATACOUNT:
2174 case wasm::WASM_SEC_TAG: