Define align() and use that instead of RoundUpToAlignment().

The name "RoundUpToAlignment" is too long compared to what it does.

llvm-svn: 256993
This commit is contained in:
Rui Ueyama 2016-01-06 23:25:42 +00:00
parent bc82dedd26
commit f71358dcc9
3 changed files with 18 additions and 14 deletions

View File

@ -770,7 +770,7 @@ void OutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
this->Header.sh_addralign = Align; this->Header.sh_addralign = Align;
uintX_t Off = this->Header.sh_size; uintX_t Off = this->Header.sh_size;
Off = RoundUpToAlignment(Off, Align); Off = align(Off, Align);
S->OutSecOff = Off; S->OutSecOff = Off;
Off += S->getSize(); Off += S->getSize();
this->Header.sh_size = Off; this->Header.sh_size = Off;
@ -971,7 +971,7 @@ void EHOutputSection<ELFT>::addSectionAux(
auto P = CieMap.insert(std::make_pair(CieInfo, Cies.size())); auto P = CieMap.insert(std::make_pair(CieInfo, Cies.size()));
if (P.second) { if (P.second) {
Cies.push_back(C); Cies.push_back(C);
this->Header.sh_size += RoundUpToAlignment(Length, sizeof(uintX_t)); this->Header.sh_size += align(Length, sizeof(uintX_t));
} }
OffsetToIndex[Offset] = P.first->second; OffsetToIndex[Offset] = P.first->second;
} else { } else {
@ -984,7 +984,7 @@ void EHOutputSection<ELFT>::addSectionAux(
if (I == OffsetToIndex.end()) if (I == OffsetToIndex.end())
error("Invalid CIE reference"); error("Invalid CIE reference");
Cies[I->second].Fdes.push_back(EHRegion<ELFT>(S, Index)); Cies[I->second].Fdes.push_back(EHRegion<ELFT>(S, Index));
this->Header.sh_size += RoundUpToAlignment(Length, sizeof(uintX_t)); this->Header.sh_size += align(Length, sizeof(uintX_t));
} }
} }
@ -1037,7 +1037,7 @@ static typename ELFFile<ELFT>::uintX_t writeAlignedCieOrFde(StringRef Data,
uint8_t *Buf) { uint8_t *Buf) {
typedef typename ELFFile<ELFT>::uintX_t uintX_t; typedef typename ELFFile<ELFT>::uintX_t uintX_t;
const endianness E = ELFT::TargetEndianness; const endianness E = ELFT::TargetEndianness;
uint64_t Len = RoundUpToAlignment(Data.size(), sizeof(uintX_t)); uint64_t Len = align(Data.size(), sizeof(uintX_t));
write32<E>(Buf, Len - 4); write32<E>(Buf, Len - 4);
memcpy(Buf + 4, Data.data() + 4, Data.size() - 4); memcpy(Buf + 4, Data.data() + 4, Data.size() - 4);
return Len; return Len;

View File

@ -432,6 +432,10 @@ private:
uint32_t GprMask = 0; uint32_t GprMask = 0;
}; };
inline uint64_t align(uint64_t Value, uint64_t Align) {
return (Value + Align - 1) & ~(Align - 1);
}
// All output sections that are hadnled by the linker specially are // All output sections that are hadnled by the linker specially are
// globally accessible. Writer initializes them, so don't use them // globally accessible. Writer initializes them, so don't use them
// until Writer is initialized. // until Writer is initialized.

View File

@ -491,7 +491,7 @@ void Writer<ELFT>::addCommonSymbols(std::vector<DefinedCommon *> &Syms) {
uintX_t Off = getBss()->getSize(); uintX_t Off = getBss()->getSize();
for (DefinedCommon *C : Syms) { for (DefinedCommon *C : Syms) {
uintX_t Align = C->MaxAlignment; uintX_t Align = C->MaxAlignment;
Off = RoundUpToAlignment(Off, Align); Off = align(Off, Align);
C->OffsetInBss = Off; C->OffsetInBss = Off;
Off += C->Size; Off += C->Size;
} }
@ -514,7 +514,7 @@ void Writer<ELFT>::addCopyRelSymbols(std::vector<SharedSymbol<ELFT> *> &Syms) {
countTrailingZeros((uintX_t)Sym.st_value)); countTrailingZeros((uintX_t)Sym.st_value));
uintX_t Align = 1 << TrailingZeros; uintX_t Align = 1 << TrailingZeros;
Out<ELFT>::Bss->updateAlign(Align); Out<ELFT>::Bss->updateAlign(Align);
Off = RoundUpToAlignment(Off, Align); Off = align(Off, Align);
C->OffsetInBss = Off; C->OffsetInBss = Off;
Off += Sym.st_size; Off += Sym.st_size;
} }
@ -1024,8 +1024,8 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
bool InRelRo = Config->ZRelro && (Flags & PF_W) && isRelroSection(Sec); bool InRelRo = Config->ZRelro && (Flags & PF_W) && isRelroSection(Sec);
bool FirstNonRelRo = GnuRelroPhdr.p_type && !InRelRo && !RelroAligned; bool FirstNonRelRo = GnuRelroPhdr.p_type && !InRelRo && !RelroAligned;
if (FirstNonRelRo || PH->p_flags != Flags) { if (FirstNonRelRo || PH->p_flags != Flags) {
VA = RoundUpToAlignment(VA, Target->getPageSize()); VA = align(VA, Target->getPageSize());
FileOff = RoundUpToAlignment(FileOff, Target->getPageSize()); FileOff = align(FileOff, Target->getPageSize());
if (FirstNonRelRo) if (FirstNonRelRo)
RelroAligned = true; RelroAligned = true;
} }
@ -1040,8 +1040,8 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
if (!TlsPhdr.p_vaddr) if (!TlsPhdr.p_vaddr)
setPhdr(&TlsPhdr, PT_TLS, PF_R, FileOff, VA, 0, Sec->getAlign()); setPhdr(&TlsPhdr, PT_TLS, PF_R, FileOff, VA, 0, Sec->getAlign());
if (Sec->getType() != SHT_NOBITS) if (Sec->getType() != SHT_NOBITS)
VA = RoundUpToAlignment(VA, Sec->getAlign()); VA = align(VA, Sec->getAlign());
uintX_t TVA = RoundUpToAlignment(VA + ThreadBssOffset, Sec->getAlign()); uintX_t TVA = align(VA + ThreadBssOffset, Sec->getAlign());
Sec->setVA(TVA); Sec->setVA(TVA);
TlsPhdr.p_memsz += Sec->getSize(); TlsPhdr.p_memsz += Sec->getSize();
if (Sec->getType() == SHT_NOBITS) { if (Sec->getType() == SHT_NOBITS) {
@ -1052,7 +1052,7 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
} }
TlsPhdr.p_align = std::max<uintX_t>(TlsPhdr.p_align, Sec->getAlign()); TlsPhdr.p_align = std::max<uintX_t>(TlsPhdr.p_align, Sec->getAlign());
} else { } else {
VA = RoundUpToAlignment(VA, Sec->getAlign()); VA = align(VA, Sec->getAlign());
Sec->setVA(VA); Sec->setVA(VA);
VA += Sec->getSize(); VA += Sec->getSize();
if (InRelRo) if (InRelRo)
@ -1060,7 +1060,7 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
} }
} }
FileOff = RoundUpToAlignment(FileOff, Sec->getAlign()); FileOff = align(FileOff, Sec->getAlign());
Sec->setFileOffset(FileOff); Sec->setFileOffset(FileOff);
if (Sec->getType() != SHT_NOBITS) if (Sec->getType() != SHT_NOBITS)
FileOff += Sec->getSize(); FileOff += Sec->getSize();
@ -1073,7 +1073,7 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
if (TlsPhdr.p_vaddr) { if (TlsPhdr.p_vaddr) {
// The TLS pointer goes after PT_TLS. At least glibc will align it, // The TLS pointer goes after PT_TLS. At least glibc will align it,
// so round up the size to make sure the offsets are correct. // so round up the size to make sure the offsets are correct.
TlsPhdr.p_memsz = RoundUpToAlignment(TlsPhdr.p_memsz, TlsPhdr.p_align); TlsPhdr.p_memsz = align(TlsPhdr.p_memsz, TlsPhdr.p_align);
Phdrs[++PhdrIdx] = TlsPhdr; Phdrs[++PhdrIdx] = TlsPhdr;
Out<ELFT>::TlsPhdr = &Phdrs[PhdrIdx]; Out<ELFT>::TlsPhdr = &Phdrs[PhdrIdx];
} }
@ -1105,7 +1105,7 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
} }
// Add space for section headers. // Add space for section headers.
SectionHeaderOff = RoundUpToAlignment(FileOff, ELFT::Is64Bits ? 8 : 4); SectionHeaderOff = align(FileOff, ELFT::Is64Bits ? 8 : 4);
FileSize = SectionHeaderOff + getNumSections() * sizeof(Elf_Shdr); FileSize = SectionHeaderOff + getNumSections() * sizeof(Elf_Shdr);
// Update "_end" and "end" symbols so that they // Update "_end" and "end" symbols so that they