diff options
| -rw-r--r-- | lld/ELF/OutputSections.cpp | 8 | ||||
| -rw-r--r-- | lld/ELF/OutputSections.h | 4 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 20 |
3 files changed, 18 insertions, 14 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 3ec498ec211..97092eb3825 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -770,7 +770,7 @@ void OutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) { this->Header.sh_addralign = Align; uintX_t Off = this->Header.sh_size; - Off = RoundUpToAlignment(Off, Align); + Off = align(Off, Align); S->OutSecOff = Off; Off += S->getSize(); this->Header.sh_size = Off; @@ -971,7 +971,7 @@ void EHOutputSection<ELFT>::addSectionAux( auto P = CieMap.insert(std::make_pair(CieInfo, Cies.size())); if (P.second) { 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; } else { @@ -984,7 +984,7 @@ void EHOutputSection<ELFT>::addSectionAux( if (I == OffsetToIndex.end()) error("Invalid CIE reference"); 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) { typedef typename ELFFile<ELFT>::uintX_t uintX_t; 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); memcpy(Buf + 4, Data.data() + 4, Data.size() - 4); return Len; diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index 89952bbd6a7..4e259131154 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -432,6 +432,10 @@ private: 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 // globally accessible. Writer initializes them, so don't use them // until Writer is initialized. diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 0e141723bc6..411db7416de 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -491,7 +491,7 @@ void Writer<ELFT>::addCommonSymbols(std::vector<DefinedCommon *> &Syms) { uintX_t Off = getBss()->getSize(); for (DefinedCommon *C : Syms) { uintX_t Align = C->MaxAlignment; - Off = RoundUpToAlignment(Off, Align); + Off = align(Off, Align); C->OffsetInBss = Off; Off += C->Size; } @@ -514,7 +514,7 @@ void Writer<ELFT>::addCopyRelSymbols(std::vector<SharedSymbol<ELFT> *> &Syms) { countTrailingZeros((uintX_t)Sym.st_value)); uintX_t Align = 1 << TrailingZeros; Out<ELFT>::Bss->updateAlign(Align); - Off = RoundUpToAlignment(Off, Align); + Off = align(Off, Align); C->OffsetInBss = Off; 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 FirstNonRelRo = GnuRelroPhdr.p_type && !InRelRo && !RelroAligned; if (FirstNonRelRo || PH->p_flags != Flags) { - VA = RoundUpToAlignment(VA, Target->getPageSize()); - FileOff = RoundUpToAlignment(FileOff, Target->getPageSize()); + VA = align(VA, Target->getPageSize()); + FileOff = align(FileOff, Target->getPageSize()); if (FirstNonRelRo) RelroAligned = true; } @@ -1040,8 +1040,8 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() { if (!TlsPhdr.p_vaddr) setPhdr(&TlsPhdr, PT_TLS, PF_R, FileOff, VA, 0, Sec->getAlign()); if (Sec->getType() != SHT_NOBITS) - VA = RoundUpToAlignment(VA, Sec->getAlign()); - uintX_t TVA = RoundUpToAlignment(VA + ThreadBssOffset, Sec->getAlign()); + VA = align(VA, Sec->getAlign()); + uintX_t TVA = align(VA + ThreadBssOffset, Sec->getAlign()); Sec->setVA(TVA); TlsPhdr.p_memsz += Sec->getSize(); 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()); } else { - VA = RoundUpToAlignment(VA, Sec->getAlign()); + VA = align(VA, Sec->getAlign()); Sec->setVA(VA); VA += Sec->getSize(); 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); if (Sec->getType() != SHT_NOBITS) FileOff += Sec->getSize(); @@ -1073,7 +1073,7 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() { if (TlsPhdr.p_vaddr) { // 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. - TlsPhdr.p_memsz = RoundUpToAlignment(TlsPhdr.p_memsz, TlsPhdr.p_align); + TlsPhdr.p_memsz = align(TlsPhdr.p_memsz, TlsPhdr.p_align); Phdrs[++PhdrIdx] = TlsPhdr; Out<ELFT>::TlsPhdr = &Phdrs[PhdrIdx]; } @@ -1105,7 +1105,7 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() { } // 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); // Update "_end" and "end" symbols so that they |

