mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 21:55:39 +08:00
[ELF, LinkerScript] Support ! operator in linker script.
Summary: This small patch adds the support for ! operator in linker scripts. Reviewers: ruiu, rafael Reviewed By: ruiu Subscribers: meadori, grimar, emaste, llvm-commits Differential Revision: https://reviews.llvm.org/D36451 llvm-svn: 310607
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(); };
|
||||
|
||||
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user