Skip to content

Commit ff7f97a

Browse files
committed
[ELF] --defsym: support quoted LHS
and move = splitting from Driver.cpp to ScriptParser.cpp.
1 parent 44df89c commit ff7f97a

File tree

4 files changed

+15
-20
lines changed

4 files changed

+15
-20
lines changed

lld/ELF/Driver.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,13 +1911,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
19111911
hasInput = true;
19121912
break;
19131913
case OPT_defsym: {
1914-
StringRef from;
1915-
StringRef to;
1916-
std::tie(from, to) = StringRef(arg->getValue()).split('=');
1917-
if (from.empty() || to.empty())
1918-
error("--defsym: syntax error: " + StringRef(arg->getValue()));
1919-
else
1920-
readDefsym(from, MemoryBufferRef(to, "--defsym"));
1914+
readDefsym(MemoryBufferRef(arg->getValue(), "--defsym"));
19211915
break;
19221916
}
19231917
case OPT_script:

lld/ELF/ScriptParser.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class ScriptParser final : ScriptLexer {
5353
void readLinkerScript();
5454
void readVersionScript();
5555
void readDynamicList();
56-
void readDefsym(StringRef name);
56+
void readDefsym();
5757

5858
private:
5959
void addFile(StringRef path);
@@ -283,9 +283,12 @@ void ScriptParser::readLinkerScript() {
283283
}
284284
}
285285

286-
void ScriptParser::readDefsym(StringRef name) {
286+
void ScriptParser::readDefsym() {
287287
if (errorCount())
288288
return;
289+
inExpr = true;
290+
StringRef name = readName();
291+
expect("=");
289292
Expr e = readExpr();
290293
if (!atEOF())
291294
setError("EOF expected, but got " + next());
@@ -1854,7 +1857,4 @@ void elf::readDynamicList(MemoryBufferRef mb) {
18541857
ScriptParser(mb).readDynamicList();
18551858
}
18561859

1857-
void elf::readDefsym(StringRef name, MemoryBufferRef mb) {
1858-
llvm::TimeTraceScope timeScope("Read defsym input", name);
1859-
ScriptParser(mb).readDefsym(name);
1860-
}
1860+
void elf::readDefsym(MemoryBufferRef mb) { ScriptParser(mb).readDefsym(); }

lld/ELF/ScriptParser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void readVersionScript(MemoryBufferRef mb);
2424
void readDynamicList(MemoryBufferRef mb);
2525

2626
// Parses the defsym expression.
27-
void readDefsym(StringRef name, MemoryBufferRef mb);
27+
void readDefsym(MemoryBufferRef mb);
2828

2929
bool hasWildcard(StringRef s);
3030

lld/test/ELF/defsym.s

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
# RUN: llvm-objdump -d --print-imm-hex %t | FileCheck %s --check-prefix=USE
66

77
## Check that we accept --defsym foo2=foo1 form.
8-
# RUN: ld.lld -o %t2 %t.o --defsym foo2=foo1
8+
# RUN: ld.lld -o %t2 %t.o --defsym '"foo2"=foo1'
99
# RUN: llvm-readelf -s %t2 | FileCheck %s
1010
# RUN: llvm-objdump -d --print-imm-hex %t2 | FileCheck %s --check-prefix=USE
1111

1212
## Check we are reporting the error correctly and don't crash
1313
## when handling the second --defsym.
14-
# RUN: not ld.lld -o /dev/null %t.o --defsym ERR+ --defsym foo2=foo1 2>&1 | FileCheck %s --check-prefix=ERR
15-
# ERR: error: --defsym: syntax error: ERR+
14+
# RUN: not ld.lld -o /dev/null %t.o --defsym ERR+ --defsym foo2=foo1 2>&1 | FileCheck %s --check-prefix=ERR --strict-whitespace
15+
# ERR:error: --defsym:1: = expected, but got +
16+
# ERR-NEXT:>>> ERR+
17+
# ERR-NEXT:>>> ^
1618

1719
# CHECK-DAG: 0000000000000123 0 NOTYPE GLOBAL DEFAULT ABS foo1
1820
# CHECK-DAG: 0000000000000123 0 NOTYPE GLOBAL DEFAULT ABS foo2
@@ -41,10 +43,9 @@
4143
# ERR2: error: --defsym:1: EOF expected, but got ,
4244

4345
# RUN: not ld.lld -o /dev/null %t.o --defsym=foo 2>&1 | FileCheck %s -check-prefix=ERR3
44-
# ERR3: error: --defsym: syntax error: foo
46+
# ERR3: error: --defsym:1: unexpected EOF
4547

46-
# RUN: not ld.lld -o /dev/null %t.o --defsym= 2>&1 | FileCheck %s -check-prefix=ERR4
47-
# ERR4: error: --defsym: syntax error:
48+
# RUN: not ld.lld -o /dev/null %t.o --defsym= 2>&1 | FileCheck %s -check-prefix=ERR3
4849

4950
.globl foo1
5051
foo1 = 0x123

0 commit comments

Comments
 (0)