diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp --- a/llvm/lib/MC/XCOFFObjectWriter.cpp +++ b/llvm/lib/MC/XCOFFObjectWriter.cpp @@ -148,6 +148,7 @@ uint32_t SymbolTableEntryCount = 0; uint32_t SymbolTableOffset = 0; + uint16_t SectionCount = 0; support::endian::Writer W; std::unique_ptr TargetObjectWriter; @@ -234,6 +235,7 @@ // Reset the symbol table and string table. SymbolTableEntryCount = 0; SymbolTableOffset = 0; + SectionCount = 0; Strings.clear(); MCObjectWriter::reset(); @@ -467,7 +469,7 @@ // Magic. W.write(0x01df); // Number of sections. - W.write(Sections.size()); + W.write(SectionCount); // Timestamp field. For reproducible output we write a 0, which represents no // timestamp. W.write(0); @@ -483,6 +485,10 @@ void XCOFFObjectWriter::writeSectionHeaderTable() { for (const auto *Sec : Sections) { + // Nothing to write for this Section. + if (Sec->Index == Section::UninitializedIndex) + continue; + // Write Name. ArrayRef NameRef(Sec->Name, XCOFF::NameSize); W.write(NameRef); @@ -509,6 +515,10 @@ void XCOFFObjectWriter::writeSymbolTable(const MCAsmLayout &Layout) { for (const auto *Section : Sections) { + // Nothing to write for this Section. + if (Section->Index == Section::UninitializedIndex) + continue; + for (const auto *Group : Section->Groups) { if (Group->Csects.empty()) continue; @@ -555,6 +565,7 @@ if (SectionIndex > MaxSectionIndex) report_fatal_error("Section index overflow!"); Section->Index = SectionIndex++; + SectionCount++; bool SectionAddressSet = false; for (auto *Group : Section->Groups) { @@ -598,12 +609,13 @@ // Calculate the RawPointer value for each section. uint64_t RawPointer = sizeof(XCOFF::FileHeader32) + auxiliaryHeaderSize() + - Sections.size() * sizeof(XCOFF::SectionHeader32); + SectionCount * sizeof(XCOFF::SectionHeader32); for (auto *Sec : Sections) { - if (!Sec->IsVirtual) { - Sec->FileOffsetToData = RawPointer; - RawPointer += Sec->Size; - } + if (Sec->Index == Section::UninitializedIndex || Sec->IsVirtual) + continue; + + Sec->FileOffsetToData = RawPointer; + RawPointer += Sec->Size; } // TODO Add in Relocation storage to the RawPointer Calculation.