ELF2: Remove Writer member varaibles that are used only by one function.

llvm-svn: 249958
This commit is contained in:
Rui Ueyama 2015-10-10 23:59:57 +00:00
parent 69960baad5
commit 953c2c4b2d
1 changed files with 33 additions and 31 deletions

View File

@ -77,13 +77,8 @@ private:
uintX_t VA, uintX_t Align);
void phdrCopy(Elf_Phdr *PH, OutputSectionBase<ELFT::Is64Bits> *From);
llvm::BumpPtrAllocator PAlloc;
SymbolTable<ELFT> &Symtab;
std::vector<Elf_Phdr *> Phdrs;
Elf_Phdr PhdrPhdr;
Elf_Phdr FileHeaderPhdr;
Elf_Phdr InterpPhdr;
Elf_Phdr DynamicPhdr;
std::vector<Elf_Phdr> Phdrs;
uintX_t FileSize;
uintX_t SectionHeaderOff;
@ -462,10 +457,6 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
uintX_t VA = getVAStart() + sizeof(Elf_Ehdr);
uintX_t FileOff = sizeof(Elf_Ehdr);
// The first Phdr entry is PT_PHDR which describes the program header itself.
Phdrs.push_back(&PhdrPhdr);
phdrSet(&PhdrPhdr, PT_PHDR, PF_R, FileOff, VA, /*Align=*/8);
// Reserve space for Phdrs.
int NumPhdrs = 2; // 2 for PhdrPhdr and FileHeaderPhdr
if (needsInterpSection())
@ -482,22 +473,32 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
++NumPhdrs;
}
}
Phdrs.reserve(NumPhdrs);
// The first Phdr entry is PT_PHDR which describes the program header itself.
Phdrs.emplace_back();
Elf_Phdr *PhdrPhdr = &Phdrs.back();
phdrSet(PhdrPhdr, PT_PHDR, PF_R, FileOff, VA, /*Align=*/8);
FileOff += sizeof(Elf_Phdr) * NumPhdrs;
VA += sizeof(Elf_Phdr) * NumPhdrs;
if (needsInterpSection())
Phdrs.push_back(&InterpPhdr);
Elf_Phdr *Interp = nullptr;
if (needsInterpSection()) {
Phdrs.emplace_back();
Interp = &Phdrs.back();
}
// Create a Phdr for the file header.
Phdrs.push_back(&FileHeaderPhdr);
phdrSet(&FileHeaderPhdr, PT_LOAD, PF_R, 0, getVAStart(),
Target->getPageSize());
Phdrs.emplace_back();
Elf_Phdr *FileHeader = &Phdrs.back();
phdrSet(FileHeader, PT_LOAD, PF_R, 0, getVAStart(), Target->getPageSize());
std::unordered_set<Elf_Phdr *> Closed;
for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections) {
if (Sec->getSize()) {
uintX_t Flags = toPhdrFlags(Sec->getFlags());
Elf_Phdr *Last = Phdrs.back();
Elf_Phdr *Last = &Phdrs.back();
if (Last->p_flags != Flags || !needsPhdr<ELFT>(Sec)) {
// Flags changed. End current Phdr and potentially create a new one.
if (Closed.insert(Last).second) {
@ -508,9 +509,9 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
if (needsPhdr<ELFT>(Sec)) {
VA = RoundUpToAlignment(VA, Target->getPageSize());
FileOff = RoundUpToAlignment(FileOff, Target->getPageSize());
auto *PH = new (PAlloc) Elf_Phdr;
Phdrs.emplace_back();
Elf_Phdr *PH = &Phdrs.back();
phdrSet(PH, PT_LOAD, Flags, FileOff, VA, Target->getPageSize());
Phdrs.push_back(PH);
}
}
}
@ -528,25 +529,26 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
FileOff += Size;
}
if (needsInterpSection()) {
InterpPhdr.p_type = PT_INTERP;
phdrCopy(&InterpPhdr, Out<ELFT>::Interp);
if (Interp) {
Interp->p_type = PT_INTERP;
phdrCopy(Interp, Out<ELFT>::Interp);
}
if (needsDynamicSections()) {
Phdrs.push_back(&DynamicPhdr);
DynamicPhdr.p_type = PT_DYNAMIC;
phdrCopy(&DynamicPhdr, Out<ELFT>::Dynamic);
Phdrs.emplace_back();
Elf_Phdr *PH = &Phdrs.back();
PH->p_type = PT_DYNAMIC;
phdrCopy(PH, Out<ELFT>::Dynamic);
}
// Fix up the first entry's size.
PhdrPhdr.p_filesz = sizeof(Elf_Phdr) * Phdrs.size();
PhdrPhdr.p_memsz = sizeof(Elf_Phdr) * Phdrs.size();
PhdrPhdr->p_filesz = sizeof(Elf_Phdr) * Phdrs.size();
PhdrPhdr->p_memsz = sizeof(Elf_Phdr) * Phdrs.size();
// If nothing was merged into the file header PT_LOAD, set the size correctly.
if (FileHeaderPhdr.p_filesz == Target->getPageSize()) {
if (FileHeader->p_filesz == Target->getPageSize()) {
uint64_t Size = sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * Phdrs.size();
FileHeaderPhdr.p_filesz = Size;
FileHeaderPhdr.p_memsz = Size;
FileHeader->p_filesz = Size;
FileHeader->p_memsz = Size;
}
// Add space for section headers.
@ -591,8 +593,8 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
EHdr->e_shstrndx = Out<ELFT>::StrTab->getSectionIndex();
auto PHdrs = reinterpret_cast<Elf_Phdr *>(Buf + EHdr->e_phoff);
for (Elf_Phdr *PH : Phdrs)
*PHdrs++ = *PH;
for (Elf_Phdr &PH : Phdrs)
*PHdrs++ = PH;
auto SHdrs = reinterpret_cast<Elf_Shdr *>(Buf + EHdr->e_shoff);
// First entry is null.