summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Protivensky <dprotivensky@accesssoftek.com>2015-10-08 06:48:38 +0000
committerDenis Protivensky <dprotivensky@accesssoftek.com>2015-10-08 06:48:38 +0000
commit90c5099e8a6e78aa29575bfdc83dfbf1543af7fc (patch)
tree1ba11ae0541d25b4fcf88e4d0b56dd8ce54efefd
parentc10b8381f761ad7ff9a8c34b687b9320e07f9726 (diff)
downloadbcm5719-llvm-90c5099e8a6e78aa29575bfdc83dfbf1543af7fc.tar.gz
bcm5719-llvm-90c5099e8a6e78aa29575bfdc83dfbf1543af7fc.zip
[ELF2] Add ENTRY command to the linker script
Set ENTRY as an entry point if -e is not specified. Differential Revision: http://reviews.llvm.org/D13509 llvm-svn: 249661
-rw-r--r--lld/ELF/LinkerScript.cpp14
-rw-r--r--lld/test/elf2/linkerscript.s23
2 files changed, 35 insertions, 2 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 474801f3b80..a2b4fa5687f 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -37,6 +37,7 @@ private:
void expect(StringRef Expect);
void readAsNeeded();
+ void readEntry();
void readGroup();
void readOutput();
void readOutputFormat();
@@ -49,7 +50,9 @@ private:
void LinkerScript::run() {
while (!atEOF()) {
StringRef Tok = next();
- if (Tok == "GROUP") {
+ if (Tok == "ENTRY") {
+ readEntry();
+ } else if (Tok == "GROUP") {
readGroup();
} else if (Tok == "OUTPUT") {
readOutput();
@@ -131,6 +134,15 @@ void LinkerScript::readAsNeeded() {
}
}
+void LinkerScript::readEntry() {
+ // -e <symbol> takes predecence over ENTRY(<symbol>).
+ expect("(");
+ StringRef Tok = next();
+ if (Config->Entry.empty())
+ Config->Entry = Tok;
+ expect(")");
+}
+
void LinkerScript::readGroup() {
expect("(");
for (;;) {
diff --git a/lld/test/elf2/linkerscript.s b/lld/test/elf2/linkerscript.s
index a7ca392dfac..9703362175f 100644
--- a/lld/test/elf2/linkerscript.s
+++ b/lld/test/elf2/linkerscript.s
@@ -10,6 +10,26 @@
# RUN: ld.lld2 -o %t2 %t.script1
# RUN: llvm-readobj %t2 > /dev/null
+# RUN: echo "ENTRY(_label)" > %t.script
+# RUN: ld.lld2 -o %t2 %t.script %t
+# RUN: llvm-readobj %t2 > /dev/null
+
+# RUN: echo "ENTRY(_wrong_label)" > %t.script
+# RUN: not lld -flavor gnu2 -o %t2 %t.script %t > %t.log 2>&1
+# RUN: FileCheck -check-prefix=ERR-ENTRY %s < %t.log
+
+# ERR-ENTRY: undefined symbol: _wrong_label
+
+# -e has precedence over linker script's ENTRY.
+# RUN: echo "ENTRY(_label)" > %t.script
+# RUN: ld.lld2 -e _start -o %t2 %t.script %t
+# RUN: llvm-readobj -file-headers -symbols %t2 | \
+# RUN: FileCheck -check-prefix=ENTRY-OVERLOAD %s
+
+# ENTRY-OVERLOAD: Entry: [[ENTRY:0x[0-9A-F]+]]
+# ENTRY-OVERLOAD: Name: _start
+# ENTRY-OVERLOAD-NEXT: Value: [[ENTRY]]
+
# RUN: echo "OUTPUT_FORMAT(\"elf64-x86-64\") /*/*/ GROUP(" %t ")" > %t.script
# RUN: ld.lld2 -o %t2 %t.script
# RUN: llvm-readobj %t2 > /dev/null
@@ -29,8 +49,9 @@
# ERR1: unknown directive: FOO
-.globl _start;
+.globl _start, _label;
_start:
mov $60, %rax
mov $42, %rdi
+_label:
syscall
OpenPOWER on IntegriCloud