Skip to content

Commit 30ec2bf

Browse files
committed
[ELF] PROVIDE: allow quoted names to be discarded
Extend commit ebb326a for (#74771) to support quoted names, e.g. `PROVIDE("f1" = f2 + f3);`.
1 parent edcc60e commit 30ec2bf

File tree

3 files changed

+9
-7
lines changed

3 files changed

+9
-7
lines changed

lld/ELF/ScriptParser.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class ScriptParser final : ScriptLexer {
8989
void readVersionScriptCommand();
9090
void readNoCrossRefs(bool to);
9191

92+
StringRef readName();
9293
SymbolAssignment *readSymbolAssignment(StringRef name);
9394
ByteCommand *readByteCommand(StringRef tok);
9495
std::array<uint8_t, 4> readFill();
@@ -1089,7 +1090,7 @@ std::array<uint8_t, 4> ScriptParser::readFill() {
10891090

10901091
SymbolAssignment *ScriptParser::readProvideHidden(bool provide, bool hidden) {
10911092
expect("(");
1092-
StringRef name = next(), eq = peek();
1093+
StringRef name = readName(), eq = peek();
10931094
if (eq != "=") {
10941095
setError("= expected, but got " + next());
10951096
while (till(")"))
@@ -1130,10 +1131,10 @@ SymbolAssignment *ScriptParser::readAssignment(StringRef tok) {
11301131
SaveAndRestore saved(inExpr, true);
11311132
if (op.starts_with("=")) {
11321133
// Support = followed by an expression without whitespace.
1133-
cmd = readSymbolAssignment(tok);
1134+
cmd = readSymbolAssignment(unquote(tok));
11341135
} else if ((op.size() == 2 && op[1] == '=' && strchr("+-*/&^|", op[0])) ||
11351136
op == "<<=" || op == ">>=") {
1136-
cmd = readSymbolAssignment(tok);
1137+
cmd = readSymbolAssignment(unquote(tok));
11371138
} else if (tok == "PROVIDE") {
11381139
cmd = readProvideHidden(true, false);
11391140
} else if (tok == "HIDDEN") {
@@ -1152,8 +1153,9 @@ SymbolAssignment *ScriptParser::readAssignment(StringRef tok) {
11521153
return cmd;
11531154
}
11541155

1156+
StringRef ScriptParser::readName() { return unquote(next()); }
1157+
11551158
SymbolAssignment *ScriptParser::readSymbolAssignment(StringRef name) {
1156-
name = unquote(name);
11571159
StringRef op = next();
11581160
assert(op == "=" || op == "*=" || op == "/=" || op == "+=" || op == "-=" ||
11591161
op == "&=" || op == "^=" || op == "|=" || op == "<<=" || op == ">>=");

lld/test/ELF/gc-sections-with-provide.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ baz:
5353

5454

5555
#--- script.t
56-
PROVIDE(unused = bar + used);
57-
PROVIDE(used = another_used);
56+
PROVIDE(unused = bar + "used");
57+
PROVIDE("used" = another_used);
5858
PROVIDE(baz_ref = baz);
5959
PROVIDE(another_used = baz_ref);
6060
PROVIDE(another_unused = unused + bar + 0x1);

lld/test/ELF/linkerscript/symbolreferenced.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ PROVIDE(unused = g1);
9494
PROVIDE_HIDDEN(another_unused = g1);
9595

9696
#--- chain_with_cycle.t
97-
PROVIDE(f1 = f2 + f3);
97+
PROVIDE("f1" = f2 + f3);
9898
PROVIDE(f2 = f3 + f4);
9999
PROVIDE(f3 = f4);
100100
PROVIDE(f4 = f1);

0 commit comments

Comments
 (0)