diff options
| author | Thomas Lively <tlively@google.com> | 2019-04-12 22:27:48 +0000 |
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2019-04-12 22:27:48 +0000 |
| commit | fef8de66a6ad56d71eb8bf8a401f8cdc82dea225 (patch) | |
| tree | 55b9ddd2be0fc7c1ac1ef4b1683aa44bee339bc8 /llvm/lib | |
| parent | bdb5e4e4ca5fbc7ef528067b65dda298e191e059 (diff) | |
| download | bcm5719-llvm-fef8de66a6ad56d71eb8bf8a401f8cdc82dea225.tar.gz bcm5719-llvm-fef8de66a6ad56d71eb8bf8a401f8cdc82dea225.zip | |
[WebAssembly] Add DataCount section to object files
Summary:
This ensures that object files will continue to validate as
WebAssembly modules in the presence of bulk memory operations. Engines
that don't support bulk memory operations will not recognize the
DataCount section and will report validation errors, but that's ok
because object files aren't supposed to be run directly anyway.
Reviewers: aheejin, dschuff, sbc100
Subscribers: jgravelle-google, hiraditya, sunfish, rupprecht, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D60623
llvm-svn: 358315
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/MC/WasmObjectWriter.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/Object/WasmObjectFile.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/ObjectYAML/WasmYAML.cpp | 11 |
3 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index 63677095918..2994772c519 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -326,6 +326,7 @@ private: void writeFunctionSection(ArrayRef<WasmFunction> Functions); void writeExportSection(ArrayRef<wasm::WasmExport> Exports); void writeElemSection(ArrayRef<uint32_t> TableElems); + void writeDataCountSection(); void writeCodeSection(const MCAssembler &Asm, const MCAsmLayout &Layout, ArrayRef<WasmFunction> Functions); void writeDataSection(); @@ -849,6 +850,16 @@ void WasmObjectWriter::writeElemSection(ArrayRef<uint32_t> TableElems) { endSection(Section); } +void WasmObjectWriter::writeDataCountSection() { + if (DataSegments.empty()) + return; + + SectionBookkeeping Section; + startSection(Section, wasm::WASM_SEC_DATACOUNT); + encodeULEB128(DataSegments.size(), W.OS); + endSection(Section); +} + void WasmObjectWriter::writeCodeSection(const MCAssembler &Asm, const MCAsmLayout &Layout, ArrayRef<WasmFunction> Functions) { @@ -1600,6 +1611,7 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm, writeEventSection(Events); writeExportSection(Exports); writeElemSection(TableElems); + writeDataCountSection(); writeCodeSection(Asm, Layout, Functions); writeDataSection(); for (auto &CustomSection : CustomSections) diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 16645002a6d..167b8c25c2b 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -316,6 +316,8 @@ Error WasmObjectFile::parseSection(WasmSection &Sec) { return parseCodeSection(Ctx); case wasm::WASM_SEC_DATA: return parseDataSection(Ctx); + case wasm::WASM_SEC_DATACOUNT: + return parseDataCountSection(Ctx); default: return make_error<GenericBinaryError>("Bad section type", object_error::parse_failed); @@ -1201,6 +1203,9 @@ Error WasmObjectFile::parseElemSection(ReadContext &Ctx) { Error WasmObjectFile::parseDataSection(ReadContext &Ctx) { DataSection = Sections.size(); uint32_t Count = readVaruint32(Ctx); + if (DataCount && Count != DataCount.getValue()) + return make_error<GenericBinaryError>( + "Number of data segments does not match DataCount section"); DataSegments.reserve(Count); while (Count--) { WasmSegment Segment; @@ -1234,6 +1239,11 @@ Error WasmObjectFile::parseDataSection(ReadContext &Ctx) { return Error::success(); } +Error WasmObjectFile::parseDataCountSection(ReadContext &Ctx) { + DataCount = readVaruint32(Ctx); + return Error::success(); +} + const wasm::WasmObjectHeader &WasmObjectFile::getHeader() const { return Header; } @@ -1399,6 +1409,7 @@ std::error_code WasmObjectFile::getSectionName(DataRefImpl Sec, ECase(ELEM); ECase(CODE); ECase(DATA); + ECase(DATACOUNT); case wasm::WASM_SEC_CUSTOM: Res = S.Name; break; diff --git a/llvm/lib/ObjectYAML/WasmYAML.cpp b/llvm/lib/ObjectYAML/WasmYAML.cpp index 3841c5b7712..19c7f54aed9 100644 --- a/llvm/lib/ObjectYAML/WasmYAML.cpp +++ b/llvm/lib/ObjectYAML/WasmYAML.cpp @@ -153,6 +153,11 @@ static void sectionMapping(IO &IO, WasmYAML::DataSection &Section) { IO.mapRequired("Segments", Section.Segments); } +static void sectionMapping(IO &IO, WasmYAML::DataCountSection &Section) { + commonSectionMapping(IO, Section); + IO.mapRequired("Count", Section.Count); +} + void MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping( IO &IO, std::unique_ptr<WasmYAML::Section> &Section) { WasmYAML::SectionType SectionType; @@ -257,6 +262,11 @@ void MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping( Section.reset(new WasmYAML::DataSection()); sectionMapping(IO, *cast<WasmYAML::DataSection>(Section.get())); break; + case wasm::WASM_SEC_DATACOUNT: + if (!IO.outputting()) + Section.reset(new WasmYAML::DataCountSection()); + sectionMapping(IO, *cast<WasmYAML::DataCountSection>(Section.get())); + break; default: llvm_unreachable("Unknown section type"); } @@ -278,6 +288,7 @@ void ScalarEnumerationTraits<WasmYAML::SectionType>::enumeration( ECase(ELEM); ECase(CODE); ECase(DATA); + ECase(DATACOUNT); #undef ECase } |

