[PATCH] D69447: [NFCI][XCOFF][AIX] Skip empty Section during object file generation

Jason Liu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 26 09:39:10 PDT 2019


jasonliu updated this revision to Diff 226541.
jasonliu added a comment.

Change SectionCount type to unsigned.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69447/new/

https://reviews.llvm.org/D69447

Files:
  llvm/lib/MC/XCOFFObjectWriter.cpp


Index: llvm/lib/MC/XCOFFObjectWriter.cpp
===================================================================
--- llvm/lib/MC/XCOFFObjectWriter.cpp
+++ 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<MCXCOFFObjectTargetWriter> 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<uint16_t>(0x01df);
   // Number of sections.
-  W.write<uint16_t>(Sections.size());
+  W.write<uint16_t>(SectionCount);
   // Timestamp field. For reproducible output we write a 0, which represents no
   // timestamp.
   W.write<int32_t>(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<char> 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.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69447.226541.patch
Type: text/x-patch
Size: 2511 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191026/a3ccdf5f/attachment-0001.bin>


More information about the llvm-commits mailing list