]> granicus.if.org Git - llvm/commitdiff
[WebAssembly] Allow each data segment to specify its own alignment
authorSam Clegg <sbc@chromium.org>
Fri, 29 Sep 2017 16:50:08 +0000 (16:50 +0000)
committerSam Clegg <sbc@chromium.org>
Fri, 29 Sep 2017 16:50:08 +0000 (16:50 +0000)
Also, add a flags field as we will almost certainly
be needing that soon too.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314534 91177308-0d34-0410-b5e6-96231b3b80d8

19 files changed:
include/llvm/BinaryFormat/Wasm.h
include/llvm/ObjectYAML/WasmYAML.h
lib/MC/WasmObjectWriter.cpp
lib/Object/WasmObjectFile.cpp
lib/ObjectYAML/WasmYAML.cpp
test/MC/WebAssembly/array-fill.ll
test/MC/WebAssembly/bss.ll
test/MC/WebAssembly/explicit-sections.ll
test/MC/WebAssembly/unnamed-data.ll
test/MC/WebAssembly/weak-alias.ll
test/MC/WebAssembly/weak.ll
test/ObjectYAML/wasm/weak_symbols.yaml
test/tools/llvm-nm/wasm/exports.yaml
test/tools/llvm-nm/wasm/imports.yaml
test/tools/llvm-nm/wasm/weak-symbols.yaml
test/tools/llvm-readobj/sections.test
tools/llvm-readobj/WasmDumper.cpp
tools/obj2yaml/wasm2yaml.cpp
tools/yaml2obj/yaml2wasm.cpp

index ffb453513ccea8c3f864836c778e5ef2e5cbdd1b..26475c27df3823a4a98e3f39dcbf8382cb9761c8 100644 (file)
@@ -98,6 +98,8 @@ struct WasmDataSegment {
   WasmInitExpr Offset;
   ArrayRef<uint8_t> Content;
   StringRef Name;
+  uint32_t Alignment;
+  uint32_t Flags;
 };
 
 struct WasmElemSegment {
@@ -115,7 +117,6 @@ struct WasmRelocation {
 
 struct WasmLinkingData {
   uint32_t DataSize;
-  uint32_t DataAlignment;
 };
 
 enum : unsigned {
@@ -185,7 +186,7 @@ enum : unsigned {
   WASM_SYMBOL_INFO    = 0x2,
   WASM_DATA_SIZE      = 0x3,
   WASM_DATA_ALIGNMENT = 0x4,
-  WASM_SEGMENT_NAMES  = 0x5,
+  WASM_SEGMENT_INFO   = 0x5,
 };
 
 const unsigned WASM_SYMBOL_BINDING_MASK = 0x3;
index 171f823a27da45a9c887dfcdeb913f4c178f7061..d26faa1486231c52a92a9bb012795bf293057978 100644 (file)
@@ -109,6 +109,13 @@ struct NameEntry {
   StringRef Name;
 };
 
+struct SegmentInfo {
+  uint32_t Index;
+  StringRef Name;
+  uint32_t Alignment;
+  uint32_t Flags;
+};
+
 struct Signature {
   uint32_t Index;
   SignatureForm Form = wasm::WASM_TYPE_FUNC;
@@ -161,9 +168,8 @@ struct LinkingSection : CustomSection {
   }
 
   uint32_t DataSize;
-  uint32_t DataAlignment;
   std::vector<SymbolInfo> SymbolInfos;
-  std::vector<NameEntry> SegmentNames;
+  std::vector<SegmentInfo> SegmentInfos;
 };
 
 struct TypeSection : Section {
@@ -298,6 +304,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo)
 
 namespace llvm {
@@ -355,6 +362,10 @@ template <> struct MappingTraits<WasmYAML::NameEntry> {
   static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry);
 };
 
+template <> struct MappingTraits<WasmYAML::SegmentInfo> {
+  static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo);
+};
+
 template <> struct MappingTraits<WasmYAML::LocalDecl> {
   static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl);
 };
index d7a9895af0291c0cdb096b1884a26f26183b575b..af5c1a759c77373edcbeb02b5de146d03347539e 100644 (file)
@@ -104,6 +104,8 @@ struct WasmDataSegment {
   MCSectionWasm *Section;
   StringRef Name;
   uint32_t Offset;
+  uint32_t Alignment;
+  uint32_t Flags;
   SmallVector<char, 4> Data;
 };
 
@@ -282,7 +284,6 @@ private:
   void writeDataRelocSection();
   void writeLinkingMetaDataSection(
       ArrayRef<WasmDataSegment> Segments, uint32_t DataSize,
-      uint32_t DataAlignment,
       SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags,
       bool HasStackPointer, uint32_t StackPointerGlobal);
 
@@ -499,11 +500,11 @@ WasmObjectWriter::getProvisionalValue(const WasmRelocationEntry &RelEntry) {
 }
 
 static void addData(SmallVectorImpl<char> &DataBytes,
-                    MCSectionWasm &DataSection, uint32_t &DataAlignment) {
-  DataBytes.resize(alignTo(DataBytes.size(), DataSection.getAlignment()));
-  DataAlignment = std::max(DataAlignment, DataSection.getAlignment());
+                    MCSectionWasm &DataSection) {
   DEBUG(errs() << "addData: " << DataSection.getSectionName() << "\n");
 
+  DataBytes.resize(alignTo(DataBytes.size(), DataSection.getAlignment()));
+
   for (const MCFragment &Frag : DataSection) {
     if (Frag.hasInstructions())
       report_fatal_error("only data supported in data sections");
@@ -914,7 +915,6 @@ void WasmObjectWriter::writeDataRelocSection() {
 
 void WasmObjectWriter::writeLinkingMetaDataSection(
     ArrayRef<WasmDataSegment> Segments, uint32_t DataSize,
-    uint32_t DataAlignment,
     SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags,
     bool HasStackPointer, uint32_t StackPointerGlobal) {
   SectionBookkeeping Section;
@@ -941,17 +941,16 @@ void WasmObjectWriter::writeLinkingMetaDataSection(
     startSection(SubSection, wasm::WASM_DATA_SIZE);
     encodeULEB128(DataSize, getStream());
     endSection(SubSection);
-
-    startSection(SubSection, wasm::WASM_DATA_ALIGNMENT);
-    encodeULEB128(DataAlignment, getStream());
-    endSection(SubSection);
   }
 
   if (Segments.size()) {
-    startSection(SubSection, wasm::WASM_SEGMENT_NAMES);
+    startSection(SubSection, wasm::WASM_SEGMENT_INFO);
     encodeULEB128(Segments.size(), getStream());
-    for (const WasmDataSegment &Segment : Segments)
+    for (const WasmDataSegment &Segment : Segments) {
       writeString(Segment.Name);
+      encodeULEB128(Segment.Alignment, getStream());
+      encodeULEB128(Segment.Flags, getStream());
+    }
     endSection(SubSection);
   }
 
@@ -998,7 +997,6 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
   SmallPtrSet<const MCSymbolWasm *, 4> IsAddressTaken;
   unsigned NumFuncImports = 0;
   SmallVector<WasmDataSegment, 4> DataSegments;
-  uint32_t DataAlignment = 1;
   uint32_t StackPointerGlobal = 0;
   uint32_t DataSize = 0;
   bool HasStackPointer = false;
@@ -1144,7 +1142,9 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
     Segment.Name = Section.getSectionName();
     Segment.Offset = DataSize;
     Segment.Section = &Section;
-    addData(Segment.Data, Section, DataAlignment);
+    addData(Segment.Data, Section);
+    Segment.Alignment = Section.getAlignment();
+    Segment.Flags = 0;
     DataSize += Segment.Data.size();
     Section.setMemoryOffset(Segment.Offset);
   }
@@ -1308,8 +1308,8 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
   writeNameSection(Functions, Imports, NumFuncImports);
   writeCodeRelocSection();
   writeDataRelocSection();
-  writeLinkingMetaDataSection(DataSegments, DataSize, DataAlignment,
-                              SymbolFlags, HasStackPointer, StackPointerGlobal);
+  writeLinkingMetaDataSection(DataSegments, DataSize, SymbolFlags,
+                              HasStackPointer, StackPointerGlobal);
 
   // TODO: Translate the .comment section to the output.
   // TODO: Translate debug sections to the output.
index 1954335eeeb4cd46e69cc504d90c41f10d33f619..15a78df54024956b8762bf14929f48bfacd55ccd 100644 (file)
@@ -193,7 +193,6 @@ static Error readSection(WasmSection &Section, const uint8_t *&Ptr,
 
 WasmObjectFile::WasmObjectFile(MemoryBufferRef Buffer, Error &Err)
     : ObjectFile(Binary::ID_Wasm, Buffer) {
-  LinkingData.DataAlignment = 0;
   LinkingData.DataSize = 0;
 
   ErrorAsOutParameter ErrAsOutParam(&Err);
@@ -385,16 +384,16 @@ Error WasmObjectFile::parseLinkingSection(const uint8_t *Ptr,
     case wasm::WASM_DATA_SIZE:
       LinkingData.DataSize = readVaruint32(Ptr);
       break;
-    case wasm::WASM_DATA_ALIGNMENT:
-      LinkingData.DataAlignment = readVaruint32(Ptr);
-      break;
-    case wasm::WASM_SEGMENT_NAMES: {
+    case wasm::WASM_SEGMENT_INFO: {
       uint32_t Count = readVaruint32(Ptr);
       if (Count > DataSegments.size())
         return make_error<GenericBinaryError>("Too many segment names",
                                               object_error::parse_failed);
-      for (uint32_t i = 0; i < Count; i++)
+      for (uint32_t i = 0; i < Count; i++) {
         DataSegments[i].Data.Name = readString(Ptr);
+        DataSegments[i].Data.Alignment = readVaruint32(Ptr);
+        DataSegments[i].Data.Flags = readVaruint32(Ptr);
+      }
       break;
     }
     case wasm::WASM_STACK_POINTER:
@@ -734,6 +733,8 @@ Error WasmObjectFile::parseDataSection(const uint8_t *Ptr, const uint8_t *End) {
       return Err;
     uint32_t Size = readVaruint32(Ptr);
     Segment.Data.Content = ArrayRef<uint8_t>(Ptr, Size);
+    Segment.Data.Alignment = 0;
+    Segment.Data.Flags = 0;
     Segment.SectionOffset = Ptr - Start;
     Ptr += Size;
     DataSegments.push_back(Segment);
index a5c1d13598c02fe6018e86ddbcade875785b9476..2f961cf68a04b772f65c06a544f5badb06ba3433 100644 (file)
@@ -58,9 +58,8 @@ static void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) {
   commonSectionMapping(IO, Section);
   IO.mapRequired("Name", Section.Name);
   IO.mapRequired("DataSize", Section.DataSize);
-  IO.mapRequired("DataAlignment", Section.DataAlignment);
   IO.mapOptional("SymbolInfo", Section.SymbolInfos);
-  IO.mapOptional("SegmentNames", Section.SegmentNames);
+  IO.mapOptional("SegmentInfo", Section.SegmentInfos);
 }
 
 static void sectionMapping(IO &IO, WasmYAML::CustomSection &Section) {
@@ -266,6 +265,14 @@ void MappingTraits<WasmYAML::NameEntry>::mapping(
   IO.mapRequired("Name", NameEntry.Name);
 }
 
+void MappingTraits<WasmYAML::SegmentInfo>::mapping(
+    IO &IO, WasmYAML::SegmentInfo &SegmentInfo) {
+  IO.mapRequired("Index", SegmentInfo.Index);
+  IO.mapRequired("Name", SegmentInfo.Name);
+  IO.mapRequired("Alignment", SegmentInfo.Alignment);
+  IO.mapRequired("Flags", SegmentInfo.Flags);
+}
+
 void MappingTraits<WasmYAML::LocalDecl>::mapping(
     IO &IO, WasmYAML::LocalDecl &LocalDecl) {
   IO.mapRequired("Type", LocalDecl.Type);
index 38274c34305f3b7575ffc7b30c56d996c55e8fe9..e2f337a23a844ef2eedeb041c77c1d5e74134be5 100644 (file)
@@ -15,8 +15,9 @@ target triple = "wasm32-unknown-unknown-wasm"
 ; CHECK:        - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     DataSize:        2
-; CHECK-NEXT:     DataAlignment:   1
-; CHECK-NEXT:     SegmentNames:    
+; CHECK-NEXT:     SegmentInfo:    
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Name:            .data
+; CHECK-NEXT:         Alignment:       1
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT: ...
index d203efad19b0e78aeae2fae4c2ca4e11e42a4991..d975fa7374f05af1d093b024ce598920be2647b5 100644 (file)
@@ -13,8 +13,9 @@
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     DataSize:        4
-; CHECK-NEXT:     DataAlignment:   4
-; CHECK-NEXT:     SegmentNames:    
+; CHECK-NEXT:     SegmentInfo:    
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Name:            .bss.g0
+; CHECK-NEXT:         Alignment:       4
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT: ...
index a8342b628183786b55b5fe624b4a3d25a0933cf7..876adf0be3b5ab310d154fe7a81d7cbd393025e3 100644 (file)
 ; CHECK:        - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     DataSize:        28
-; CHECK-NEXT:     DataAlignment:   8
-; CHECK-NEXT:     SegmentNames:    
+; CHECK-NEXT:     SegmentInfo:    
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Name:            .data.global0
+; CHECK-NEXT:         Alignment:       8
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT:       - Index:           1
 ; CHECK-NEXT:         Name:            .sec1
+; CHECK-NEXT:         Alignment:       8
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT:       - Index:           2
 ; CHECK-NEXT:         Name:            .sec2
+; CHECK-NEXT:         Alignment:       8
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT: ...
index 32526c2d67dd3e9f3708c3dba0ef8a3a41c7a0e1..88b39102a7742f130edd10f6f192d962e9866652 100644 (file)
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     DataSize:        28
-; CHECK-NEXT:     DataAlignment:   8
 ; CHECK-NEXT:     SymbolInfo:      
 ; CHECK-NEXT:       - Name:            .L.str1
 ; CHECK-NEXT:         Flags:           2
 ; CHECK-NEXT:       - Name:            .L.str2
 ; CHECK-NEXT:         Flags:           2
-; CHECK-NEXT:     SegmentNames:    
+; CHECK-NEXT:     SegmentInfo:    
 ; CHECK-NEXT:       - Index:       0
 ; CHECK-NEXT:         Name:        .rodata..L.str1
+; CHECK-NEXT:         Alignment:   1
+; CHECK-NEXT:         Flags:       0
 ; CHECK-NEXT:       - Index:       1
 ; CHECK-NEXT:         Name:        .rodata..L.str2
+; CHECK-NEXT:         Alignment:   1
+; CHECK-NEXT:         Flags:       0
 ; CHECK-NEXT:       - Index:       2
 ; CHECK-NEXT:         Name:        .data.a
+; CHECK-NEXT:         Alignment:   8
+; CHECK-NEXT:         Flags:       0
 ; CHECK-NEXT:       - Index:       3
 ; CHECK-NEXT:         Name:        .data.b
+; CHECK-NEXT:         Alignment:   8
+; CHECK-NEXT:         Flags:       0
 ; CHECK_NEXT:   ...
index bdaaef7f0fb3d01d946de1eb9cfdd59613cd9a67..01ec201f9b4487bc9acc500f78d4ce891a7b981c 100644 (file)
@@ -101,17 +101,20 @@ entry:
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     DataSize:        12
-; CHECK-NEXT:     DataAlignment:   8
 ; CHECK-NEXT:     SymbolInfo:      
 ; CHECK-NEXT:       - Name:            foo_alias
 ; CHECK-NEXT:         Flags:           1
 ; CHECK-NEXT:       - Name:            bar_alias
 ; CHECK-NEXT:         Flags:           1
-; CHECK-NEXT:     SegmentNames:    
+; CHECK-NEXT:     SegmentInfo:    
 ; CHECK-NEXT:       - Index:           0
 ; CHECK-NEXT:         Name:            .data.bar
+; CHECK-NEXT:         Alignment:       8
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT:       - Index:           1
 ; CHECK-NEXT:         Name:            .data.bar_alias_address
+; CHECK-NEXT:         Alignment:       8
+; CHECK-NEXT:         Flags:           0
 ; CHECK-NEXT: ...
 
 ; CHECK-SYMS: SYMBOL TABLE:
index 1bc06fec5910a5625ac2ecff2f3c93ecc5e25528..b01c5015e9da8364ce6d0fec5aaaaf09219df271 100644 (file)
@@ -27,7 +27,6 @@ entry:
 ; CHECK-NEXT:   - Type:            CUSTOM
 ; CHECK-NEXT:     Name:            linking
 ; CHECK-NEXT:     DataSize:        0
-; CHECK-NEXT:     DataAlignment:   0
 ; CHECK-NEXT:     SymbolInfo:      
 ; CHECK-NEXT:       - Name:            weak_external_data
 ; CHECK-NEXT:         Flags:           1
index ab80c1e5029048fd70cfb5a9118510471a9d3229..d821b34b67df97e26944902de601b0efad199562 100644 (file)
@@ -27,7 +27,6 @@ Sections:
   - Type:            CUSTOM
     Name:            linking
     DataSize:        10
-    DataAlignment:   2
     SymbolInfo:
       - Name:            function_export
         Flags:           1
@@ -49,7 +48,6 @@ Sections:
 # CHECK:   - Type:            CUSTOM
 # CHECK:     Name:            linking
 # CHECK:     DataSize:        10
-# CHECK:     DataAlignment:   2
 # CHECK:     SymbolInfo:
 # CHECK:       - Name:            function_export
 # CHECK:         Flags:           1
index dffe4e3aa8d29e925c1dc5bd403c89f30d031c99..ad31fea774c1bd262abfab81b6f0866b245276bc 100644 (file)
@@ -53,7 +53,6 @@ Sections:
   - Type:            CUSTOM
     Name:            "linking"
     DataSize:        0
-    DataAlignment:   0
 
 # CHECK:      00000400 D bar
 # CHECK-NEXT:          U fimport
index bf2005be9e39fc5a6737bff5d5830b8232bd5eb6..82be0a675b0737f7a97c92adf0f4dd4a93908673 100644 (file)
@@ -23,7 +23,6 @@ Sections:
   - Type:            CUSTOM
     Name:            "linking"
     DataSize:        0
-    DataAlignment:   0
 
 # CHECK:    U bar
 # CHECK:    U foo
index 109b15888de38bd840a66b1b0152a17941eaa91b..0500c2d6df3883a1e96b8546372b44b291620eaa 100644 (file)
@@ -53,7 +53,6 @@ Sections:
   - Type:            CUSTOM
     Name:            linking
     DataSize:        0
-    DataAlignment:   2
     SymbolInfo:
       - Name:            weak_global_func
         Flags:           1
index ac1eca535fc6f7b06de9196906224f77fc342f9a..015c950d16cba8e5a772204ba954fa898a3c6dac 100644 (file)
@@ -568,6 +568,5 @@ WASM-NEXT:     Size: 22
 WASM-NEXT:     Offset: 257
 WASM-NEXT:     Name: linking
 WASM-NEXT:     DataSize: 13
-WASM-NEXT:     DataAlignment: 1
 WASM-NEXT:   }
 WASM-NEXT: ]
index 3bff4b80c8339849a3d321bc9e60928095505d8a..77711e749aa09e4dff273ba71686a90f971a3d8e 100644 (file)
@@ -156,8 +156,6 @@ void WasmDumper::printSections() {
       if (WasmSec.Name == "linking") {
         const wasm::WasmLinkingData &LinkingData = Obj->linkingData();
         W.printNumber("DataSize", LinkingData.DataSize);
-        if (LinkingData.DataAlignment)
-          W.printNumber("DataAlignment", LinkingData.DataAlignment);
       }
       break;
     case wasm::WASM_SEC_DATA: {
index d37599bd202d210166fbc408687545f989edd92d..27398e5b00b9e42a80ab6cc47d35cb5d9d768ea1 100644 (file)
@@ -68,10 +68,12 @@ std::unique_ptr<WasmYAML::CustomSection> WasmDumper::dumpCustomSection(const Was
     size_t Index = 0;
     for (const object::WasmSegment &Segment : Obj.dataSegments()) {
       if (!Segment.Data.Name.empty()) {
-        WasmYAML::NameEntry NameEntry;
-        NameEntry.Name = Segment.Data.Name;
-        NameEntry.Index = Index;
-        LinkingSec->SegmentNames.push_back(NameEntry);
+        WasmYAML::SegmentInfo SegmentInfo;
+        SegmentInfo.Name = Segment.Data.Name;
+        SegmentInfo.Index = Index;
+        SegmentInfo.Alignment = Segment.Data.Alignment;
+        SegmentInfo.Flags = Segment.Data.Flags;
+        LinkingSec->SegmentInfos.push_back(SegmentInfo);
       }
       Index++;
     }
@@ -83,7 +85,6 @@ std::unique_ptr<WasmYAML::CustomSection> WasmDumper::dumpCustomSection(const Was
       }
     }
     LinkingSec->DataSize = Obj.linkingData().DataSize;
-    LinkingSec->DataAlignment = Obj.linkingData().DataAlignment;
     CustomSec = std::move(LinkingSec);
   } else {
     CustomSec = make_unique<WasmYAML::CustomSection>(WasmSec.Name);
index 9dd7564720aa2958a4db4c89ba788eb18434e312..bb8f4ff3b5061ab399e0f3fa6143e7a136de4213 100644 (file)
@@ -140,11 +140,6 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &S
   encodeULEB128(Section.DataSize, SubSection.GetStream());
   SubSection.Done();
 
-  // DATA_ALIGNMENT subsection
-  encodeULEB128(wasm::WASM_DATA_ALIGNMENT, OS);
-  encodeULEB128(Section.DataAlignment, SubSection.GetStream());
-  SubSection.Done();
-
   // SYMBOL_INFO subsection
   if (Section.SymbolInfos.size()) {
     encodeULEB128(wasm::WASM_SYMBOL_INFO, OS);
@@ -159,12 +154,14 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &S
   }
 
   // SEGMENT_NAMES subsection
-  if (Section.SegmentNames.size()) {
-    encodeULEB128(wasm::WASM_SEGMENT_NAMES, OS);
-    encodeULEB128(Section.SegmentNames.size(), SubSection.GetStream());
-    for (const WasmYAML::NameEntry &NameEntry : Section.SegmentNames) {
-      encodeULEB128(NameEntry.Index, SubSection.GetStream());
-      writeStringRef(NameEntry.Name, SubSection.GetStream());
+  if (Section.SegmentInfos.size()) {
+    encodeULEB128(wasm::WASM_SEGMENT_INFO, OS);
+    encodeULEB128(Section.SegmentInfos.size(), SubSection.GetStream());
+    for (const WasmYAML::SegmentInfo &SegmentInfo : Section.SegmentInfos) {
+      encodeULEB128(SegmentInfo.Index, SubSection.GetStream());
+      writeStringRef(SegmentInfo.Name, SubSection.GetStream());
+      encodeULEB128(SegmentInfo.Alignment, SubSection.GetStream());
+      encodeULEB128(SegmentInfo.Flags, SubSection.GetStream());
     }
     SubSection.Done();
   }