[lld] r297472 - Don't pass Dot to every callback.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 10 08:04:26 PST 2017
Author: rafael
Date: Fri Mar 10 10:04:26 2017
New Revision: 297472
URL: http://llvm.org/viewvc/llvm-project?rev=297472&view=rev
Log:
Don't pass Dot to every callback.
It is available from ScriptBase.
Modified:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/ELF/LinkerScript.h
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=297472&r1=297471&r2=297472&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Fri Mar 10 10:04:26 2017
@@ -81,7 +81,7 @@ static bool isUnderSysroot(StringRef Pat
template <class ELFT>
void LinkerScript<ELFT>::setDot(Expr E, const Twine &Loc, bool InSec) {
- uintX_t Val = E(Dot);
+ uintX_t Val = E();
if (Val < Dot) {
if (InSec)
error(Loc + ": unable to move location counter backward for: " +
@@ -109,7 +109,7 @@ void LinkerScript<ELFT>::assignSymbol(Sy
return;
auto *Sym = cast<DefinedRegular>(Cmd->Sym);
- Sym->Value = Cmd->Expression(Dot);
+ Sym->Value = Cmd->Expression();
if (!Cmd->Expression.IsAbsolute()) {
Sym->Section = Cmd->Expression.Section();
if (auto *Sec = dyn_cast_or_null<OutputSection>(Sym->Section))
@@ -329,7 +329,7 @@ void LinkerScript<ELFT>::processCommands
// created by Writer<ELFT>. The LinkerScript<ELFT>::assignAddresses
// will not be called, so ASSERT should be evaluated now.
if (!Opt.HasSections)
- Cmd->Expression(0);
+ Cmd->Expression();
continue;
}
@@ -368,7 +368,7 @@ void LinkerScript<ELFT>::processCommands
// is given, input sections are aligned to that value, whether the
// given value is larger or smaller than the original section alignment.
if (Cmd->SubalignExpr) {
- uint32_t Subalign = Cmd->SubalignExpr(0);
+ uint32_t Subalign = Cmd->SubalignExpr();
for (InputSectionBase *S : V)
S->Alignment = Subalign;
}
@@ -470,7 +470,7 @@ template <class ELFT> void LinkerScript<
}
if (auto *AssertCmd = dyn_cast<AssertCommand>(&Base)) {
- AssertCmd->Expression(Dot);
+ AssertCmd->Expression();
return;
}
@@ -549,7 +549,7 @@ template <class ELFT>
void LinkerScript<ELFT>::assignOffsets(OutputSectionCommand *Cmd) {
if (Cmd->LMAExpr) {
uintX_t D = Dot;
- LMAOffset = [=] { return Cmd->LMAExpr(D) - D; };
+ LMAOffset = [=] { return Cmd->LMAExpr() - D; };
}
OutputSection *Sec = findSection<ELFT>(Cmd->Name, *OutputSections);
if (!Sec)
@@ -560,7 +560,7 @@ void LinkerScript<ELFT>::assignOffsets(O
// Handle align (e.g. ".foo : ALIGN(16) { ... }").
if (Cmd->AlignExpr)
- Sec->updateAlignment(Cmd->AlignExpr(0));
+ Sec->updateAlignment(Cmd->AlignExpr());
// Try and find an appropriate memory region to assign offsets in.
CurMemRegion = findMemoryRegion(Cmd, Sec);
@@ -775,7 +775,7 @@ void LinkerScript<ELFT>::assignAddresses
}
if (auto *Cmd = dyn_cast<AssertCommand>(Base.get())) {
- Cmd->Expression(Dot);
+ Cmd->Expression();
continue;
}
@@ -810,7 +810,7 @@ template <class ELFT> std::vector<PhdrEn
Phdr.add(Out::ProgramHeaders);
if (Cmd.LMAExpr) {
- Phdr.p_paddr = Cmd.LMAExpr(0);
+ Phdr.p_paddr = Cmd.LMAExpr();
Phdr.HasLMA = true;
}
}
@@ -878,7 +878,7 @@ void LinkerScript<ELFT>::writeDataBytes(
auto *Cmd = dyn_cast<OutputSectionCommand>(Opt.Commands[I].get());
for (const std::unique_ptr<BaseCommand> &Base : Cmd->Commands)
if (auto *Data = dyn_cast<BytesDataCommand>(Base.get()))
- writeInt<ELFT>(Buf + Data->Offset, Data->Expression(0), Data->Size);
+ writeInt<ELFT>(Buf + Data->Offset, Data->Expression(), Data->Size);
}
template <class ELFT> bool LinkerScript<ELFT>::hasLMA(StringRef Name) {
@@ -938,6 +938,8 @@ template <class ELFT> uint64_t LinkerScr
template <class ELFT>
uint64_t LinkerScript<ELFT>::getSymbolValue(const Twine &Loc, StringRef S) {
+ if (S == ".")
+ return Dot;
if (SymbolBody *B = Symtab<ELFT>::X->find(S))
return B->getVA<ELFT>();
error(Loc + ": symbol not found: " + S);
@@ -949,6 +951,8 @@ template <class ELFT> bool LinkerScript<
}
template <class ELFT> bool LinkerScript<ELFT>::isAbsolute(StringRef S) {
+ if (S == ".")
+ return false;
SymbolBody *Sym = Symtab<ELFT>::X->find(S);
auto *DR = dyn_cast_or_null<DefinedRegular>(Sym);
return DR && !DR->Section;
@@ -1279,7 +1283,7 @@ void ScriptParser::readPhdrs() {
expect("(");
// Passing 0 for the value of dot is a bit of a hack. It means that
// we accept expressions like ".|1".
- PhdrCmd.Flags = readExpr()(0);
+ PhdrCmd.Flags = readExpr()();
expect(")");
} else
setError("unexpected header attribute: " + Tok);
@@ -1444,10 +1448,10 @@ Expr ScriptParser::readAssert() {
expect(",");
StringRef Msg = unquote(next());
expect(")");
- return [=](uint64_t Dot) {
- if (!E(Dot))
+ return [=] {
+ if (!E())
error(Msg);
- return Dot;
+ return ScriptBase->getDot();
};
}
@@ -1571,18 +1575,6 @@ SymbolAssignment *ScriptParser::readProv
return Cmd;
}
-static uint64_t getSymbolValue(const Twine &Loc, StringRef S, uint64_t Dot) {
- if (S == ".")
- return Dot;
- return ScriptBase->getSymbolValue(Loc, S);
-}
-
-static bool isAbsolute(StringRef S) {
- if (S == ".")
- return false;
- return ScriptBase->isAbsolute(S);
-}
-
SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
StringRef Op = next();
Expr E;
@@ -1595,9 +1587,7 @@ SymbolAssignment *ScriptParser::readAssi
}
if (Op == "+=") {
std::string Loc = getCurrentLocation();
- E = [=](uint64_t Dot) {
- return getSymbolValue(Loc, Name, Dot) + E(Dot);
- };
+ E = [=] { return ScriptBase->getSymbolValue(Loc, Name) + E(); };
}
return new SymbolAssignment(Name, E, getCurrentLocation());
}
@@ -1622,41 +1612,41 @@ static Expr combine(StringRef Op, Expr L
};
if (Op == "*")
- return [=](uint64_t Dot) { return L(Dot) * R(Dot); };
+ return [=] { return L() * R(); };
if (Op == "/") {
- return [=](uint64_t Dot) -> uint64_t {
- uint64_t RHS = R(Dot);
+ return [=]() -> uint64_t {
+ uint64_t RHS = R();
if (RHS == 0) {
error("division by zero");
return 0;
}
- return L(Dot) / RHS;
+ return L() / RHS;
};
}
if (Op == "+")
- return {[=](uint64_t Dot) { return L(Dot) + R(Dot); }, IsAbs, GetOutSec};
+ return {[=] { return L() + R(); }, IsAbs, GetOutSec};
if (Op == "-")
- return {[=](uint64_t Dot) { return L(Dot) - R(Dot); }, IsAbs, GetOutSec};
+ return {[=] { return L() - R(); }, IsAbs, GetOutSec};
if (Op == "<<")
- return [=](uint64_t Dot) { return L(Dot) << R(Dot); };
+ return [=] { return L() << R(); };
if (Op == ">>")
- return [=](uint64_t Dot) { return L(Dot) >> R(Dot); };
+ return [=] { return L() >> R(); };
if (Op == "<")
- return [=](uint64_t Dot) { return L(Dot) < R(Dot); };
+ return [=] { return L() < R(); };
if (Op == ">")
- return [=](uint64_t Dot) { return L(Dot) > R(Dot); };
+ return [=] { return L() > R(); };
if (Op == ">=")
- return [=](uint64_t Dot) { return L(Dot) >= R(Dot); };
+ return [=] { return L() >= R(); };
if (Op == "<=")
- return [=](uint64_t Dot) { return L(Dot) <= R(Dot); };
+ return [=] { return L() <= R(); };
if (Op == "==")
- return [=](uint64_t Dot) { return L(Dot) == R(Dot); };
+ return [=] { return L() == R(); };
if (Op == "!=")
- return [=](uint64_t Dot) { return L(Dot) != R(Dot); };
+ return [=] { return L() != R(); };
if (Op == "&")
- return [=](uint64_t Dot) { return L(Dot) & R(Dot); };
+ return [=] { return L() & R(); };
if (Op == "|")
- return [=](uint64_t Dot) { return L(Dot) | R(Dot); };
+ return [=] { return L() | R(); };
llvm_unreachable("invalid operator");
}
@@ -1761,28 +1751,25 @@ Expr ScriptParser::readPrimary() {
if (Tok == "~") {
Expr E = readPrimary();
- return [=](uint64_t Dot) { return ~E(Dot); };
+ return [=] { return ~E(); };
}
if (Tok == "-") {
Expr E = readPrimary();
- return [=](uint64_t Dot) { return -E(Dot); };
+ return [=] { return -E(); };
}
// Built-in functions are parsed here.
// https://sourceware.org/binutils/docs/ld/Builtin-Functions.html.
if (Tok == "ADDR") {
StringRef Name = readParenLiteral();
- return {[=](uint64_t Dot) {
- return ScriptBase->getOutputSection(Location, Name)->Addr;
- },
+ return {[=] { return ScriptBase->getOutputSection(Location, Name)->Addr; },
[=] { return false; },
[=] { return ScriptBase->getOutputSection(Location, Name); }};
}
if (Tok == "LOADADDR") {
StringRef Name = readParenLiteral();
- return [=](uint64_t Dot) {
- return ScriptBase->getOutputSection(Location, Name)->getLMA();
- };
+ return
+ [=] { return ScriptBase->getOutputSection(Location, Name)->getLMA(); };
}
if (Tok == "ASSERT")
return readAssert();
@@ -1792,18 +1779,18 @@ Expr ScriptParser::readPrimary() {
if (consume(",")) {
Expr E2 = readExpr();
expect(")");
- return [=](uint64_t Dot) { return alignTo(E(Dot), E2(Dot)); };
+ return [=] { return alignTo(E(), E2()); };
}
expect(")");
- return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); };
+ return [=] { return alignTo(ScriptBase->getDot(), E()); };
}
if (Tok == "CONSTANT") {
StringRef Name = readParenLiteral();
- return [=](uint64_t Dot) { return getConstant(Name); };
+ return [=] { return getConstant(Name); };
}
if (Tok == "DEFINED") {
StringRef Name = readParenLiteral();
- return [=](uint64_t Dot) { return ScriptBase->isDefined(Name) ? 1 : 0; };
+ return [=] { return ScriptBase->isDefined(Name) ? 1 : 0; };
}
if (Tok == "SEGMENT_START") {
expect("(");
@@ -1811,7 +1798,7 @@ Expr ScriptParser::readPrimary() {
expect(",");
Expr E = readExpr();
expect(")");
- return [=](uint64_t Dot) { return E(Dot); };
+ return [=] { return E(); };
}
if (Tok == "DATA_SEGMENT_ALIGN") {
expect("(");
@@ -1819,13 +1806,13 @@ Expr ScriptParser::readPrimary() {
expect(",");
readExpr();
expect(")");
- return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); };
+ return [=] { return alignTo(ScriptBase->getDot(), E()); };
}
if (Tok == "DATA_SEGMENT_END") {
expect("(");
expect(".");
expect(")");
- return [](uint64_t Dot) { return Dot; };
+ return []() { return ScriptBase->getDot(); };
}
// GNU linkers implements more complicated logic to handle
// DATA_SEGMENT_RELRO_END. We instead ignore the arguments and just align to
@@ -1836,31 +1823,30 @@ Expr ScriptParser::readPrimary() {
expect(",");
readExpr();
expect(")");
- return [](uint64_t Dot) { return alignTo(Dot, Target->PageSize); };
+ return []() { return alignTo(ScriptBase->getDot(), Target->PageSize); };
}
if (Tok == "SIZEOF") {
StringRef Name = readParenLiteral();
- return [=](uint64_t Dot) { return ScriptBase->getOutputSectionSize(Name); };
+ return [=] { return ScriptBase->getOutputSectionSize(Name); };
}
if (Tok == "ALIGNOF") {
StringRef Name = readParenLiteral();
- return [=](uint64_t Dot) {
- return ScriptBase->getOutputSection(Location, Name)->Alignment;
- };
+ return
+ [=] { return ScriptBase->getOutputSection(Location, Name)->Alignment; };
}
if (Tok == "SIZEOF_HEADERS")
- return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
+ return [=] { return ScriptBase->getHeaderSize(); };
// Tok is a literal number.
uint64_t V;
if (readInteger(Tok, V))
- return [=](uint64_t Dot) { return V; };
+ return [=] { return V; };
// Tok is a symbol name.
if (Tok != "." && !isValidCIdentifier(Tok))
setError("malformed number: " + Tok);
- return {[=](uint64_t Dot) { return getSymbolValue(Location, Tok, Dot); },
- [=] { return isAbsolute(Tok); },
+ return {[=] { return ScriptBase->getSymbolValue(Location, Tok); },
+ [=] { return ScriptBase->isAbsolute(Tok); },
[=] { return ScriptBase->getSymbolSection(Tok); }};
}
@@ -1868,7 +1854,7 @@ Expr ScriptParser::readTernary(Expr Cond
Expr L = readExpr();
expect(":");
Expr R = readExpr();
- return [=](uint64_t Dot) { return Cond(Dot) ? L(Dot) : R(Dot); };
+ return [=] { return Cond() ? L() : R(); };
}
Expr ScriptParser::readParenExpr() {
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=297472&r1=297471&r2=297472&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Fri Mar 10 10:04:26 2017
@@ -43,17 +43,17 @@ class SectionBase;
// Later, we evaluate the expression by calling the function
// with the value of special context variable ".".
struct Expr {
- std::function<uint64_t(uint64_t)> Val;
+ std::function<uint64_t()> Val;
std::function<bool()> IsAbsolute;
// If expression is section-relative the function below is used
// to get the output section pointer.
std::function<SectionBase *()> Section;
- uint64_t operator()(uint64_t Dot) const { return Val(Dot); }
+ uint64_t operator()() const { return Val(); }
operator bool() const { return (bool)Val; }
- Expr(std::function<uint64_t(uint64_t)> Val, std::function<bool()> IsAbsolute,
+ Expr(std::function<uint64_t()> Val, std::function<bool()> IsAbsolute,
std::function<SectionBase *()> Section)
: Val(Val), IsAbsolute(IsAbsolute), Section(Section) {}
template <typename T>
@@ -213,6 +213,7 @@ protected:
public:
virtual uint64_t getHeaderSize() = 0;
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;
More information about the llvm-commits
mailing list