[lld] r298457 - Make elf::ScriptConfig a LinkerScript class member variable.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 21 16:03:09 PDT 2017
Author: ruiu
Date: Tue Mar 21 18:03:09 2017
New Revision: 298457
URL: http://llvm.org/viewvc/llvm-project?rev=298457&view=rev
Log:
Make elf::ScriptConfig a LinkerScript class member variable.
LinkerScript used to be a template class, so we couldn't instantiate
that class in elf::link. We instantiated ScriptConfig class earlier
instead so that the linker script parser can store configurations to
the object.
Now that LinkerScript is not a template, it doesn't make sense to
separate ScriptConfig from LinkerScript. This patch merges them.
Modified:
lld/trunk/ELF/Driver.cpp
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/ELF/LinkerScript.h
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=298457&r1=298456&r2=298457&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Mar 21 18:03:09 2017
@@ -78,7 +78,7 @@ bool elf::link(ArrayRef<const char *> Ar
Config = make<Configuration>();
Driver = make<LinkerDriver>();
- ScriptConfig = make<ScriptConfiguration>();
+ Script = make<LinkerScript>();
Driver->main(Args, CanExitEarly);
freeArena();
@@ -855,7 +855,6 @@ template <class ELFT> void LinkerDriver:
SymbolTable<ELFT> Symtab;
elf::Symtab<ELFT>::X = &Symtab;
Target = createTarget();
- Script = make<LinkerScript>();
Config->MaxPageSize = getMaxPageSize(Args);
Config->ImageBase = getImageBase(Args);
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=298457&r1=298456&r2=298457&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Tue Mar 21 18:03:09 2017
@@ -53,6 +53,8 @@ using namespace llvm::support::endian;
using namespace lld;
using namespace lld::elf;
+LinkerScript *elf::Script;
+
uint64_t ExprValue::getValue() const {
if (Sec)
return Sec->getOffset(Val) + Sec->getOutputSection()->Addr;
@@ -109,9 +111,6 @@ static ExprValue bitOr(ExprValue A, Expr
static ExprValue bitNot(ExprValue A) { return ~A.getValue(); }
static ExprValue minus(ExprValue A) { return -A.getValue(); }
-LinkerScript *elf::Script;
-ScriptConfiguration *elf::ScriptConfig;
-
template <class ELFT> static SymbolBody *addRegular(SymbolAssignment *Cmd) {
Symbol *Sym;
uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT;
@@ -1102,7 +1101,6 @@ private:
std::pair<std::vector<SymbolVersion>, std::vector<SymbolVersion>>
readSymbols();
- ScriptConfiguration &Opt = *ScriptConfig;
bool IsUnderSysroot;
};
@@ -1150,7 +1148,7 @@ void ScriptParser::readLinkerScript() {
continue;
if (Tok == "ASSERT") {
- Opt.Commands.emplace_back(new AssertCommand(readAssert()));
+ Script->Opt.Commands.emplace_back(new AssertCommand(readAssert()));
} else if (Tok == "ENTRY") {
readEntry();
} else if (Tok == "EXTERN") {
@@ -1176,7 +1174,7 @@ void ScriptParser::readLinkerScript() {
} else if (Tok == "VERSION") {
readVersion();
} else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok)) {
- Opt.Commands.emplace_back(Cmd);
+ Script->Opt.Commands.emplace_back(Cmd);
} else {
setError("unknown directive: " + Tok);
}
@@ -1303,9 +1301,9 @@ void ScriptParser::readPhdrs() {
expect("{");
while (!Error && !consume("}")) {
StringRef Tok = next();
- Opt.PhdrsCommands.push_back(
+ Script->Opt.PhdrsCommands.push_back(
{Tok, PT_NULL, false, false, UINT_MAX, nullptr});
- PhdrsCommand &PhdrCmd = Opt.PhdrsCommands.back();
+ PhdrsCommand &PhdrCmd = Script->Opt.PhdrsCommands.back();
PhdrCmd.Type = readPhdrType();
do {
@@ -1339,7 +1337,7 @@ void ScriptParser::readSearchDir() {
}
void ScriptParser::readSections() {
- Opt.HasSections = true;
+ Script->Opt.HasSections = true;
// -no-rosegment is used to avoid placing read only non-executable sections in
// their own segment. We do the same if SECTIONS command is present in linker
// script. See comment for computeFlags().
@@ -1355,7 +1353,7 @@ void ScriptParser::readSections() {
else
Cmd = readOutputSectionDescription(Tok);
}
- Opt.Commands.emplace_back(Cmd);
+ Script->Opt.Commands.emplace_back(Cmd);
}
}
@@ -1469,7 +1467,7 @@ ScriptParser::readInputSectionDescriptio
StringRef FilePattern = next();
InputSectionDescription *Cmd = readInputSectionRules(FilePattern);
expect(")");
- Opt.KeptSections.push_back(Cmd);
+ Script->Opt.KeptSections.push_back(Cmd);
return Cmd;
}
return readInputSectionRules(Tok);
@@ -2072,11 +2070,12 @@ void ScriptParser::readMemory() {
uint64_t Length = readMemoryAssignment("LENGTH", "len", "l");
// Add the memory region to the region map (if it doesn't already exist).
- auto It = Opt.MemoryRegions.find(Name);
- if (It != Opt.MemoryRegions.end())
+ auto It = Script->Opt.MemoryRegions.find(Name);
+ if (It != Script->Opt.MemoryRegions.end())
setError("region '" + Name + "' already defined");
else
- Opt.MemoryRegions[Name] = {Name, Origin, Length, Origin, Flags, NegFlags};
+ Script->Opt.MemoryRegions[Name] = {Name, Origin, Length,
+ Origin, Flags, NegFlags};
}
}
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=298457&r1=298456&r2=298457&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Tue Mar 21 18:03:09 2017
@@ -219,8 +219,6 @@ struct ScriptConfiguration {
llvm::DenseMap<llvm::StringRef, MemoryRegion> MemoryRegions;
};
-extern ScriptConfiguration *ScriptConfig;
-
class LinkerScript {
protected:
void assignSymbol(SymbolAssignment *Cmd, bool InSec = false);
@@ -243,9 +241,6 @@ protected:
OutputSection *Aether;
bool ErrorOnMissingSection = false;
- // "ScriptConfig" is a bit too long, so define a short name for it.
- ScriptConfiguration &Opt = *ScriptConfig;
-
uint64_t Dot;
uint64_t ThreadBssOffset = 0;
@@ -287,6 +282,9 @@ public:
void writeDataBytes(StringRef Name, uint8_t *Buf);
void addSymbol(SymbolAssignment *Cmd);
void processCommands(OutputSectionFactory &Factory);
+
+ // Parsed linker script configurations are set to this struct.
+ ScriptConfiguration Opt;
};
extern LinkerScript *Script;
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=298457&r1=298456&r2=298457&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Mar 21 18:03:09 2017
@@ -228,7 +228,7 @@ template <class ELFT> void Writer<ELFT>:
// Create output sections.
Script->OutputSections = &OutputSections;
- if (ScriptConfig->HasSections) {
+ if (Script->Opt.HasSections) {
// If linker script contains SECTIONS commands, let it create sections.
Script->processCommands(Factory);
@@ -261,7 +261,7 @@ template <class ELFT> void Writer<ELFT>:
if (Config->Relocatable) {
assignFileOffsets();
} else {
- if (ScriptConfig->HasSections) {
+ if (Script->Opt.HasSections) {
Script->assignAddresses(Phdrs);
} else {
fixSectionAlignments();
@@ -841,7 +841,7 @@ template <class ELFT> void Writer<ELFT>:
Symtab<ELFT>::X->addIgnored("__tls_get_addr");
// If linker script do layout we do not need to create any standart symbols.
- if (ScriptConfig->HasSections)
+ if (Script->Opt.HasSections)
return;
// __ehdr_start is the location of ELF file headers.
@@ -960,7 +960,7 @@ template <class ELFT> void Writer<ELFT>:
// relative order for SHF_LINK_ORDER sections.
if (Config->Relocatable)
return;
- if (!ScriptConfig->HasSections) {
+ if (!Script->Opt.HasSections) {
std::stable_sort(OutputSections.begin(), OutputSections.end(),
compareSectionsNonScript<ELFT>);
return;
@@ -1437,7 +1437,7 @@ bool elf::allocateHeaders(std::vector<Ph
}
Min = alignDown(Min - HeaderSize, Config->MaxPageSize);
- if (!ScriptConfig->HasSections)
+ if (!Script->Opt.HasSections)
Config->ImageBase = Min = std::min(Min, Config->ImageBase);
Out::ElfHeader->Addr = Min;
@@ -1462,7 +1462,7 @@ bool elf::allocateHeaders(std::vector<Ph
template <class ELFT> void Writer<ELFT>::fixHeaders() {
Out::ProgramHeaders->Size = sizeof(Elf_Phdr) * Phdrs.size();
// If the script has SECTIONS, assignAddresses will compute the values.
- if (ScriptConfig->HasSections)
+ if (Script->Opt.HasSections)
return;
// When -T<section> option is specified, lower the base to make room for those
More information about the llvm-commits
mailing list