diff options
author | George Rimar <grimar@accesssoftek.com> | 2016-04-22 11:28:54 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2016-04-22 11:28:54 +0000 |
commit | fba45c41df53621b907af69a7d6ec24df26e0edd (patch) | |
tree | ca4c9967a7fa7c44627f86566661a66b21a4113d /lld/ELF/LinkerScript.cpp | |
parent | e985c76b905129cf083d0894694eaef3362a2555 (diff) | |
download | bcm5719-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.cpp | 14 |
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); |