Simplify -e <number> option handling.
authorRui Ueyama <ruiu@google.com>
Wed, 7 Dec 2016 03:23:06 +0000 (03:23 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 7 Dec 2016 03:23:06 +0000 (03:23 +0000)
This patch is to parse the entry symbol name lazily.

llvm-svn: 288882

lld/ELF/Config.h
lld/ELF/Driver.cpp
lld/ELF/Writer.cpp

index 874c5c4..d9aec9e 100644 (file)
@@ -148,7 +148,6 @@ struct Configuration {
   ELFKind EKind = ELFNoneKind;
   uint16_t DefaultSymbolVersion = llvm::ELF::VER_NDX_GLOBAL;
   uint16_t EMachine = llvm::ELF::EM_NONE;
-  uint64_t EntryAddr = 0;
   uint64_t ErrorLimit = 20;
   uint64_t ImageBase;
   uint64_t MaxPageSize;
index 9774c7c..58dd8d6 100644 (file)
@@ -780,18 +780,10 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
   for (InputFile *F : Files)
     Symtab.addFile(F);
 
-  // Add the start symbol.
-  // It initializes either Config->Entry or Config->EntryAddr.
-  // Note that AMDGPU binaries have no entries.
-  if (!Config->Entry.empty()) {
-    // It is either "-e <addr>" or "-e <symbol>".
-    if (!Config->Entry.getAsInteger(0, Config->EntryAddr))
-      Config->Entry = "";
-  } else if (!Config->Relocatable && Config->EMachine != EM_AMDGPU) {
-    // -e was not specified. Use the default start symbol name
-    // if it is resolvable.
+  // Add the start symbol. Note that AMDGPU binaries have no entries.
+  if (Config->Entry.empty() && !Config->Relocatable &&
+      Config->EMachine != EM_AMDGPU)
     Config->Entry = (Config->EMachine == EM_MIPS) ? "__start" : "_start";
-  }
 
   // If an object file defining the entry symbol is in an archive file,
   // extract the file now.
index 555fe78..9f2eb14 100644 (file)
@@ -1402,11 +1402,13 @@ template <class ELFT> void Writer<ELFT>::setPhdrs() {
 // 4. the address of the first byte of the .text section, if present;
 // 5. the address 0.
 template <class ELFT> typename ELFT::uint Writer<ELFT>::getEntryAddr() {
-  // Case 1, 2 or 3
-  if (Config->Entry.empty())
-    return Config->EntryAddr;
+  // Case 1, 2 or 3. As a special case, if the symbol is actually
+  // a number, we'll use that number as an address.
   if (SymbolBody *B = Symtab<ELFT>::X->find(Config->Entry))
     return B->getVA<ELFT>();
+  uint64_t Addr;
+  if (!Config->Entry.getAsInteger(0, Addr))
+    return Addr;
 
   // Case 4
   if (OutputSectionBase *Sec = findSection(".text")) {