diff options
-rw-r--r-- | lld/ELF/ScriptLexer.cpp | 13 | ||||
-rw-r--r-- | lld/ELF/ScriptParser.cpp | 4 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/symbol-assignexpr.s | 6 |
3 files changed, 19 insertions, 4 deletions
diff --git a/lld/ELF/ScriptLexer.cpp b/lld/ELF/ScriptLexer.cpp index 8514c2524a3..26e011e9999 100644 --- a/lld/ELF/ScriptLexer.cpp +++ b/lld/ELF/ScriptLexer.cpp @@ -168,7 +168,7 @@ bool ScriptLexer::atEOF() { return ErrorCount || Tokens.size() == Pos; } // Split a given string as an expression. // This function returns "3", "*" and "5" for "3*5" for example. static std::vector<StringRef> tokenizeExpr(StringRef S) { - StringRef Ops = "+-*/:"; // List of operators + StringRef Ops = "+-*/:!"; // List of operators // Quoted strings are literal strings, so we don't want to split it. if (S.startswith("\"")) @@ -189,9 +189,14 @@ static std::vector<StringRef> tokenizeExpr(StringRef S) { if (E != 0) Ret.push_back(S.substr(0, E)); - // Get the operator as a token. - Ret.push_back(S.substr(E, 1)); - S = S.substr(E + 1); + // Get the operator as a token. Keep != as one token. + if (S.substr(E).startswith("!=")) { + Ret.push_back(S.substr(E, 2)); + S = S.substr(E + 2); + } else { + Ret.push_back(S.substr(E, 1)); + S = S.substr(E + 1); + } } return Ret; } diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index dee2a02410b..fdeeafd39fc 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -884,6 +884,10 @@ Expr ScriptParser::readPrimary() { Expr E = readPrimary(); return [=] { return ~E().getValue(); }; } + if (consume("!")) { + Expr E = readPrimary(); + return [=] { return !E().getValue(); }; + } if (consume("-")) { Expr E = readPrimary(); return [=] { return -E().getValue(); }; diff --git a/lld/test/ELF/linkerscript/symbol-assignexpr.s b/lld/test/ELF/linkerscript/symbol-assignexpr.s index 14a1f0890ca..33e2c7d16e0 100644 --- a/lld/test/ELF/linkerscript/symbol-assignexpr.s +++ b/lld/test/ELF/linkerscript/symbol-assignexpr.s @@ -15,6 +15,9 @@ # RUN: symbol11 = ((0x28000 + 0x1fff) & ~(0x1000 + -1)); \ # RUN: symbol12 = 0x1234; \ # RUN: symbol12 += 1; \ +# RUN: symbol13 = !1; \ +# RUN: symbol14 = !0; \ +# RUN: symbol15 = 0!=1; \ # RUN: bar = 0x5678; \ # RUN: baz = 0x9abc; \ # RUN: }" > %t.script @@ -39,6 +42,9 @@ # CHECK-NEXT: fedcba9876543210 *ABS* 00000000 symbol10 # CHECK-NEXT: 0000000000029000 *ABS* 00000000 symbol11 # CHECK-NEXT: 0000000000001235 *ABS* 00000000 symbol12 +# CHECK-NEXT: 0000000000000000 *ABS* 00000000 symbol13 +# CHECK-NEXT: 0000000000000001 *ABS* 00000000 symbol14 +# CHECK-NEXT: 0000000000000001 *ABS* 00000000 symbol15 # RUN: echo "SECTIONS { symbol2 = symbol; }" > %t2.script # RUN: not ld.lld -o %t2 --script %t2.script %t 2>&1 \ |