summaryrefslogtreecommitdiffstats
path: root/lld/ELF/LinkerScript.cpp
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-04-22 11:28:54 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-04-22 11:28:54 +0000
commitfba45c41df53621b907af69a7d6ec24df26e0edd (patch)
treeca4c9967a7fa7c44627f86566661a66b21a4113d /lld/ELF/LinkerScript.cpp
parente985c76b905129cf083d0894694eaef3362a2555 (diff)
downloadbcm5719-llvm-fba45c41df53621b907af69a7d6ec24df26e0edd.tar.gz
bcm5719-llvm-fba45c41df53621b907af69a7d6ec24df26e0edd.zip
Recommitted r267132 "[ELF] - implemented ternary operator for linkerscript expressions"
With fix: removed redundant Dot parameter. Original commit message: [ELF] - implemented ternary operator for linkerscript expressions Patch implements ternary operator for linkerscript expressions. Like: SECTIONS { . = 0x1 ? 0x2 : 0x3; ... } Differential revision: http://reviews.llvm.org/D19332 llvm-svn: 267140
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
-rw-r--r--lld/ELF/LinkerScript.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 9fcb2f61188..77ba023b049 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -97,6 +97,17 @@ uint64_t LinkerScript<ELFT>::parsePrimary(ArrayRef<StringRef> &Tokens) {
return getInteger(Tok);
}
+template <class ELFT>
+uint64_t LinkerScript<ELFT>::parseTernary(ArrayRef<StringRef> &Tokens,
+ uint64_t Cond) {
+ next(Tokens);
+ uint64_t V = parseExpr(Tokens);
+ if (!expect(Tokens, ":"))
+ return 0;
+ uint64_t W = parseExpr(Tokens);
+ return Cond ? V : W;
+}
+
static uint64_t apply(StringRef Op, uint64_t L, uint64_t R) {
if (Op == "+")
return L + R;
@@ -126,6 +137,9 @@ uint64_t LinkerScript<ELFT>::parseExpr1(ArrayRef<StringRef> &Tokens,
while (!Tokens.empty()) {
// Read an operator and an expression.
StringRef Op1 = Tokens.front();
+ if (Op1 == "?")
+ return parseTernary(Tokens, Lhs);
+
if (precedence(Op1) < MinPrec)
return Lhs;
next(Tokens);
OpenPOWER on IntegriCloud