diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-10 22:49:06 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-10 22:49:06 +0000 |
commit | dd34a4d3c58bbea8f64e8b8b80801d830608b33f (patch) | |
tree | 154ec2b195420c4c0b3a797e68838042b36880f7 | |
parent | 0a5661fa5807578d0608913dce3e7e7783840750 (diff) | |
download | bcm5719-llvm-dd34a4d3c58bbea8f64e8b8b80801d830608b33f.tar.gz bcm5719-llvm-dd34a4d3c58bbea8f64e8b8b80801d830608b33f.zip |
Make a few details of the string and symbol table private.
This is in preparation to adding a dynamic string table.
llvm-svn: 247355
-rw-r--r-- | lld/ELF/Writer.cpp | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 2ee292b3727..294c44d727b 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -111,8 +111,6 @@ namespace { template <bool Is64Bits> class StringTableSection final : public OutputSectionBase<Is64Bits> { public: - llvm::StringTableBuilder StrTabBuilder; - typedef typename OutputSectionBase<Is64Bits>::uintX_t uintX_t; StringTableSection(bool Dynamic) : OutputSectionBase<Is64Bits>(Dynamic ? ".dynstr" : ".strtab", SHT_STRTAB, @@ -121,13 +119,17 @@ public: } void add(StringRef S) { StrTabBuilder.add(S); } - size_t getFileOff(StringRef S) { return StrTabBuilder.getOffset(S); } + size_t getFileOff(StringRef S) const { return StrTabBuilder.getOffset(S); } + StringRef data() const { return StrTabBuilder.data(); } void writeTo(uint8_t *Buf) override; void finalize() override { StrTabBuilder.finalize(StringTableBuilder::ELF); this->Header.sh_size = StrTabBuilder.data().size(); } + +private: + llvm::StringTableBuilder StrTabBuilder; }; template <class ELFT> @@ -138,7 +140,7 @@ public: SymbolTableSection(SymbolTable &Table, StringTableSection<ELFT::Is64Bits> &StrTabSec) : OutputSectionBase<ELFT::Is64Bits>(".symtab", SHT_SYMTAB, 0), - Table(Table), Builder(StrTabSec.StrTabBuilder), StrTabSec(StrTabSec) { + Table(Table), StrTabSec(StrTabSec) { typedef OutputSectionBase<ELFT::Is64Bits> Base; typename Base::HeaderT &Header = this->Header; @@ -158,13 +160,17 @@ public: const SymbolTable &getSymTable() { return Table; } + void addSymbol(StringRef Name) { + StrTabSec.add(Name); + ++NumVisible; + } + OutputSection<ELFT> *BSSSec = nullptr; - unsigned NumVisible = 0; private: SymbolTable &Table; - llvm::StringTableBuilder &Builder; - const StringTableSection<ELFT::Is64Bits> &StrTabSec; + StringTableSection<ELFT::Is64Bits> &StrTabSec; + unsigned NumVisible = 0; }; template <bool Is64Bits> @@ -210,7 +216,7 @@ public: ++P; P->d_tag = DT_STRSZ; - P->d_un.d_val = DynStrSec.StrTabBuilder.data().size(); + P->d_un.d_val = DynStrSec.data().size(); ++P; const std::vector<std::unique_ptr<SharedFileBase>> &SharedFiles = @@ -397,7 +403,7 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) { const Elf_Sym &InputSym = cast<ELFSymbolBody<ELFT>>(Body)->Sym; auto *ESym = reinterpret_cast<Elf_Sym *>(Buf); - ESym->st_name = Builder.getOffset(Name); + ESym->st_name = StrTabSec.getFileOff(Name); const SectionChunk<ELFT> *Section = nullptr; OutputSection<ELFT> *Out = nullptr; @@ -543,8 +549,6 @@ template <class ELFT> void Writer<ELFT>::createSections() { SymTable.BSSSec = getSection(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE); OutputSection<ELFT> *BSSSec = SymTable.BSSSec; // FIXME: Try to avoid the extra walk over all global symbols. - unsigned &NumVisible = SymTable.NumVisible; - llvm::StringTableBuilder &Builder = StrTabSec.StrTabBuilder; std::vector<DefinedCommon<ELFT> *> CommonSymbols; for (auto &P : Symtab.getSymbols()) { StringRef Name = P.first; @@ -553,8 +557,7 @@ template <class ELFT> void Writer<ELFT>::createSections() { CommonSymbols.push_back(C); if (!includeInSymtab(*Body)) continue; - NumVisible++; - Builder.add(Name); + SymTable.addSymbol(Name); } // Sort the common symbols by alignment as an heuristic to pack them better. |