[llvm] r236153 - Use pwrite to write the number of sections.

Rafael Espindola rafael.espindola at gmail.com
Wed Apr 29 13:39:37 PDT 2015


Author: rafael
Date: Wed Apr 29 15:39:37 2015
New Revision: 236153

URL: http://llvm.org/viewvc/llvm-project?rev=236153&view=rev
Log:
Use pwrite to write the number of sections.

This avoids having to compute the number upfront, which will be used in the
next patch.

Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=236153&r1=236152&r2=236153&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Apr 29 15:39:37 2015
@@ -194,8 +194,7 @@ class ELFObjectWriter : public MCObjectW
       FWriter.write(F, Value);
     }
 
-    void WriteHeader(const MCAssembler &Asm,
-                     unsigned NumberOfSections);
+    void writeHeader(const MCAssembler &Asm);
 
     void WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD,
                      const MCAsmLayout &Layout);
@@ -405,8 +404,7 @@ ELFObjectWriter::~ELFObjectWriter()
 {}
 
 // Emit the ELF header.
-void ELFObjectWriter::WriteHeader(const MCAssembler &Asm,
-                                  unsigned NumberOfSections) {
+void ELFObjectWriter::writeHeader(const MCAssembler &Asm) {
   // ELF Header
   // ----------
   //
@@ -451,10 +449,7 @@ void ELFObjectWriter::WriteHeader(const
   Write16(is64Bit() ? sizeof(ELF::Elf64_Shdr) : sizeof(ELF::Elf32_Shdr));
 
   // e_shnum     = # of section header ents
-  if (NumberOfSections >= ELF::SHN_LORESERVE)
-    Write16(ELF::SHN_UNDEF);
-  else
-    Write16(NumberOfSections);
+  Write16(0);
 
   // e_shstrndx  = Section # of '.shstrtab'
   assert(ShstrtabIndex < ELF::SHN_LORESERVE);
@@ -1577,11 +1572,10 @@ void ELFObjectWriter::WriteObject(MCAsse
 
   CreateMetadataSections(Asm, Layout, Sections);
 
-  unsigned NumSections = Asm.size() + 2;
   SectionOffsetsTy SectionOffsets;
 
   // Write out the ELF header ...
-  WriteHeader(Asm, NumSections + 1);
+  writeHeader(Asm);
 
   // ... then the sections ...
   SectionOffsets.push_back(std::make_pair(0, 0));
@@ -1620,19 +1614,30 @@ void ELFObjectWriter::WriteObject(MCAsse
   // ... then the section header table ...
   writeSectionHeader(Sections, Asm, Layout, SectionIndexMap, SectionOffsets);
 
+  uint16_t NumSections = (Sections.size() + 1 >= ELF::SHN_LORESERVE)
+                             ? ELF::SHN_UNDEF
+                             : Sections.size() + 1;
+  if (sys::IsLittleEndianHost != IsLittleEndian)
+    sys::swapByteOrder(NumSections);
+  unsigned NumSectionsOffset;
+
   if (is64Bit()) {
     uint64_t Val = SectionHeaderOffset;
     if (sys::IsLittleEndianHost != IsLittleEndian)
       sys::swapByteOrder(Val);
     OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),
               offsetof(ELF::Elf64_Ehdr, e_shoff));
+    NumSectionsOffset = offsetof(ELF::Elf64_Ehdr, e_shnum);
   } else {
     uint32_t Val = SectionHeaderOffset;
     if (sys::IsLittleEndianHost != IsLittleEndian)
       sys::swapByteOrder(Val);
     OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val),
               offsetof(ELF::Elf32_Ehdr, e_shoff));
+    NumSectionsOffset = offsetof(ELF::Elf32_Ehdr, e_shnum);
   }
+  OS.pwrite(reinterpret_cast<char *>(&NumSections), sizeof(NumSections),
+            NumSectionsOffset);
 }
 
 bool ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(





More information about the llvm-commits mailing list