[ELF] - Implemented comparsion operators for linkerscript.
Patch adds support of <,>,!=,==,>=,<= operators.
Differential revision: http://reviews.llvm.org/D19419
llvm-svn: 267382
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index cabd82f..4156f08 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -63,9 +63,15 @@
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::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 @@
}
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");