diff options
author | Fangrui Song <i@maskray.me> | 2022-06-25 13:47:32 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2022-06-25 13:47:32 -0700 |
commit | d479b2e4db62f527e2bcdaa601f9d195cf4b7df0 (patch) | |
tree | 32803a535f5cef0d796cabd495310deca833d6af | |
parent | 3d37e785c77a2461abe43b82bd0ac247244f94f1 (diff) | |
download | llvm-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.cpp | 17 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/operators.test | 2 |
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; |