diff options
| author | George Rimar <grimar@accesssoftek.com> | 2017-03-14 09:03:53 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2017-03-14 09:03:53 +0000 |
| commit | 2d2621090dfd0421d5a473b82f755b2033b0b068 (patch) | |
| tree | 8f40003858b7bacb0ec095da7a49bcb0570b2297 /lld/ELF | |
| parent | 5784e96f5c464dc483ca179fda6ae4406c4cfd78 (diff) | |
| download | bcm5719-llvm-2d2621090dfd0421d5a473b82f755b2033b0b068.tar.gz bcm5719-llvm-2d2621090dfd0421d5a473b82f755b2033b0b068.zip | |
[ELF] - Step to combine LinkerScript and LinkerScriptBase
We can move all not templated functionality to LinkerScriptBase.
Patch do that for hasPhdrsCommands() and shows how it helps to detemplate
things in other places.
Probably we should be able to merge these 2 classes into single one after such steps.
Even if not, it still looks as reasonable cleanup for me.
Differential revision: https://reviews.llvm.org/D30895
llvm-svn: 297714
Diffstat (limited to 'lld/ELF')
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 6 | ||||
| -rw-r--r-- | lld/ELF/LinkerScript.h | 38 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 18 | ||||
| -rw-r--r-- | lld/ELF/Writer.h | 1 |
4 files changed, 23 insertions, 40 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 7f68b5b6e46..85312fb165c 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -792,7 +792,7 @@ void LinkerScript<ELFT>::assignAddresses(std::vector<PhdrEntry> &Phdrs) { Sec->Addr = 0; } - allocateHeaders<ELFT>(Phdrs, *OutputSections, MinVA); + allocateHeaders(Phdrs, *OutputSections, MinVA); } // Creates program headers as instructed by PHDRS linker script command. @@ -902,10 +902,6 @@ template <class ELFT> int LinkerScript<ELFT>::getSectionIndex(StringRef Name) { return INT_MAX; } -template <class ELFT> bool LinkerScript<ELFT>::hasPhdrsCommands() { - return !Opt.PhdrsCommands.empty(); -} - template <class ELFT> OutputSection *LinkerScript<ELFT>::getOutputSection(const Twine &Loc, StringRef Name) { diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h index a268f4fd1ce..6d53cf71ce4 100644 --- a/lld/ELF/LinkerScript.h +++ b/lld/ELF/LinkerScript.h @@ -205,20 +205,6 @@ struct MemoryRegion { uint32_t NegFlags; }; -class LinkerScriptBase { -protected: - ~LinkerScriptBase() = default; - OutputSection *Aether; - -public: - virtual uint64_t getSymbolValue(const Twine &Loc, StringRef S) = 0; - uint64_t getDot() { return getSymbolValue("", "."); } - virtual bool isDefined(StringRef S) = 0; - virtual bool isAbsolute(StringRef S) = 0; - virtual OutputSection *getSymbolSection(StringRef S) = 0; - virtual OutputSection *getOutputSection(const Twine &Loc, StringRef S) = 0; - virtual uint64_t getOutputSectionSize(StringRef S) = 0; -}; // ScriptConfiguration holds linker script parse results. struct ScriptConfiguration { @@ -240,6 +226,26 @@ struct ScriptConfiguration { extern ScriptConfiguration *ScriptConfig; +class LinkerScriptBase { +protected: + ~LinkerScriptBase() = default; + OutputSection *Aether; + + // "ScriptConfig" is a bit too long, so define a short name for it. + ScriptConfiguration &Opt = *ScriptConfig; + +public: + bool hasPhdrsCommands() { return !Opt.PhdrsCommands.empty(); } + + virtual uint64_t getSymbolValue(const Twine &Loc, StringRef S) = 0; + uint64_t getDot() { return getSymbolValue("", "."); } + virtual bool isDefined(StringRef S) = 0; + virtual bool isAbsolute(StringRef S) = 0; + virtual OutputSection *getSymbolSection(StringRef S) = 0; + virtual OutputSection *getOutputSection(const Twine &Loc, StringRef S) = 0; + virtual uint64_t getOutputSectionSize(StringRef S) = 0; +}; + // This is a runner of the linker script. template <class ELFT> class LinkerScript final : public LinkerScriptBase { typedef typename ELFT::uint uintX_t; @@ -264,7 +270,6 @@ public: void assignOffsets(OutputSectionCommand *Cmd); void placeOrphanSections(); void assignAddresses(std::vector<PhdrEntry> &Phdrs); - bool hasPhdrsCommands(); uint64_t getSymbolValue(const Twine &Loc, StringRef S) override; bool isDefined(StringRef S) override; bool isAbsolute(StringRef S) override; @@ -287,9 +292,6 @@ private: std::vector<InputSectionBase *> createInputSectionList(OutputSectionCommand &Cmd); - // "ScriptConfig" is a bit too long, so define a short name for it. - ScriptConfiguration &Opt = *ScriptConfig; - std::vector<size_t> getPhdrIndices(StringRef SectionName); size_t getPhdrIndex(const Twine &Loc, StringRef PhdrName); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 3375fc25b54..c3f68ab4747 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1439,7 +1439,6 @@ template <class ELFT> void Writer<ELFT>::fixSectionAlignments() { } } -template <class ELFT> bool elf::allocateHeaders(std::vector<PhdrEntry> &Phdrs, ArrayRef<OutputSection *> OutputSections, uint64_t Min) { @@ -1466,7 +1465,7 @@ bool elf::allocateHeaders(std::vector<PhdrEntry> &Phdrs, Out::ElfHeader->Addr = Min; Out::ProgramHeaders->Addr = Min + Out::ElfHeader->Size; - if (Script<ELFT>::X->hasPhdrsCommands()) + if (ScriptBase->hasPhdrsCommands()) return true; if (FirstPTLoad->First) @@ -1495,7 +1494,7 @@ template <class ELFT> void Writer<ELFT>::fixHeaders() { for (const auto &P : Config->SectionStartMap) Min = std::min(Min, P.second); - AllocateHeader = allocateHeaders<ELFT>(Phdrs, OutputSections, Min); + AllocateHeader = allocateHeaders(Phdrs, OutputSections, Min); } // Assign VAs (addresses at run-time) to output sections. @@ -1877,19 +1876,6 @@ template void elf::writeResult<ELF32BE>(); template void elf::writeResult<ELF64LE>(); template void elf::writeResult<ELF64BE>(); -template bool elf::allocateHeaders<ELF32LE>(std::vector<PhdrEntry> &, - ArrayRef<OutputSection *>, - uint64_t); -template bool elf::allocateHeaders<ELF32BE>(std::vector<PhdrEntry> &, - ArrayRef<OutputSection *>, - uint64_t); -template bool elf::allocateHeaders<ELF64LE>(std::vector<PhdrEntry> &, - ArrayRef<OutputSection *>, - uint64_t); -template bool elf::allocateHeaders<ELF64BE>(std::vector<PhdrEntry> &, - ArrayRef<OutputSection *>, - uint64_t); - template bool elf::isRelroSection<ELF32LE>(const OutputSection *); template bool elf::isRelroSection<ELF32BE>(const OutputSection *); template bool elf::isRelroSection<ELF64LE>(const OutputSection *); diff --git a/lld/ELF/Writer.h b/lld/ELF/Writer.h index b89e984c9e5..a669e42ef20 100644 --- a/lld/ELF/Writer.h +++ b/lld/ELF/Writer.h @@ -49,7 +49,6 @@ struct PhdrEntry { llvm::StringRef getOutputSectionName(llvm::StringRef Name); -template <class ELFT> bool allocateHeaders(std::vector<PhdrEntry> &, llvm::ArrayRef<OutputSection *>, uint64_t Min); |

