Use pwrite to write the number of sections.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236153 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-04-29 20:39:37 +00:00
parent 35684a13d4
commit 840bb0f332

View File

@ -194,8 +194,7 @@ class ELFObjectWriter : public MCObjectWriter {
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 MCAssembler &Asm,
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(MCAssembler &Asm,
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(MCAssembler &Asm,
// ... 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(