[WebAssembly] Update format of 'names' section.

This change updates to the format of the 'names' sectionin the
generated wasm binary to match the latest changesto the design
and 'wabt'.

Differential Revision: https://reviews.llvm.org/D30950

Patch by Sam Clegg

llvm-svn: 297877
This commit is contained in:
Derek Schuff 2017-03-15 19:36:02 +00:00
parent 06c70adcf0
commit 13f080fbeb
2 changed files with 16 additions and 6 deletions

View File

@ -81,6 +81,11 @@ enum : unsigned {
WASM_OPCODE_F64_CONST = 0x44, WASM_OPCODE_F64_CONST = 0x44,
}; };
enum : unsigned {
WASM_NAMES_FUNCTION = 0x1,
WASM_NAMES_LOCAL = 0x2,
};
// Subset of types that a value can have // Subset of types that a value can have
enum class ValType { enum class ValType {
I32 = WASM_TYPE_I32, I32 = WASM_TYPE_I32,

View File

@ -982,25 +982,30 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
} }
// === Name Section ========================================================== // === Name Section ==========================================================
if (NumFuncImports != 0 || !Functions.empty()) { uint32_t TotalFunctions = NumFuncImports + Functions.size();
if (TotalFunctions != 0) {
startSection(Section, wasm::WASM_SEC_CUSTOM, "name"); 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) { for (const WasmImport &Import : Imports) {
if (Import.Kind == wasm::WASM_EXTERNAL_FUNCTION) { if (Import.Kind == wasm::WASM_EXTERNAL_FUNCTION) {
encodeULEB128(Index, getStream());
encodeULEB128(Import.FieldName.size(), getStream()); encodeULEB128(Import.FieldName.size(), getStream());
writeBytes(Import.FieldName); writeBytes(Import.FieldName);
encodeULEB128(0, getStream()); // local count, meaningless for imports ++Index;
} }
} }
for (const WasmFunction &Func : Functions) { for (const WasmFunction &Func : Functions) {
encodeULEB128(Index, getStream());
encodeULEB128(Func.Sym->getName().size(), getStream()); encodeULEB128(Func.Sym->getName().size(), getStream());
writeBytes(Func.Sym->getName()); writeBytes(Func.Sym->getName());
++Index;
// TODO: Local names.
encodeULEB128(0, getStream()); // local count
} }
endSection(SubSection);
endSection(Section); endSection(Section);
} }