diff options
| author | Sam Clegg <sbc@chromium.org> | 2017-12-07 03:05:45 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2017-12-07 03:05:45 +0000 |
| commit | 8460b26403736e50afbb92b0657b8e556eb87a3c (patch) | |
| tree | 40c6de565ad865c64bb36170f7ed8315c78788eb /llvm/lib/MC | |
| parent | e1694f9bf88dad94fa7b52de2bbad609d6cb37c7 (diff) | |
| download | bcm5719-llvm-8460b26403736e50afbb92b0657b8e556eb87a3c.tar.gz bcm5719-llvm-8460b26403736e50afbb92b0657b8e556eb87a3c.zip | |
Revert "[WebAssembly] Import the linear memory and function table."
We need to a little time to prepare and lld-side change that
supports this.
Original change: https://reviews.llvm.org/D40875
llvm-svn: 320003
Diffstat (limited to 'llvm/lib/MC')
| -rw-r--r-- | llvm/lib/MC/WasmObjectWriter.cpp | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index 7c50f437cfa..351927d628a 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -270,9 +270,10 @@ private: } void writeTypeSection(ArrayRef<WasmFunctionType> FunctionTypes); - void writeImportSection(ArrayRef<WasmImport> Imports, uint32_t DataSize, - uint32_t NumElements); + void writeImportSection(ArrayRef<WasmImport> Imports); void writeFunctionSection(ArrayRef<WasmFunction> Functions); + void writeTableSection(uint32_t NumElements); + void writeMemorySection(uint32_t DataSize); void writeGlobalSection(); void writeExportSection(ArrayRef<WasmExport> Exports); void writeElemSection(ArrayRef<uint32_t> TableElems); @@ -660,14 +661,10 @@ void WasmObjectWriter::writeTypeSection( endSection(Section); } -void WasmObjectWriter::writeImportSection(ArrayRef<WasmImport> Imports, - uint32_t DataSize, - uint32_t NumElements) { +void WasmObjectWriter::writeImportSection(ArrayRef<WasmImport> Imports) { if (Imports.empty()) return; - uint32_t NumPages = (DataSize + wasm::WasmPageSize - 1) / wasm::WasmPageSize; - SectionBookkeeping Section; startSection(Section, wasm::WASM_SEC_IMPORT); @@ -686,15 +683,6 @@ void WasmObjectWriter::writeImportSection(ArrayRef<WasmImport> Imports, encodeSLEB128(int32_t(Import.Type), getStream()); encodeULEB128(int32_t(Import.IsMutable), getStream()); break; - case wasm::WASM_EXTERNAL_MEMORY: - encodeULEB128(0, getStream()); // flags - encodeULEB128(NumPages, getStream()); // initial - break; - case wasm::WASM_EXTERNAL_TABLE: - encodeSLEB128(int32_t(Import.Type), getStream()); - encodeULEB128(0, getStream()); // flags - encodeULEB128(NumElements, getStream()); // initial - break; default: llvm_unreachable("unsupported import kind"); } @@ -717,6 +705,39 @@ void WasmObjectWriter::writeFunctionSection(ArrayRef<WasmFunction> Functions) { endSection(Section); } +void WasmObjectWriter::writeTableSection(uint32_t NumElements) { + // For now, always emit the table section, since indirect calls are not + // valid without it. In the future, we could perhaps be more clever and omit + // it if there are no indirect calls. + + SectionBookkeeping Section; + startSection(Section, wasm::WASM_SEC_TABLE); + + encodeULEB128(1, getStream()); // The number of tables. + // Fixed to 1 for now. + encodeSLEB128(wasm::WASM_TYPE_ANYFUNC, getStream()); // Type of table + encodeULEB128(0, getStream()); // flags + encodeULEB128(NumElements, getStream()); // initial + + endSection(Section); +} + +void WasmObjectWriter::writeMemorySection(uint32_t DataSize) { + // For now, always emit the memory section, since loads and stores are not + // valid without it. In the future, we could perhaps be more clever and omit + // it if there are no loads or stores. + SectionBookkeeping Section; + uint32_t NumPages = (DataSize + wasm::WasmPageSize - 1) / wasm::WasmPageSize; + + startSection(Section, wasm::WASM_SEC_MEMORY); + encodeULEB128(1, getStream()); // number of memory spaces + + encodeULEB128(0, getStream()); // flags + encodeULEB128(NumPages, getStream()); // initial + + endSection(Section); +} + void WasmObjectWriter::writeGlobalSection() { if (Globals.empty()) return; @@ -1064,29 +1085,6 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm, } } - // For now, always emit the memory import, since loads and stores are not - // valid without it. In the future, we could perhaps be more clever and omit - // it if there are no loads or stores. - MCSymbolWasm *MemorySym = - cast<MCSymbolWasm>(Ctx.getOrCreateSymbol("__linear_memory")); - WasmImport MemImport; - MemImport.ModuleName = MemorySym->getModuleName(); - MemImport.FieldName = MemorySym->getName(); - MemImport.Kind = wasm::WASM_EXTERNAL_MEMORY; - Imports.push_back(MemImport); - - // For now, always emit the table section, since indirect calls are not - // valid without it. In the future, we could perhaps be more clever and omit - // it if there are no indirect calls. - MCSymbolWasm *TableSym = - cast<MCSymbolWasm>(Ctx.getOrCreateSymbol("__indirect_function_table")); - WasmImport TableImport; - TableImport.ModuleName = TableSym->getModuleName(); - TableImport.FieldName = TableSym->getName(); - TableImport.Kind = wasm::WASM_EXTERNAL_TABLE; - TableImport.Type = wasm::WASM_TYPE_ANYFUNC; - Imports.push_back(TableImport); - // Populate FunctionTypeIndices and Imports. for (const MCSymbol &S : Asm.symbols()) { const auto &WS = static_cast<const MCSymbolWasm &>(S); @@ -1297,10 +1295,10 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm, writeHeader(Asm); writeTypeSection(FunctionTypes); - writeImportSection(Imports, DataSize, TableElems.size()); + writeImportSection(Imports); writeFunctionSection(Functions); - // Skip the "table" section; we import the table instead. - // Skip the "memory" section; we import the memory instead. + writeTableSection(TableElems.size()); + writeMemorySection(DataSize); writeGlobalSection(); writeExportSection(Exports); // TODO: Start Section |

