From d83a2faacd3bce3885bb9574ec4169c9c8943144 Mon Sep 17 00:00:00 2001 From: jasonliu Date: Mon, 28 Oct 2019 21:46:22 +0000 Subject: [NFCI][XCOFF][AIX] Skip empty Section during object file generation This is a fix to D69112 where we common up the logic of writing CsectGroup. However, we forget to skip the Sections that are empty in that patch. Reviewed by: daltenty, xingxue Differential Revision: https://reviews.llvm.org/D69447 --- llvm/lib/MC/XCOFFObjectWriter.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'llvm/lib/MC/XCOFFObjectWriter.cpp') diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp index 3199c18fc16..05f3f769e5b 100644 --- a/llvm/lib/MC/XCOFFObjectWriter.cpp +++ b/llvm/lib/MC/XCOFFObjectWriter.cpp @@ -148,6 +148,7 @@ class XCOFFObjectWriter : public MCObjectWriter { uint32_t SymbolTableEntryCount = 0; uint32_t SymbolTableOffset = 0; + uint16_t SectionCount = 0; support::endian::Writer W; std::unique_ptr TargetObjectWriter; @@ -234,6 +235,7 @@ void XCOFFObjectWriter::reset() { // Reset the symbol table and string table. SymbolTableEntryCount = 0; SymbolTableOffset = 0; + SectionCount = 0; Strings.clear(); MCObjectWriter::reset(); @@ -467,7 +469,7 @@ void XCOFFObjectWriter::writeFileHeader() { // 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::writeFileHeader() { 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::writeSectionHeaderTable() { 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 @@ void XCOFFObjectWriter::assignAddressesAndIndices(const MCAsmLayout &Layout) { 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 @@ void XCOFFObjectWriter::assignAddressesAndIndices(const MCAsmLayout &Layout) { // 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. -- cgit v1.2.3