diff options
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index cabd82fe1bb..4156f08dfd8 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -63,9 +63,15 @@ private: static int precedence(StringRef Op) { return StringSwitch<int>(Op) .Case("*", 4) - .Case("/", 3) - .Case("+", 2) - .Case("-", 2) + .Case("/", 4) + .Case("+", 3) + .Case("-", 3) + .Case("<", 2) + .Case(">", 2) + .Case(">=", 2) + .Case("<=", 2) + .Case("==", 2) + .Case("!=", 2) .Case("&", 1) .Default(-1); } @@ -115,10 +121,6 @@ uint64_t ExprParser::parseTernary(uint64_t Cond) { } uint64_t ExprParser::apply(StringRef Op, uint64_t L, uint64_t R) { - if (Op == "+") - return L + R; - if (Op == "-") - return L - R; if (Op == "*") return L * R; if (Op == "/") { @@ -128,6 +130,22 @@ uint64_t ExprParser::apply(StringRef Op, uint64_t L, uint64_t R) { } return L / R; } + if (Op == "+") + return L + R; + if (Op == "-") + return L - R; + if (Op == "<") + return L < R; + if (Op == ">") + return L > R; + if (Op == ">=") + return L >= R; + if (Op == "<=") + return L <= R; + if (Op == "==") + return L == R; + if (Op == "!=") + return L != R; if (Op == "&") return L & R; llvm_unreachable("invalid operator"); |