diff options
Diffstat (limited to 'lld/ELF')
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 32 | ||||
-rw-r--r-- | lld/ELF/ScriptParser.cpp | 2 |
2 files changed, 26 insertions, 8 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"); diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 2bc0bbcf624..937b8a12e2f 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -75,7 +75,7 @@ std::vector<StringRef> ScriptParserBase::tokenize(StringRef S) { // Unquoted token size_t Pos = S.find_first_not_of( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - "0123456789_.$/\\~=+[]*?-:"); + "0123456789_.$/\\~=+[]*?-:!<>"); // A character that cannot start a word (which is usually a // punctuation) forms a single character token. if (Pos == 0) |