Index: lld/ELF/ScriptParser.cpp =================================================================== --- lld/ELF/ScriptParser.cpp +++ lld/ELF/ScriptParser.cpp @@ -461,11 +461,12 @@ static int precedence(StringRef Op) { return StringSwitch(Op) - .Cases("*", "/", 5) - .Cases("+", "-", 4) - .Cases("<<", ">>", 3) - .Cases("<", "<=", ">", ">=", "==", "!=", 2) - .Cases("&", "|", 1) + .Cases("*", "/", 6) + .Cases("+", "-", 5) + .Cases("<<", ">>", 4) + .Cases("<", "<=", ">", ">=", "==", "!=", 3) + .Case("&", 2) + .Case("|", 1) .Default(-1); } Index: lld/test/ELF/linkerscript/operators.s =================================================================== --- lld/test/ELF/linkerscript/operators.s +++ lld/test/ELF/linkerscript/operators.s @@ -22,6 +22,8 @@ # RUN: unary = -1 + 3; \ # RUN: lshift = 1 << 5; \ # RUN: rshift = 0xff >> 3; \ +# RUN: precedence1 = 1 | 0xff & 1 << 1 + 1 * 2; \ +# RUN: precedence2 = (1 | (0xff & (1 << (1 + (1 * 2))))); \ # RUN: maxpagesize = CONSTANT (MAXPAGESIZE); \ # RUN: commonpagesize = CONSTANT (COMMONPAGESIZE); \ # RUN: . = 0xfff0; \ @@ -53,6 +55,8 @@ # CHECK: 00000000000002 *ABS* 00000000 unary # CHECK: 00000000000020 *ABS* 00000000 lshift # CHECK: 0000000000001f *ABS* 00000000 rshift +# CHECK: 00000000000009 *ABS* 00000000 precedence1 +# CHECK: 00000000000009 *ABS* 00000000 precedence2 # CHECK: 00000000001000 *ABS* 00000000 maxpagesize # CHECK: 00000000001000 *ABS* 00000000 commonpagesize # CHECK: 0000000000ffff *ABS* 00000000 datasegmentalign