[lld] r280910 - [ELF] - Linkerscript: simplify access to templated methods from parser.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 8 01:19:14 PDT 2016
Author: grimar
Date: Thu Sep 8 03:19:13 2016
New Revision: 280910
URL: http://llvm.org/viewvc/llvm-project?rev=280910&view=rev
Log:
[ELF] - Linkerscript: simplify access to templated methods from parser.
Previous way of accessing templated methods was a bit bulky,
Patch introduces small interface based solution.
Differential revision: https://reviews.llvm.org/D23872
Modified:
lld/trunk/ELF/Driver.cpp
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/ELF/LinkerScript.h
Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=280910&r1=280909&r2=280910&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Thu Sep 8 03:19:13 2016
@@ -569,7 +569,7 @@ template <class ELFT> void LinkerDriver:
std::unique_ptr<TargetInfo> TI(createTarget());
Target = TI.get();
LinkerScript<ELFT> LS;
- Script<ELFT>::X = &LS;
+ ScriptBase = Script<ELFT>::X = &LS;
Config->Rela = ELFT::Is64Bits || Config->EMachine == EM_X86_64;
Config->Mips64EL =
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=280910&r1=280909&r2=280910&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Sep 8 03:19:13 2016
@@ -41,6 +41,7 @@ using namespace llvm::object;
using namespace lld;
using namespace lld::elf;
+LinkerScriptBase *elf::ScriptBase;
ScriptConfiguration *elf::ScriptConfig;
template <class ELFT>
@@ -556,8 +557,7 @@ template <class ELFT> bool LinkerScript<
}
template <class ELFT>
-typename ELFT::uint
-LinkerScript<ELFT>::getOutputSectionAddress(StringRef Name) {
+uint64_t LinkerScript<ELFT>::getOutputSectionAddress(StringRef Name) {
for (OutputSectionBase<ELFT> *Sec : *OutputSections)
if (Sec->getName() == Name)
return Sec->getVA();
@@ -566,7 +566,7 @@ LinkerScript<ELFT>::getOutputSectionAddr
}
template <class ELFT>
-typename ELFT::uint LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) {
+uint64_t LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) {
for (OutputSectionBase<ELFT> *Sec : *OutputSections)
if (Sec->getName() == Name)
return Sec->getSize();
@@ -574,11 +574,17 @@ typename ELFT::uint LinkerScript<ELFT>::
return 0;
}
-template <class ELFT>
-typename ELFT::uint LinkerScript<ELFT>::getHeaderSize() {
+template <class ELFT> uint64_t LinkerScript<ELFT>::getHeaderSize() {
return Out<ELFT>::ElfHeader->getSize() + Out<ELFT>::ProgramHeaders->getSize();
}
+template <class ELFT> uint64_t LinkerScript<ELFT>::getSymbolValue(StringRef S) {
+ if (SymbolBody *B = Symtab<ELFT>::X->find(S))
+ return B->getVA<ELFT>();
+ error("symbol not found: " + S);
+ return 0;
+}
+
// Returns indices of ELF headers containing specific section, identified
// by Name. Each index is a zero based number of ELF header listed within
// PHDRS {} script block.
@@ -1099,74 +1105,7 @@ SymbolAssignment *ScriptParser::readProv
static uint64_t getSymbolValue(StringRef S, uint64_t Dot) {
if (S == ".")
return Dot;
-
- switch (Config->EKind) {
- case ELF32LEKind:
- if (SymbolBody *B = Symtab<ELF32LE>::X->find(S))
- return B->getVA<ELF32LE>();
- break;
- case ELF32BEKind:
- if (SymbolBody *B = Symtab<ELF32BE>::X->find(S))
- return B->getVA<ELF32BE>();
- break;
- case ELF64LEKind:
- if (SymbolBody *B = Symtab<ELF64LE>::X->find(S))
- return B->getVA<ELF64LE>();
- break;
- case ELF64BEKind:
- if (SymbolBody *B = Symtab<ELF64BE>::X->find(S))
- return B->getVA<ELF64BE>();
- break;
- default:
- llvm_unreachable("unsupported target");
- }
- error("symbol not found: " + S);
- return 0;
-}
-
-static uint64_t getSectionSize(StringRef Name) {
- switch (Config->EKind) {
- case ELF32LEKind:
- return Script<ELF32LE>::X->getOutputSectionSize(Name);
- case ELF32BEKind:
- return Script<ELF32BE>::X->getOutputSectionSize(Name);
- case ELF64LEKind:
- return Script<ELF64LE>::X->getOutputSectionSize(Name);
- case ELF64BEKind:
- return Script<ELF64BE>::X->getOutputSectionSize(Name);
- default:
- llvm_unreachable("unsupported target");
- }
-}
-
-static uint64_t getSectionAddress(StringRef Name) {
- switch (Config->EKind) {
- case ELF32LEKind:
- return Script<ELF32LE>::X->getOutputSectionAddress(Name);
- case ELF32BEKind:
- return Script<ELF32BE>::X->getOutputSectionAddress(Name);
- case ELF64LEKind:
- return Script<ELF64LE>::X->getOutputSectionAddress(Name);
- case ELF64BEKind:
- return Script<ELF64BE>::X->getOutputSectionAddress(Name);
- default:
- llvm_unreachable("unsupported target");
- }
-}
-
-static uint64_t getHeaderSize() {
- switch (Config->EKind) {
- case ELF32LEKind:
- return Script<ELF32LE>::X->getHeaderSize();
- case ELF32BEKind:
- return Script<ELF32BE>::X->getHeaderSize();
- case ELF64LEKind:
- return Script<ELF64LE>::X->getHeaderSize();
- case ELF64BEKind:
- return Script<ELF64BE>::X->getHeaderSize();
- default:
- llvm_unreachable("unsupported target");
- }
+ return ScriptBase->getSymbolValue(S);
}
SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
@@ -1314,7 +1253,8 @@ Expr ScriptParser::readPrimary() {
expect("(");
StringRef Name = next();
expect(")");
- return [=](uint64_t Dot) { return getSectionAddress(Name); };
+ return
+ [=](uint64_t Dot) { return ScriptBase->getOutputSectionAddress(Name); };
}
if (Tok == "ASSERT")
return readAssert();
@@ -1366,10 +1306,10 @@ Expr ScriptParser::readPrimary() {
expect("(");
StringRef Name = next();
expect(")");
- return [=](uint64_t Dot) { return getSectionSize(Name); };
+ return [=](uint64_t Dot) { return ScriptBase->getOutputSectionSize(Name); };
}
if (Tok == "SIZEOF_HEADERS")
- return [=](uint64_t Dot) { return getHeaderSize(); };
+ return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
// Tok is a literal number.
uint64_t V;
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=280910&r1=280909&r2=280910&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Thu Sep 8 03:19:13 2016
@@ -123,6 +123,14 @@ struct PhdrsCommand {
unsigned Flags;
};
+class LinkerScriptBase {
+public:
+ virtual uint64_t getOutputSectionAddress(StringRef Name) = 0;
+ virtual uint64_t getOutputSectionSize(StringRef Name) = 0;
+ virtual uint64_t getHeaderSize() = 0;
+ virtual uint64_t getSymbolValue(StringRef S) = 0;
+};
+
// ScriptConfiguration holds linker script parse results.
struct ScriptConfiguration {
// Used to create symbol assignments outside SECTIONS command.
@@ -145,7 +153,7 @@ struct ScriptConfiguration {
extern ScriptConfiguration *ScriptConfig;
// This is a runner of the linker script.
-template <class ELFT> class LinkerScript {
+template <class ELFT> class LinkerScript final : public LinkerScriptBase {
typedef typename ELFT::uint uintX_t;
public:
@@ -163,9 +171,10 @@ public:
void assignAddresses();
int compareSections(StringRef A, StringRef B);
bool hasPhdrsCommands();
- uintX_t getOutputSectionAddress(StringRef Name);
- uintX_t getOutputSectionSize(StringRef Name);
- uintX_t getHeaderSize();
+ uint64_t getOutputSectionAddress(StringRef Name) override;
+ uint64_t getOutputSectionSize(StringRef Name) override;
+ uint64_t getHeaderSize() override;
+ uint64_t getSymbolValue(StringRef S) override;
std::vector<OutputSectionBase<ELFT> *> *OutputSections;
@@ -193,6 +202,8 @@ private:
template <class ELFT> struct Script { static LinkerScript<ELFT> *X; };
template <class ELFT> LinkerScript<ELFT> *Script<ELFT>::X;
+extern LinkerScriptBase *ScriptBase;
+
} // namespace elf
} // namespace lld
More information about the llvm-commits
mailing list