summaryrefslogtreecommitdiff
path: root/lld/ELF/LinkerScript.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-10-31 17:43:38 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-10-31 17:43:38 +0000
commitf661393ad6efbda093af7213b0243fd4d94b0296 (patch)
treeb71595e7d88c3954920fa8a1a8d1e92a7d998b5e /lld/ELF/LinkerScript.cpp
parent86a1ef388b750733494630a0e1a69c0bcc2d9434 (diff)
Move IsAbsolute from SymbolAssignment to Expr.
And as a token of the new feature, make ALIGNOF always absolute. This is a step in making it possible to have non absolute symbols out of output sections. llvm-svn: 285608
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
-rw-r--r--lld/ELF/LinkerScript.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index baf11f6e7d13..440b54c25276 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -64,7 +64,7 @@ template <class ELFT> static void addSynthetic(SymbolAssignment *Cmd) {
}
template <class ELFT> static void addSymbol(SymbolAssignment *Cmd) {
- if (Cmd->IsAbsolute)
+ if (Cmd->Expression.IsAbsolute)
addRegular<ELFT>(Cmd);
else
addSynthetic<ELFT>(Cmd);
@@ -1424,7 +1424,7 @@ SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok,
Cmd = readProvideHidden(true, true);
}
if (Cmd && MakeAbsolute)
- Cmd->IsAbsolute = true;
+ Cmd->Expression.IsAbsolute = true;
return Cmd;
}
@@ -1436,20 +1436,19 @@ static uint64_t getSymbolValue(StringRef S, uint64_t Dot) {
SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
StringRef Op = next();
- bool IsAbsolute = false;
Expr E;
assert(Op == "=" || Op == "+=");
if (consume("ABSOLUTE")) {
// The RHS may be something like "ABSOLUTE(.) & 0xff".
// Call readExpr1 to read the whole expression.
E = readExpr1(readParenExpr(), 0);
- IsAbsolute = true;
+ E.IsAbsolute = true;
} else {
E = readExpr();
}
if (Op == "+=")
E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); };
- return new SymbolAssignment(Name, E, IsAbsolute);
+ return new SymbolAssignment(Name, E);
}
// This is an operator-precedence parser to parse a linker
@@ -1671,8 +1670,9 @@ Expr ScriptParser::readPrimary() {
}
if (Tok == "ALIGNOF") {
StringRef Name = readParenLiteral();
- return
- [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name); };
+ return {
+ [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name); },
+ true};
}
if (Tok == "SIZEOF_HEADERS")
return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };