Lines Matching refs:wasm

57 // A wasm data segment.  A wasm binary contains only a single data section
60 // wasm data segment.
71 // A wasm function to be written into the function section.
77 // A wasm global to be written into the global section.
79 wasm::WasmGlobalType Type;
105 bool hasAddend() const { return wasm::relocTypeHasAddend(Type); }
108 Out << wasm::relocTypetoString(Type) << " Off=" << Offset
220 DenseMap<const MCSymbolWasm *, wasm::WasmDataReference> DataLocations;
234 DenseMap<wasm::WasmSignature, uint32_t> SignatureIndices;
235 SmallVector<wasm::WasmSignature, 4> Signatures;
300 void prepareImports(SmallVectorImpl<wasm::WasmImport> &Imports,
325 void writeValueType(wasm::ValType Ty) { W->OS << static_cast<char>(Ty); }
327 void writeTypeSection(ArrayRef<wasm::WasmSignature> Signatures);
328 void writeImportSection(ArrayRef<wasm::WasmImport> Imports, uint64_t DataSize,
331 void writeExportSection(ArrayRef<wasm::WasmExport> Exports);
339 void writeGlobalSection(ArrayRef<wasm::WasmGlobal> Globals);
340 void writeTableSection(ArrayRef<wasm::WasmTable> Tables);
344 ArrayRef<wasm::WasmSymbolInfo> SymbolInfos,
408 startSection(Section, wasm::WASM_SEC_CUSTOM);
413 // Custom sections in wasm also have a string identifier.
448 W->OS.write(wasm::WasmMagic, sizeof(wasm::WasmMagic));
449 W->write<uint32_t>(wasm::WasmVersion);
540 // LLVM expects wrapping, in contrast to wasm's immediates which can't
550 if ((Type == wasm::R_WASM_FUNCTION_OFFSET_I32 ||
551 Type == wasm::R_WASM_FUNCTION_OFFSET_I64 ||
552 Type == wasm::R_WASM_SECTION_OFFSET_I32) &&
580 if (Type == wasm::R_WASM_TABLE_INDEX_REL_SLEB ||
581 Type == wasm::R_WASM_TABLE_INDEX_REL_SLEB64 ||
582 Type == wasm::R_WASM_TABLE_INDEX_SLEB ||
583 Type == wasm::R_WASM_TABLE_INDEX_SLEB64 ||
584 Type == wasm::R_WASM_TABLE_INDEX_I32 ||
585 Type == wasm::R_WASM_TABLE_INDEX_I64) {
603 if (Type != wasm::R_WASM_TYPE_INDEX_LEB) {
606 "supported by wasm");
641 if ((RelEntry.Type == wasm::R_WASM_GLOBAL_INDEX_LEB ||
642 RelEntry.Type == wasm::R_WASM_GLOBAL_INDEX_I32) &&
649 case wasm::R_WASM_TABLE_INDEX_REL_SLEB:
650 case wasm::R_WASM_TABLE_INDEX_REL_SLEB64:
651 case wasm::R_WASM_TABLE_INDEX_SLEB:
652 case wasm::R_WASM_TABLE_INDEX_SLEB64:
653 case wasm::R_WASM_TABLE_INDEX_I32:
654 case wasm::R_WASM_TABLE_INDEX_I64: {
659 if (RelEntry.Type == wasm::R_WASM_TABLE_INDEX_REL_SLEB ||
660 RelEntry.Type == wasm::R_WASM_TABLE_INDEX_REL_SLEB64)
665 case wasm::R_WASM_TYPE_INDEX_LEB:
668 case wasm::R_WASM_FUNCTION_INDEX_LEB:
669 case wasm::R_WASM_FUNCTION_INDEX_I32:
670 case wasm::R_WASM_GLOBAL_INDEX_LEB:
671 case wasm::R_WASM_GLOBAL_INDEX_I32:
672 case wasm::R_WASM_TAG_INDEX_LEB:
673 case wasm::R_WASM_TABLE_NUMBER_LEB:
675 assert(WasmIndices.count(RelEntry.Symbol) > 0 && "symbol not found in wasm index space");
677 case wasm::R_WASM_FUNCTION_OFFSET_I32:
678 case wasm::R_WASM_FUNCTION_OFFSET_I64:
679 case wasm::R_WASM_SECTION_OFFSET_I32: {
686 case wasm::R_WASM_MEMORY_ADDR_LEB:
687 case wasm::R_WASM_MEMORY_ADDR_LEB64:
688 case wasm::R_WASM_MEMORY_ADDR_SLEB:
689 case wasm::R_WASM_MEMORY_ADDR_SLEB64:
690 case wasm::R_WASM_MEMORY_ADDR_REL_SLEB:
691 case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64:
692 case wasm::R_WASM_MEMORY_ADDR_I32:
693 case wasm::R_WASM_MEMORY_ADDR_I64:
694 case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB:
695 case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64:
696 case wasm::R_WASM_MEMORY_ADDR_LOCREL_I32: {
701 const wasm::WasmDataReference &SymRef = DataLocations[RelEntry.Symbol];
751 if (RelEntry.Type == wasm::R_WASM_TYPE_INDEX_LEB) {
776 case wasm::R_WASM_FUNCTION_INDEX_LEB:
777 case wasm::R_WASM_TYPE_INDEX_LEB:
778 case wasm::R_WASM_GLOBAL_INDEX_LEB:
779 case wasm::R_WASM_MEMORY_ADDR_LEB:
780 case wasm::R_WASM_TAG_INDEX_LEB:
781 case wasm::R_WASM_TABLE_NUMBER_LEB:
784 case wasm::R_WASM_MEMORY_ADDR_LEB64:
787 case wasm::R_WASM_TABLE_INDEX_I32:
788 case wasm::R_WASM_MEMORY_ADDR_I32:
789 case wasm::R_WASM_FUNCTION_OFFSET_I32:
790 case wasm::R_WASM_FUNCTION_INDEX_I32:
791 case wasm::R_WASM_SECTION_OFFSET_I32:
792 case wasm::R_WASM_GLOBAL_INDEX_I32:
793 case wasm::R_WASM_MEMORY_ADDR_LOCREL_I32:
796 case wasm::R_WASM_TABLE_INDEX_I64:
797 case wasm::R_WASM_MEMORY_ADDR_I64:
798 case wasm::R_WASM_FUNCTION_OFFSET_I64:
801 case wasm::R_WASM_TABLE_INDEX_SLEB:
802 case wasm::R_WASM_TABLE_INDEX_REL_SLEB:
803 case wasm::R_WASM_MEMORY_ADDR_SLEB:
804 case wasm::R_WASM_MEMORY_ADDR_REL_SLEB:
805 case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB:
808 case wasm::R_WASM_TABLE_INDEX_SLEB64:
809 case wasm::R_WASM_TABLE_INDEX_REL_SLEB64:
810 case wasm::R_WASM_MEMORY_ADDR_SLEB64:
811 case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64:
812 case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64:
822 ArrayRef<wasm::WasmSignature> Signatures) {
827 startSection(Section, wasm::WASM_SEC_TYPE);
831 for (const wasm::WasmSignature &Sig : Signatures) {
832 W->OS << char(wasm::WASM_TYPE_FUNC);
834 for (wasm::ValType Ty : Sig.Params)
837 for (wasm::ValType Ty : Sig.Returns)
844 void WasmObjectWriter::writeImportSection(ArrayRef<wasm::WasmImport> Imports,
850 uint64_t NumPages = (DataSize + wasm::WasmPageSize - 1) / wasm::WasmPageSize;
853 startSection(Section, wasm::WASM_SEC_IMPORT);
856 for (const wasm::WasmImport &Import : Imports) {
862 case wasm::WASM_EXTERNAL_FUNCTION:
865 case wasm::WASM_EXTERNAL_GLOBAL:
869 case wasm::WASM_EXTERNAL_MEMORY:
873 case wasm::WASM_EXTERNAL_TABLE:
878 case wasm::WASM_EXTERNAL_TAG:
895 startSection(Section, wasm::WASM_SEC_FUNCTION);
909 startSection(Section, wasm::WASM_SEC_TAG);
920 void WasmObjectWriter::writeGlobalSection(ArrayRef<wasm::WasmGlobal> Globals) {
925 startSection(Section, wasm::WASM_SEC_GLOBAL);
928 for (const wasm::WasmGlobal &Global : Globals) {
936 case wasm::WASM_TYPE_I32:
939 case wasm::WASM_TYPE_I64:
942 case wasm::WASM_TYPE_F32:
945 case wasm::WASM_TYPE_F64:
948 case wasm::WASM_TYPE_EXTERNREF:
949 writeValueType(wasm::ValType::EXTERNREF);
955 W->OS << char(wasm::WASM_OPCODE_END);
961 void WasmObjectWriter::writeTableSection(ArrayRef<wasm::WasmTable> Tables) {
966 startSection(Section, wasm::WASM_SEC_TABLE);
969 for (const wasm::WasmTable &Table : Tables) {
970 assert(Table.Type.ElemType != wasm::ValType::OTHERREF &&
975 if (Table.Type.Limits.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX)
981 void WasmObjectWriter::writeExportSection(ArrayRef<wasm::WasmExport> Exports) {
986 startSection(Section, wasm::WASM_SEC_EXPORT);
989 for (const wasm::WasmExport &Export : Exports) {
1006 startSection(Section, wasm::WASM_SEC_ELEM);
1014 Flags |= wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER;
1016 if (Flags & wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER)
1020 W->OS << char(is64Bit() ? wasm::WASM_OPCODE_I64_CONST
1021 : wasm::WASM_OPCODE_I32_CONST);
1023 W->OS << char(wasm::WASM_OPCODE_END);
1025 if (Flags & wasm::WASM_ELEM_SEGMENT_MASK_HAS_ELEM_KIND) {
1044 startSection(Section, wasm::WASM_SEC_DATACOUNT);
1055 startSection(Section, wasm::WASM_SEC_CODE);
1080 startSection(Section, wasm::WASM_SEC_DATA);
1086 if (Segment.InitFlags & wasm::WASM_DATA_SEGMENT_HAS_MEMINDEX)
1088 if ((Segment.InitFlags & wasm::WASM_DATA_SEGMENT_IS_PASSIVE) == 0) {
1089 W->OS << char(is64Bit() ? wasm::WASM_OPCODE_I64_CONST
1090 : wasm::WASM_OPCODE_I32_CONST);
1092 W->OS << char(wasm::WASM_OPCODE_END);
1118 // wasm section, and this order is determined by the order of Asm.Symbols()
1154 ArrayRef<wasm::WasmSymbolInfo> SymbolInfos,
1159 encodeULEB128(wasm::WasmMetadataVersion, W->OS);
1163 startSection(SubSection, wasm::WASM_SYMBOL_TABLE);
1165 for (const wasm::WasmSymbolInfo &Sym : SymbolInfos) {
1169 case wasm::WASM_SYMBOL_TYPE_FUNCTION:
1170 case wasm::WASM_SYMBOL_TYPE_GLOBAL:
1171 case wasm::WASM_SYMBOL_TYPE_TAG:
1172 case wasm::WASM_SYMBOL_TYPE_TABLE:
1174 if ((Sym.Flags & wasm::WASM_SYMBOL_UNDEFINED) == 0 ||
1175 (Sym.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0)
1178 case wasm::WASM_SYMBOL_TYPE_DATA:
1180 if ((Sym.Flags & wasm::WASM_SYMBOL_UNDEFINED) == 0) {
1186 case wasm::WASM_SYMBOL_TYPE_SECTION: {
1200 startSection(SubSection, wasm::WASM_SEGMENT_INFO);
1211 startSection(SubSection, wasm::WASM_INIT_FUNCS);
1221 startSection(SubSection, wasm::WASM_COMDAT_INFO);
1272 wasm::WasmSignature S;
1294 wasm::WasmSignature S;
1346 SmallVectorImpl<wasm::WasmImport> &Imports, MCAssembler &Asm) {
1350 wasm::WasmImport MemImport;
1353 MemImport.Kind = wasm::WASM_EXTERNAL_MEMORY;
1354 MemImport.Memory.Flags = is64Bit() ? wasm::WASM_LIMITS_FLAG_IS_64
1355 : wasm::WASM_LIMITS_FLAG_NONE;
1365 // (because wasm always needs a type signature).
1383 wasm::WasmImport Import;
1386 Import.Kind = wasm::WASM_EXTERNAL_FUNCTION;
1395 wasm::WasmImport Import;
1397 Import.Kind = wasm::WASM_EXTERNAL_GLOBAL;
1407 wasm::WasmImport Import;
1410 Import.Kind = wasm::WASM_EXTERNAL_TAG;
1419 wasm::WasmImport Import;
1422 Import.Kind = wasm::WASM_EXTERNAL_TABLE;
1435 wasm::WasmImport Import;
1441 Import.Kind = wasm::WASM_EXTERNAL_GLOBAL;
1442 Import.Global = {wasm::WASM_TYPE_I32, true};
1475 SmallVector<wasm::WasmImport, 4> Imports;
1476 SmallVector<wasm::WasmExport, 4> Exports;
1478 SmallVector<wasm::WasmGlobal, 1> Globals;
1479 SmallVector<wasm::WasmTable, 1> Tables;
1480 SmallVector<wasm::WasmSymbolInfo, 4> SymbolInfos;
1518 ? (uint32_t)wasm::WASM_DATA_SEGMENT_IS_PASSIVE
1530 WasmComdatEntry{wasm::WASM_COMDAT_DATA, SegmentIndex});
1564 WasmComdatEntry{wasm::WASM_COMDAT_SECTION,
1583 << toString(WS.getType().value_or(wasm::WASM_SYMBOL_TYPE_DATA))
1614 WasmComdatEntry{wasm::WASM_COMDAT_FUNCTION, Index});
1618 wasm::WasmExport Export;
1620 Export.Kind = wasm::WASM_EXTERNAL_FUNCTION;
1656 wasm::WasmDataReference Ref = wasm::WasmDataReference{
1666 wasm::WasmGlobal Global;
1671 case wasm::WASM_TYPE_I32:
1672 Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_I32_CONST;
1674 case wasm::WASM_TYPE_I64:
1675 Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_I64_CONST;
1677 case wasm::WASM_TYPE_F32:
1678 Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_F32_CONST;
1680 case wasm::WASM_TYPE_F64:
1681 Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_F64_CONST;
1683 case wasm::WASM_TYPE_EXTERNREF:
1684 Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_REF_NULL;
1699 wasm::WasmTable Table;
1771 wasm::WasmDataReference Ref = wasm::WasmDataReference{
1794 Flags |= wasm::WASM_SYMBOL_BINDING_WEAK;
1796 Flags |= wasm::WASM_SYMBOL_VISIBILITY_HIDDEN;
1798 Flags |= wasm::WASM_SYMBOL_BINDING_LOCAL;
1800 Flags |= wasm::WASM_SYMBOL_UNDEFINED;
1802 Flags |= wasm::WASM_SYMBOL_NO_STRIP;
1804 Flags |= wasm::WASM_SYMBOL_EXPORTED;
1808 Flags |= wasm::WASM_SYMBOL_EXPLICIT_NAME;
1810 Flags |= wasm::WASM_SYMBOL_EXPORTED;
1812 Flags |= wasm::WASM_SYMBOL_TLS;
1814 wasm::WasmSymbolInfo Info;
1816 Info.Kind = WS.getType().value_or(wasm::WASM_SYMBOL_TYPE_DATA);
1834 if (Rel.Type != wasm::R_WASM_TABLE_INDEX_I32 &&
1835 Rel.Type != wasm::R_WASM_TABLE_INDEX_I64 &&
1836 Rel.Type != wasm::R_WASM_TABLE_INDEX_SLEB &&
1837 Rel.Type != wasm::R_WASM_TABLE_INDEX_SLEB64 &&
1838 Rel.Type != wasm::R_WASM_TABLE_INDEX_REL_SLEB &&
1839 Rel.Type != wasm::R_WASM_TABLE_INDEX_REL_SLEB64)
1952 if (Entry.Kind == wasm::WASM_COMDAT_SECTION) {