[lld] ff7f97a - [ELF] --defsym: support quoted LHS
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 28 12:38:15 PDT 2024
Author: Fangrui Song
Date: 2024-07-28T12:38:10-07:00
New Revision: ff7f97a8199e6e931f5ae2b1ec79e8a1eb9b05d6
URL: https://github.com/llvm/llvm-project/commit/ff7f97a8199e6e931f5ae2b1ec79e8a1eb9b05d6
DIFF: https://github.com/llvm/llvm-project/commit/ff7f97a8199e6e931f5ae2b1ec79e8a1eb9b05d6.diff
LOG: [ELF] --defsym: support quoted LHS
and move = splitting from Driver.cpp to ScriptParser.cpp.
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/ScriptParser.cpp
lld/ELF/ScriptParser.h
lld/test/ELF/defsym.s
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 40e095a133d95..63dbd0ea3f95a 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1911,13 +1911,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
hasInput = true;
break;
case OPT_defsym: {
- StringRef from;
- StringRef to;
- std::tie(from, to) = StringRef(arg->getValue()).split('=');
- if (from.empty() || to.empty())
- error("--defsym: syntax error: " + StringRef(arg->getValue()));
- else
- readDefsym(from, MemoryBufferRef(to, "--defsym"));
+ readDefsym(MemoryBufferRef(arg->getValue(), "--defsym"));
break;
}
case OPT_script:
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 714e290578ce7..107b4c6e7af06 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -53,7 +53,7 @@ class ScriptParser final : ScriptLexer {
void readLinkerScript();
void readVersionScript();
void readDynamicList();
- void readDefsym(StringRef name);
+ void readDefsym();
private:
void addFile(StringRef path);
@@ -283,9 +283,12 @@ void ScriptParser::readLinkerScript() {
}
}
-void ScriptParser::readDefsym(StringRef name) {
+void ScriptParser::readDefsym() {
if (errorCount())
return;
+ inExpr = true;
+ StringRef name = readName();
+ expect("=");
Expr e = readExpr();
if (!atEOF())
setError("EOF expected, but got " + next());
@@ -1854,7 +1857,4 @@ void elf::readDynamicList(MemoryBufferRef mb) {
ScriptParser(mb).readDynamicList();
}
-void elf::readDefsym(StringRef name, MemoryBufferRef mb) {
- llvm::TimeTraceScope timeScope("Read defsym input", name);
- ScriptParser(mb).readDefsym(name);
-}
+void elf::readDefsym(MemoryBufferRef mb) { ScriptParser(mb).readDefsym(); }
diff --git a/lld/ELF/ScriptParser.h b/lld/ELF/ScriptParser.h
index 34b27d2b4787c..d6f71c5ee6329 100644
--- a/lld/ELF/ScriptParser.h
+++ b/lld/ELF/ScriptParser.h
@@ -24,7 +24,7 @@ void readVersionScript(MemoryBufferRef mb);
void readDynamicList(MemoryBufferRef mb);
// Parses the defsym expression.
-void readDefsym(StringRef name, MemoryBufferRef mb);
+void readDefsym(MemoryBufferRef mb);
bool hasWildcard(StringRef s);
diff --git a/lld/test/ELF/defsym.s b/lld/test/ELF/defsym.s
index fed937ffc1c9c..eb409cccfc033 100644
--- a/lld/test/ELF/defsym.s
+++ b/lld/test/ELF/defsym.s
@@ -5,14 +5,16 @@
# RUN: llvm-objdump -d --print-imm-hex %t | FileCheck %s --check-prefix=USE
## Check that we accept --defsym foo2=foo1 form.
-# RUN: ld.lld -o %t2 %t.o --defsym foo2=foo1
+# RUN: ld.lld -o %t2 %t.o --defsym '"foo2"=foo1'
# RUN: llvm-readelf -s %t2 | FileCheck %s
# RUN: llvm-objdump -d --print-imm-hex %t2 | FileCheck %s --check-prefix=USE
## Check we are reporting the error correctly and don't crash
## when handling the second --defsym.
-# RUN: not ld.lld -o /dev/null %t.o --defsym ERR+ --defsym foo2=foo1 2>&1 | FileCheck %s --check-prefix=ERR
-# ERR: error: --defsym: syntax error: ERR+
+# RUN: not ld.lld -o /dev/null %t.o --defsym ERR+ --defsym foo2=foo1 2>&1 | FileCheck %s --check-prefix=ERR --strict-whitespace
+# ERR:error: --defsym:1: = expected, but got +
+# ERR-NEXT:>>> ERR+
+# ERR-NEXT:>>> ^
# CHECK-DAG: 0000000000000123 0 NOTYPE GLOBAL DEFAULT ABS foo1
# CHECK-DAG: 0000000000000123 0 NOTYPE GLOBAL DEFAULT ABS foo2
@@ -41,10 +43,9 @@
# ERR2: error: --defsym:1: EOF expected, but got ,
# RUN: not ld.lld -o /dev/null %t.o --defsym=foo 2>&1 | FileCheck %s -check-prefix=ERR3
-# ERR3: error: --defsym: syntax error: foo
+# ERR3: error: --defsym:1: unexpected EOF
-# RUN: not ld.lld -o /dev/null %t.o --defsym= 2>&1 | FileCheck %s -check-prefix=ERR4
-# ERR4: error: --defsym: syntax error:
+# RUN: not ld.lld -o /dev/null %t.o --defsym= 2>&1 | FileCheck %s -check-prefix=ERR3
.globl foo1
foo1 = 0x123
More information about the llvm-commits
mailing list