Index: include/llvm/Support/Wasm.h =================================================================== --- include/llvm/Support/Wasm.h +++ include/llvm/Support/Wasm.h @@ -81,6 +81,11 @@ WASM_OPCODE_F64_CONST = 0x44, }; +enum : unsigned { + WASM_NAMES_FUNCTION = 0x1, + WASM_NAMES_LOCAL = 0x2, +}; + // Subset of types that a value can have enum class ValType { I32 = WASM_TYPE_I32, Index: lib/MC/WasmObjectWriter.cpp =================================================================== --- lib/MC/WasmObjectWriter.cpp +++ lib/MC/WasmObjectWriter.cpp @@ -982,25 +982,30 @@ } // === Name Section ========================================================== - if (NumFuncImports != 0 || !Functions.empty()) { + uint32_t TotalFunctions = NumFuncImports + Functions.size(); + if (TotalFunctions != 0) { startSection(Section, wasm::WASM_SEC_CUSTOM, "name"); + SectionBookkeeping SubSection; + startSection(SubSection, wasm::WASM_NAMES_FUNCTION); - encodeULEB128(NumFuncImports + Functions.size(), getStream()); + encodeULEB128(TotalFunctions, getStream()); + uint32_t Index = 0; for (const WasmImport &Import : Imports) { if (Import.Kind == wasm::WASM_EXTERNAL_FUNCTION) { + encodeULEB128(Index, getStream()); encodeULEB128(Import.FieldName.size(), getStream()); writeBytes(Import.FieldName); - encodeULEB128(0, getStream()); // local count, meaningless for imports + ++Index; } } for (const WasmFunction &Func : Functions) { + encodeULEB128(Index, getStream()); encodeULEB128(Func.Sym->getName().size(), getStream()); writeBytes(Func.Sym->getName()); - - // TODO: Local names. - encodeULEB128(0, getStream()); // local count + ++Index; } + endSection(SubSection); endSection(Section); }