[llvm-commits] [lld] r173655 - [ELF] Use entry point from LinkerOptions.
Michael J. Spencer
bigcheesegs at gmail.com
Sun Jan 27 20:15:44 PST 2013
Author: mspencer
Date: Sun Jan 27 22:15:44 2013
New Revision: 173655
URL: http://llvm.org/viewvc/llvm-project?rev=173655&view=rev
Log:
[ELF] Use entry point from LinkerOptions.
Patch by Ahmed Bougacha!
Added:
lld/trunk/test/elf/entry.objtxt
Modified:
lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h
lld/trunk/lib/Driver/Drivers.cpp
lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp
lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp
lld/trunk/tools/lld-core/lld-core.cpp
Modified: lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h?rev=173655&r1=173654&r2=173655&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h Sun Jan 27 22:15:44 2013
@@ -34,6 +34,7 @@ public:
uint16_t getOutputType() const;
uint16_t getOutputMachine() const;
+ virtual StringRef getEntry() const;
virtual uint64_t getBaseAddress() const { return _options._baseAddress; }
static std::unique_ptr<ELFTargetInfo> create(const LinkerOptions &lo);
Modified: lld/trunk/lib/Driver/Drivers.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Drivers.cpp?rev=173655&r1=173654&r2=173655&view=diff
==============================================================================
--- lld/trunk/lib/Driver/Drivers.cpp (original)
+++ lld/trunk/lib/Driver/Drivers.cpp Sun Jan 27 22:15:44 2013
@@ -124,9 +124,6 @@ public:
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_entry))
newArgs->AddJoinedArg(A, _core.getOption(core::OPT_entry), A->getValue());
- else
- newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_entry),
- "_start");
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_output))
newArgs->AddJoinedArg(A, _core.getOption(core::OPT_output),
Modified: lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp?rev=173655&r1=173654&r2=173655&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp Sun Jan 27 22:15:44 2013
@@ -68,4 +68,11 @@ std::unique_ptr<ELFTargetInfo> ELFTarget
return std::unique_ptr<ELFTargetInfo>();
}
}
+
+StringRef ELFTargetInfo::getEntry() const {
+ if (!_options._entrySymbol.empty())
+ return _options._entrySymbol;
+ return "_start";
+}
+
} // end namespace lld
Modified: lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp?rev=173655&r1=173654&r2=173655&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp Sun Jan 27 22:15:44 2013
@@ -149,7 +149,7 @@ void ELFExecutableWriter<ELFT>::assignSe
/// absolute symbols
template<class ELFT>
void ELFExecutableWriter<ELFT>::addDefaultAtoms() {
- _runtimeFile.addUndefinedAtom("_start");
+ _runtimeFile.addUndefinedAtom(_targetInfo.getEntry());
_runtimeFile.addAbsoluteAtom("__bss_start");
_runtimeFile.addAbsoluteAtom("__bss_end");
_runtimeFile.addAbsoluteAtom("_end");
@@ -268,7 +268,7 @@ ELFExecutableWriter<ELFT>::writeFile(con
_elfHeader->e_shnum(_shdrtab->numHeaders());
_elfHeader->e_shstrndx(_shstrtab->ordinal());
uint64_t virtualAddr = 0;
- _layout->findAtomAddrByName("_start", virtualAddr);
+ _layout->findAtomAddrByName(_targetInfo.getEntry(), virtualAddr);
_elfHeader->e_entry(virtualAddr);
// HACK: We have to write out the header and program header here even though
Modified: lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp?rev=173655&r1=173654&r2=173655&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp Sun Jan 27 22:15:44 2013
@@ -70,8 +70,6 @@ public:
virtual uint64_t getPageZeroSize() const { return getPageSize(); }
virtual StringRef getEntry() const {
- if (_options._outputKind != OutputKind::Executable)
- return "";
if (!_options._entrySymbol.empty())
return _options._entrySymbol;
return "_main";
Added: lld/trunk/test/elf/entry.objtxt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/entry.objtxt?rev=173655&view=auto
==============================================================================
--- lld/trunk/test/elf/entry.objtxt (added)
+++ lld/trunk/test/elf/entry.objtxt Sun Jan 27 22:15:44 2013
@@ -0,0 +1,57 @@
+# Tests entry point handling
+#
+# Test generated using the source file below:
+#
+# int main()
+# {
+# return 0;
+# }
+#
+
+# RUN: lld-core -reader YAML %s -writer ELF --entry=_entrypoint -o %t1
+# RUN: llvm-nm -n %t1 | FileCheck %s
+#
+# CHECK: 000000a0 T main
+# CHECK: 00001000 A _end
+# CHECK: 00001000 A end
+# CHECK: w _entrypoint
+
+defined-atoms:
+ - name: .text
+ alignment: 2^4
+ section-choice: custom-required
+ section-name: .text
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
+ 00, C3 ]
+ alignment: 2^4
+ section-choice: custom-required
+ section-name: .text
+ - name: .data
+ type: data
+ alignment: 2^2
+ section-choice: custom-required
+ section-name: .data
+ - name: .bss
+ type: zero-fill
+ alignment: 2^2
+ section-choice: custom-required
+ section-name: .bss
+ - name: .note.GNU-stack
+ section-choice: custom-required
+ section-name: .note.GNU-stack
+ permissions: r--
+ - name: .eh_frame
+ content: [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00,
+ 01, 78, 10, 01, 1B, 0C, 07, 08, 90, 01, 00, 00,
+ 14, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00,
+ 0E, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ]
+ alignment: 2^3
+ section-choice: custom-required
+ section-name: .eh_frame
+ permissions: r--
+ references:
+ - kind: call32
+ offset: 32
+ target: .text
Modified: lld/trunk/tools/lld-core/lld-core.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld-core/lld-core.cpp?rev=173655&r1=173654&r2=173655&view=diff
==============================================================================
--- lld/trunk/tools/lld-core/lld-core.cpp (original)
+++ lld/trunk/tools/lld-core/lld-core.cpp Sun Jan 27 22:15:44 2013
@@ -92,6 +92,11 @@ llvm::cl::opt<bool>
cmdLineGlobalsNotDeadStrip("keep-globals",
llvm::cl::desc("All global symbols are roots for dead-strip"));
+llvm::cl::opt<std::string>
+cmdLineEntryPoint("entry",
+ llvm::cl::desc("Specify entry point symbol"),
+ llvm::cl::value_desc("symbol"));
+
enum WriteChoice {
writeYAML, writeMachO, writePECOFF, writeELF
@@ -221,6 +226,7 @@ int main(int argc, char *argv[]) {
lo._globalsAreDeadStripRoots = cmdLineGlobalsNotDeadStrip;
lo._forceLoadArchives = cmdLineForceLoad;
lo._outputKind = OutputKind::Executable;
+ lo._entrySymbol = cmdLineEntryPoint;
switch (archSelected) {
case i386:
More information about the llvm-commits
mailing list