Index: include/llvm/BinaryFormat/Wasm.h =================================================================== --- include/llvm/BinaryFormat/Wasm.h +++ include/llvm/BinaryFormat/Wasm.h @@ -94,7 +94,7 @@ }; struct WasmDataSegment { - uint32_t Index; + uint32_t MemoryIndex; WasmInitExpr Offset; ArrayRef Content; }; Index: include/llvm/Object/Wasm.h =================================================================== --- include/llvm/Object/Wasm.h +++ include/llvm/Object/Wasm.h @@ -69,8 +69,7 @@ #endif }; -class WasmSection { -public: +struct WasmSection { WasmSection() = default; uint32_t Type = 0; // Section type (See below) @@ -80,6 +79,11 @@ std::vector Relocations; // Relocations for this section }; +struct WasmSegment { + uint32_t SectionOffset; + wasm::WasmDataSegment Data; +}; + class WasmObjectFile : public ObjectFile { public: @@ -110,7 +114,7 @@ return ElemSegments; } - const std::vector& dataSegments() const { + const std::vector& dataSegments() const { return DataSegments; } @@ -210,7 +214,7 @@ std::vector Imports; std::vector Exports; std::vector ElemSegments; - std::vector DataSegments; + std::vector DataSegments; std::vector Functions; std::vector Symbols; ArrayRef CodeSection; Index: include/llvm/ObjectYAML/WasmYAML.h =================================================================== --- include/llvm/ObjectYAML/WasmYAML.h +++ include/llvm/ObjectYAML/WasmYAML.h @@ -98,7 +98,8 @@ }; struct DataSegment { - uint32_t Index; + uint32_t MemoryIndex; + uint32_t SectionOffset; wasm::WasmInitExpr Offset; yaml::BinaryRef Content; }; Index: lib/MC/WasmObjectWriter.cpp =================================================================== --- lib/MC/WasmObjectWriter.cpp +++ lib/MC/WasmObjectWriter.cpp @@ -1182,6 +1182,7 @@ DataSection.setSectionOffset(DataBytes.size()); + uint64_t OldSize = DataBytes.size(); for (const MCFragment &Frag : DataSection) { if (Frag.hasInstructions()) report_fatal_error("only data supported in data sections"); @@ -1196,15 +1197,21 @@ DataBytes.size() + Align->getMaxBytesToEmit()); DataBytes.resize(Size, Value); + DEBUG(dbgs() << "Data: " << DataBytes.size() << " added alignment\n"); } else if (auto *Fill = dyn_cast(&Frag)) { - DataBytes.insert(DataBytes.end(), Fill->getSize(), Fill->getValue()); + if (Fill->getSize()) { + DataBytes.insert(DataBytes.end(), Fill->getSize(), Fill->getValue()); + DEBUG(dbgs() << "Data: " << DataBytes.size() << " added fill: " << Fill->getSize() << "\n"); + } } else { const auto &DataFrag = cast(Frag); const SmallVectorImpl &Contents = DataFrag.getContents(); DataBytes.insert(DataBytes.end(), Contents.begin(), Contents.end()); + DEBUG(dbgs() << "Data: " << DataBytes.size() << " added bytes: " << Contents.size() << "\n"); } } + DEBUG(dbgs() << "Added Data: " << WS.getName() << ": " << DataBytes.size() - OldSize << "\n"); // For each global, prepare a corresponding wasm global holding its // address. For externals these will also be named exports. Index: lib/Object/WasmObjectFile.cpp =================================================================== --- lib/Object/WasmObjectFile.cpp +++ lib/Object/WasmObjectFile.cpp @@ -675,15 +675,17 @@ } Error WasmObjectFile::parseDataSection(const uint8_t *Ptr, const uint8_t *End) { + const uint8_t *Start = Ptr; uint32_t Count = readVaruint32(Ptr); DataSegments.reserve(Count); while (Count--) { - wasm::WasmDataSegment Segment; - Segment.Index = readVaruint32(Ptr); - if (Error Err = readInitExpr(Segment.Offset, Ptr)) + WasmSegment Segment; + Segment.Data.MemoryIndex = readVaruint32(Ptr); + if (Error Err = readInitExpr(Segment.Data.Offset, Ptr)) return Err; uint32_t Size = readVaruint32(Ptr); - Segment.Content = ArrayRef(Ptr, Size); + Segment.Data.Content = ArrayRef(Ptr, Size); + Segment.SectionOffset = Ptr - Start; Ptr += Size; DataSegments.push_back(Segment); } Index: lib/ObjectYAML/WasmYAML.cpp =================================================================== --- lib/ObjectYAML/WasmYAML.cpp +++ lib/ObjectYAML/WasmYAML.cpp @@ -345,7 +345,8 @@ void MappingTraits::mapping( IO &IO, WasmYAML::DataSegment &Segment) { - IO.mapRequired("Index", Segment.Index); + IO.mapOptional("SectionOffset", Segment.SectionOffset); + IO.mapRequired("MemoryIndex", Segment.MemoryIndex); IO.mapRequired("Offset", Segment.Offset); IO.mapRequired("Content", Segment.Content); } Index: test/MC/WebAssembly/external-data.ll =================================================================== --- test/MC/WebAssembly/external-data.ll +++ test/MC/WebAssembly/external-data.ll @@ -13,7 +13,8 @@ ; CHECK: Index: 0 ; CHECK: Offset: 0x0000000E ; CHECK: Segments: -; CHECK: - Index: 0 +; CHECK: - SectionOffset: 6 +; CHECK: MemoryIndex: 0 ; CHECK: Offset: ; CHECK: Opcode: I32_CONST ; CHECK: Value: 0 Index: test/MC/WebAssembly/unnamed-data.ll =================================================================== --- test/MC/WebAssembly/unnamed-data.ll +++ test/MC/WebAssembly/unnamed-data.ll @@ -46,7 +46,8 @@ ; CHECK-NEXT: Index: 1 ; CHECK-NEXT: Offset: 0x0000001E ; CHECK-NEXT: Segments: -; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: - SectionOffset: 6 +; CHECK-NEXT: MemoryIndex: 0 ; CHECK-NEXT: Offset: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 0 Index: test/ObjectYAML/wasm/data_section.yaml =================================================================== --- test/ObjectYAML/wasm/data_section.yaml +++ test/ObjectYAML/wasm/data_section.yaml @@ -8,7 +8,7 @@ - Initial: 0x00000003 - Type: DATA Segments: - - Index: 0 + - MemoryIndex: 0 Offset: Opcode: I32_CONST Value: 4 @@ -38,7 +38,8 @@ # CHECK-NEXT: Offset: 0x00000006 # CHECK-NEXT: Addend: -6 # CHECK-NEXT: Segments: -# CHECK-NEXT: - Index: 0 +# CHECK-NEXT: - SectionOffset: 6 +# CHECK-NEXT: MemoryIndex: 0 # CHECK-NEXT: Offset: # CHECK-NEXT: Opcode: I32_CONST # CHECK-NEXT: Value: 4 Index: tools/obj2yaml/wasm2yaml.cpp =================================================================== --- tools/obj2yaml/wasm2yaml.cpp +++ tools/obj2yaml/wasm2yaml.cpp @@ -236,9 +236,10 @@ auto DataSec = make_unique(); for (auto &Segment : Obj.dataSegments()) { WasmYAML::DataSegment Seg; - Seg.Index = Segment.Index; - Seg.Offset = Segment.Offset; - Seg.Content = yaml::BinaryRef(Segment.Content); + Seg.SectionOffset = Segment.SectionOffset; + Seg.MemoryIndex = Segment.Data.MemoryIndex; + Seg.Offset = Segment.Data.Offset; + Seg.Content = yaml::BinaryRef(Segment.Data.Content); DataSec->Segments.push_back(Seg); } S = std::move(DataSec); Index: tools/yaml2obj/yaml2wasm.cpp =================================================================== --- tools/yaml2obj/yaml2wasm.cpp +++ tools/yaml2obj/yaml2wasm.cpp @@ -338,7 +338,7 @@ WasmYAML::DataSection &Section) { encodeULEB128(Section.Segments.size(), OS); for (auto &Segment : Section.Segments) { - encodeULEB128(Segment.Index, OS); + encodeULEB128(Segment.MemoryIndex, OS); writeInitExpr(Segment.Offset, OS); encodeULEB128(Segment.Content.binary_size(), OS); Segment.Content.writeAsBinary(OS);