diff options
author | Rui Ueyama <ruiu@google.com> | 2016-03-13 04:05:42 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-03-13 04:05:42 +0000 |
commit | a969218f9138f9aa5d730aaee7d10ff0cde10bd4 (patch) | |
tree | 49a2dfd4fe6b8e991c39602c8550cf71a826a48e | |
parent | 84be8c52196f812d6fbdcb96f534dd10b6e35fe4 (diff) | |
download | bcm5719-llvm-a969218f9138f9aa5d730aaee7d10ff0cde10bd4.tar.gz bcm5719-llvm-a969218f9138f9aa5d730aaee7d10ff0cde10bd4.zip |
Split addCopyRelSymbols. NFC.
llvm-svn: 263360
-rw-r--r-- | lld/ELF/Writer.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 14d7e347254..c935970f250 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -89,6 +89,8 @@ private: void addCommonSymbols(std::vector<DefinedCommon *> &Syms); void addCopyRelSymbols(std::vector<SharedSymbol<ELFT> *> &Syms); + static uint32_t getAlignment(SharedSymbol<ELFT> *SS); + std::unique_ptr<llvm::FileOutputBuffer> Buffer; BumpPtrAllocator Alloc; @@ -723,26 +725,32 @@ void Writer<ELFT>::addCommonSymbols(std::vector<DefinedCommon *> &Syms) { Out<ELFT>::Bss->setSize(Off); } +template <class ELFT> +uint32_t Writer<ELFT>::getAlignment(SharedSymbol<ELFT> *SS) { + const Elf_Sym &Sym = SS->Sym; + const Elf_Shdr *Sec = SS->File->getSection(Sym); + uintX_t SecAlign = Sec->sh_addralign; + int TrailingZeros = std::min(countTrailingZeros(SecAlign), + countTrailingZeros((uintX_t)Sym.st_value)); + return 1 << TrailingZeros; +} + // Reserve space in .bss for copy relocations. template <class ELFT> void Writer<ELFT>::addCopyRelSymbols(std::vector<SharedSymbol<ELFT> *> &Syms) { if (Syms.empty()) return; uintX_t Off = getBss()->getSize(); - for (SharedSymbol<ELFT> *C : Syms) { - const Elf_Sym &Sym = C->Sym; - const Elf_Shdr *Sec = C->File->getSection(Sym); - uintX_t SecAlign = Sec->sh_addralign; - unsigned TrailingZeros = - std::min(countTrailingZeros(SecAlign), - countTrailingZeros((uintX_t)Sym.st_value)); - uintX_t Align = 1 << TrailingZeros; - Out<ELFT>::Bss->updateAlign(Align); + uintX_t MaxAlign = Out<ELFT>::Bss->getAlign(); + for (SharedSymbol<ELFT> *SS : Syms) { + uintX_t Align = getAlignment(SS); Off = alignTo(Off, Align); - C->OffsetInBss = Off; - Off += Sym.st_size; + SS->OffsetInBss = Off; + Off += SS->Sym.st_size; + MaxAlign = std::max(MaxAlign, Align); } Out<ELFT>::Bss->setSize(Off); + Out<ELFT>::Bss->updateAlign(MaxAlign); } template <class ELFT> |