aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2022-06-25 13:47:32 -0700
committerFangrui Song <i@maskray.me>2022-06-25 13:47:32 -0700
commitd479b2e4db62f527e2bcdaa601f9d195cf4b7df0 (patch)
tree32803a535f5cef0d796cabd495310deca833d6af
parent3d37e785c77a2461abe43b82bd0ac247244f94f1 (diff)
downloadllvm-d479b2e4db62f527e2bcdaa601f9d195cf4b7df0.zip
llvm-d479b2e4db62f527e2bcdaa601f9d195cf4b7df0.tar.gz
llvm-d479b2e4db62f527e2bcdaa601f9d195cf4b7df0.tar.bz2
[ELF] Fix precedence of == and != in expressions
In GNU ld, the == and != operators have lower precedence than < > <= >=. This behavior matches C.
-rw-r--r--lld/ELF/ScriptParser.cpp17
-rw-r--r--lld/test/ELF/linkerscript/operators.test2
2 files changed, 10 insertions, 9 deletions
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 00a2841..4df4462 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -636,14 +636,15 @@ void ScriptParser::readTarget() {
static int precedence(StringRef op) {
return StringSwitch<int>(op)
- .Cases("*", "/", "%", 8)
- .Cases("+", "-", 7)
- .Cases("<<", ">>", 6)
- .Cases("<", "<=", ">", ">=", "==", "!=", 5)
- .Case("&", 4)
- .Case("|", 3)
- .Case("&&", 2)
- .Case("||", 1)
+ .Cases("*", "/", "%", 10)
+ .Cases("+", "-", 9)
+ .Cases("<<", ">>", 8)
+ .Cases("<", "<=", ">", ">=", 7)
+ .Cases("==", "!=", 6)
+ .Case("&", 5)
+ .Case("|", 4)
+ .Case("&&", 3)
+ .Case("||", 2)
.Default(-1);
}
diff --git a/lld/test/ELF/linkerscript/operators.test b/lld/test/ELF/linkerscript/operators.test
index 8ba8ee7..b096df5 100644
--- a/lld/test/ELF/linkerscript/operators.test
+++ b/lld/test/ELF/linkerscript/operators.test
@@ -20,7 +20,7 @@ SECTIONS {
greater = 0 > 1 ? 1 : 2;
greatereq = 1 >= 1 ? 1 : 2;
eq = 1 == 1 ? 1 : 2;
- neq = 1 != 1 ? 1 : 2;
+ neq = (1 != 1 <= 1) ? 1 : 2;
plusassign = 1;
plusassign += 2;
unary = -1 + 3;