<div dir="ltr">Nice! We probably should de-template more classes by simply using int64 instead of intX_t (which is either 32-bit or 64-bit depending on the target) to reduce complexity.<div class="gmail_extra"><br><div class="gmail_quote">On Mon, Dec 19, 2016 at 11:01 AM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Mon Dec 19 11:01:01 2016<br>
New Revision: 290115<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=290115&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=290115&view=rev</a><br>
Log:<br>
Detemplate PhdrEntry. NFC.<br>
<br>
Modified:<br>
    lld/trunk/ELF/LinkerScript.cpp<br>
    lld/trunk/ELF/LinkerScript.h<br>
    lld/trunk/ELF/OutputSections.h<br>
    lld/trunk/ELF/Symbols.cpp<br>
    lld/trunk/ELF/Writer.cpp<br>
    lld/trunk/ELF/Writer.h<br>
<br>
Modified: lld/trunk/ELF/LinkerScript.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=290115&r1=290114&r2=290115&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/LinkerScri<wbr>pt.cpp?rev=290115&r1=290114&<wbr>r2=290115&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/LinkerScript.cpp (original)<br>
+++ lld/trunk/ELF/LinkerScript.cpp Mon Dec 19 11:01:01 2016<br>
@@ -714,7 +714,7 @@ template <class ELFT> void LinkerScript<<br>
 }<br>
<br>
 template <class ELFT><br>
-void LinkerScript<ELFT>::assignAddr<wbr>esses(std::vector<PhdrEntry<<wbr>ELFT>> &Phdrs) {<br>
+void LinkerScript<ELFT>::assignAddr<wbr>esses(std::vector<PhdrEntry> &Phdrs) {<br>
   // Assign addresses as instructed by linker script SECTIONS sub-commands.<br>
   Dot = 0;<br>
<br>
@@ -749,9 +749,8 @@ void LinkerScript<ELFT>::assignAddr<wbr>esses<br>
<br>
   uintX_t HeaderSize = getHeaderSize();<br>
   auto FirstPTLoad =<br>
-      std::find_if(Phdrs.begin(), Phdrs.end(), [](const PhdrEntry<ELFT> &E) {<br>
-        return E.H.p_type == PT_LOAD;<br>
-      });<br>
+      std::find_if(Phdrs.begin(), Phdrs.end(),<br>
+                   [](const PhdrEntry &E) { return E.p_type == PT_LOAD; });<br>
   if (FirstPTLoad == Phdrs.end())<br>
     return;<br>
<br>
@@ -771,15 +770,14 @@ void LinkerScript<ELFT>::assignAddr<wbr>esses<br>
 }<br>
<br>
 // Creates program headers as instructed by PHDRS linker script command.<br>
-template <class ELFT><br>
-std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdr<wbr>s() {<br>
-  std::vector<PhdrEntry<ELFT>> Ret;<br>
+template <class ELFT> std::vector<PhdrEntry> LinkerScript<ELFT>::createPhdr<wbr>s() {<br>
+  std::vector<PhdrEntry> Ret;<br>
<br>
   // Process PHDRS and FILEHDR keywords because they are not<br>
   // real output sections and cannot be added in the following loop.<br>
   for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) {<br>
     Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags);<br>
-    PhdrEntry<ELFT> &Phdr = Ret.back();<br>
+    PhdrEntry &Phdr = Ret.back();<br>
<br>
     if (Cmd.HasFilehdr)<br>
       Phdr.add(Out<ELFT>::<wbr>ElfHeader);<br>
@@ -787,7 +785,7 @@ std::vector<PhdrEntry<ELFT>> LinkerScrip<br>
       Phdr.add(Out<ELFT>::ProgramHe<wbr>aders);<br>
<br>
     if (Cmd.LMAExpr) {<br>
-      Phdr.H.p_paddr = Cmd.LMAExpr(0);<br>
+      Phdr.p_paddr = Cmd.LMAExpr(0);<br>
       Phdr.HasLMA = true;<br>
     }<br>
   }<br>
@@ -801,7 +799,7 @@ std::vector<PhdrEntry<ELFT>> LinkerScrip<br>
     for (size_t Id : getPhdrIndices(Sec->getName())<wbr>) {<br>
       Ret[Id].add(Sec);<br>
       if (Opt.PhdrsCommands[Id].Flags == UINT_MAX)<br>
-        Ret[Id].H.p_flags |= Sec->getPhdrFlags();<br>
+        Ret[Id].p_flags |= Sec->getPhdrFlags();<br>
     }<br>
   }<br>
   return Ret;<br>
<br>
Modified: lld/trunk/ELF/LinkerScript.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=290115&r1=290114&r2=290115&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/LinkerScri<wbr>pt.h?rev=290115&r1=290114&r2=<wbr>290115&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/LinkerScript.h (original)<br>
+++ lld/trunk/ELF/LinkerScript.h Mon Dec 19 11:01:01 2016<br>
@@ -233,7 +233,7 @@ public:<br>
   void adjustSectionsBeforeSorting();<br>
   void adjustSectionsAfterSorting();<br>
<br>
-  std::vector<PhdrEntry<ELFT>> createPhdrs();<br>
+  std::vector<PhdrEntry> createPhdrs();<br>
   bool ignoreInterpSection();<br>
<br>
   uint32_t getFiller(StringRef Name);<br>
@@ -242,7 +242,7 @@ public:<br>
   bool shouldKeep(InputSectionBase<EL<wbr>FT> *S);<br>
   void assignOffsets(OutputSectionCom<wbr>mand *Cmd);<br>
   void placeOrphanSections();<br>
-  void assignAddresses(std::vector<Ph<wbr>drEntry<ELFT>> &Phdrs);<br>
+  void assignAddresses(std::vector<Ph<wbr>drEntry> &Phdrs);<br>
   bool hasPhdrsCommands();<br>
   uint64_t getHeaderSize() override;<br>
   uint64_t getSymbolValue(StringRef S) override;<br>
<br>
Modified: lld/trunk/ELF/OutputSections.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=290115&r1=290114&r2=290115&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/OutputSect<wbr>ions.h?rev=290115&r1=290114&<wbr>r2=290115&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/OutputSections.h (original)<br>
+++ lld/trunk/ELF/OutputSections.h Mon Dec 19 11:01:01 2016<br>
@@ -20,6 +20,7 @@<br>
 namespace lld {<br>
 namespace elf {<br>
<br>
+struct PhdrEntry;<br>
 class SymbolBody;<br>
 struct EhSectionPiece;<br>
 template <class ELFT> class EhInputSection;<br>
@@ -207,7 +208,7 @@ template <class ELFT> struct Out {<br>
   static OutputSection<ELFT> *Bss;<br>
   static OutputSectionBase *Opd;<br>
   static uint8_t *OpdBuf;<br>
-  static Elf_Phdr *TlsPhdr;<br>
+  static PhdrEntry *TlsPhdr;<br>
   static OutputSectionBase *DebugInfo;<br>
   static OutputSectionBase *ElfHeader;<br>
   static OutputSectionBase *ProgramHeaders;<br>
@@ -254,7 +255,7 @@ template <class ELFT> EhOutputSection<EL<br>
 template <class ELFT> OutputSection<ELFT> *Out<ELFT>::Bss;<br>
 template <class ELFT> OutputSectionBase *Out<ELFT>::Opd;<br>
 template <class ELFT> uint8_t *Out<ELFT>::OpdBuf;<br>
-template <class ELFT> typename ELFT::Phdr *Out<ELFT>::TlsPhdr;<br>
+template <class ELFT> PhdrEntry *Out<ELFT>::TlsPhdr;<br>
 template <class ELFT> OutputSectionBase *Out<ELFT>::DebugInfo;<br>
 template <class ELFT> OutputSectionBase *Out<ELFT>::ElfHeader;<br>
 template <class ELFT> OutputSectionBase *Out<ELFT>::ProgramHeaders;<br>
<br>
Modified: lld/trunk/ELF/Symbols.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=290115&r1=290114&r2=290115&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/Symbols.cp<wbr>p?rev=290115&r1=290114&r2=2901<wbr>15&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Symbols.cpp (original)<br>
+++ lld/trunk/ELF/Symbols.cpp Mon Dec 19 11:01:01 2016<br>
@@ -15,6 +15,7 @@<br>
 #include "Strings.h"<br>
 #include "SyntheticSections.h"<br>
 #include "Target.h"<br>
+#include "Writer.h"<br>
<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/Support/Path.h"<br>
<br>
Modified: lld/trunk/ELF/Writer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=290115&r1=290114&r2=290115&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/Writer.cpp<wbr>?rev=290115&r1=290114&r2=29011<wbr>5&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Writer.cpp (original)<br>
+++ lld/trunk/ELF/Writer.cpp Mon Dec 19 11:01:01 2016<br>
@@ -48,8 +48,6 @@ public:<br>
   void run();<br>
<br>
 private:<br>
-  typedef PhdrEntry<ELFT> Phdr;<br>
-<br>
   void createSyntheticSections();<br>
   void copyLocalSymbols();<br>
   void addReservedSymbols();<br>
@@ -60,9 +58,9 @@ private:<br>
   void finalizeSections();<br>
   void addPredefinedSections();<br>
<br>
-  std::vector<Phdr> createPhdrs();<br>
+  std::vector<PhdrEntry> createPhdrs();<br>
   void removeEmptyPTLoad();<br>
-  void addPtArmExid(std::vector<Phdr> &Phdrs);<br>
+  void addPtArmExid(std::vector<PhdrE<wbr>ntry> &Phdrs);<br>
   void assignAddresses();<br>
   void assignFileOffsets();<br>
   void assignFileOffsetsBinary();<br>
@@ -87,7 +85,7 @@ private:<br>
   uintX_t getEntryAddr();<br>
   OutputSectionBase *findSection(StringRef Name);<br>
<br>
-  std::vector<Phdr> Phdrs;<br>
+  std::vector<PhdrEntry> Phdrs;<br>
<br>
   uintX_t FileSize;<br>
   uintX_t SectionHeaderOff;<br>
@@ -135,8 +133,8 @@ template <class ELFT> static bool needsI<br>
 template <class ELFT> void elf::writeResult() { Writer<ELFT>().run(); }<br>
<br>
 template <class ELFT> void Writer<ELFT>::removeEmptyPTLoa<wbr>d() {<br>
-  auto I = std::remove_if(Phdrs.begin(), Phdrs.end(), [&](const Phdr &P) {<br>
-    if (P.H.p_type != PT_LOAD)<br>
+  auto I = std::remove_if(Phdrs.begin(), Phdrs.end(), [&](const PhdrEntry &P) {<br>
+    if (P.p_type != PT_LOAD)<br>
       return false;<br>
     if (!P.First)<br>
       return true;<br>
@@ -603,18 +601,17 @@ static bool compareSections(const Output<br>
 }<br>
<br>
 // Program header entry<br>
-template <class ELFT><br>
-PhdrEntry<ELFT>::PhdrEntry(un<wbr>signed Type, unsigned Flags) {<br>
-  H.p_type = Type;<br>
-  H.p_flags = Flags;<br>
+PhdrEntry::PhdrEntry(unsigned Type, unsigned Flags) {<br>
+  p_type = Type;<br>
+  p_flags = Flags;<br>
 }<br>
<br>
-template <class ELFT> void PhdrEntry<ELFT>::add(OutputSec<wbr>tionBase *Sec) {<br>
+void PhdrEntry::add(OutputSectionBa<wbr>se *Sec) {<br>
   Last = Sec;<br>
   if (!First)<br>
     First = Sec;<br>
-  H.p_align = std::max<typename ELFT::uint>(H.p_align, Sec->Addralign);<br>
-  if (H.p_type == PT_LOAD)<br>
+  p_align = std::max(p_align, Sec->Addralign);<br>
+  if (p_type == PT_LOAD)<br>
     Sec->FirstInPtLoad = First;<br>
 }<br>
<br>
@@ -1136,34 +1133,34 @@ static typename ELFT::uint computeFlags(<br>
<br>
 // Decide which program headers to create and which sections to include in each<br>
 // one.<br>
-template <class ELFT> std::vector<PhdrEntry<ELFT>> Writer<ELFT>::createPhdrs() {<br>
-  std::vector<Phdr> Ret;<br>
-  auto AddHdr = [&](unsigned Type, unsigned Flags) -> Phdr * {<br>
+template <class ELFT> std::vector<PhdrEntry> Writer<ELFT>::createPhdrs() {<br>
+  std::vector<PhdrEntry> Ret;<br>
+  auto AddHdr = [&](unsigned Type, unsigned Flags) -> PhdrEntry * {<br>
     Ret.emplace_back(Type, Flags);<br>
     return &Ret.back();<br>
   };<br>
<br>
   // The first phdr entry is PT_PHDR which describes the program header itself.<br>
-  Phdr &Hdr = *AddHdr(PT_PHDR, PF_R);<br>
+  PhdrEntry &Hdr = *AddHdr(PT_PHDR, PF_R);<br>
   Hdr.add(Out<ELFT>::ProgramHea<wbr>ders);<br>
<br>
   // PT_INTERP must be the second entry if exists.<br>
   if (OutputSectionBase *Sec = findSection(".interp")) {<br>
-    Phdr &Hdr = *AddHdr(PT_INTERP, Sec->getPhdrFlags());<br>
+    PhdrEntry &Hdr = *AddHdr(PT_INTERP, Sec->getPhdrFlags());<br>
     Hdr.add(Sec);<br>
   }<br>
<br>
   // Add the first PT_LOAD segment for regular output sections.<br>
   uintX_t Flags = computeFlags<ELFT>(PF_R);<br>
-  Phdr *Load = AddHdr(PT_LOAD, Flags);<br>
+  PhdrEntry *Load = AddHdr(PT_LOAD, Flags);<br>
   if (!ScriptConfig->HasSections) {<br>
     Load->add(Out<ELFT>::ElfHeade<wbr>r);<br>
     Load->add(Out<ELFT>::ProgramH<wbr>eaders);<br>
   }<br>
<br>
-  Phdr TlsHdr(PT_TLS, PF_R);<br>
-  Phdr RelRo(PT_GNU_RELRO, PF_R);<br>
-  Phdr Note(PT_NOTE, PF_R);<br>
+  PhdrEntry TlsHdr(PT_TLS, PF_R);<br>
+  PhdrEntry RelRo(PT_GNU_RELRO, PF_R);<br>
+  PhdrEntry Note(PT_NOTE, PF_R);<br>
   for (OutputSectionBase *Sec : OutputSections) {<br>
     if (!(Sec->Flags & SHF_ALLOC))<br>
       break;<br>
@@ -1202,7 +1199,8 @@ template <class ELFT> std::vector<PhdrEn<br>
<br>
   // Add an entry for .dynamic.<br>
   if (In<ELFT>::DynSymTab) {<br>
-    Phdr &H = *AddHdr(PT_DYNAMIC, In<ELFT>::Dynamic->OutSec->get<wbr>PhdrFlags());<br>
+    PhdrEntry &H =<br>
+        *AddHdr(PT_DYNAMIC, In<ELFT>::Dynamic->OutSec->get<wbr>PhdrFlags());<br>
     H.add(In<ELFT>::Dynamic->OutS<wbr>ec);<br>
   }<br>
<br>
@@ -1213,7 +1211,7 @@ template <class ELFT> std::vector<PhdrEn<br>
<br>
   // PT_GNU_EH_FRAME is a special section pointing on .eh_frame_hdr.<br>
   if (!Out<ELFT>::EhFrame->empty() && In<ELFT>::EhFrameHdr) {<br>
-    Phdr &Hdr =<br>
+    PhdrEntry &Hdr =<br>
         *AddHdr(PT_GNU_EH_FRAME, In<ELFT>::EhFrameHdr->OutSec-><wbr>getPhdrFlags());<br>
     Hdr.add(In<ELFT>::EhFrameHdr-<wbr>>OutSec);<br>
   }<br>
@@ -1222,16 +1220,16 @@ template <class ELFT> std::vector<PhdrEn<br>
   // memory image of the program that must be filled with random data before any<br>
   // code in the object is executed.<br>
   if (OutputSectionBase *Sec = findSection(".openbsd.randomda<wbr>ta")) {<br>
-    Phdr &Hdr = *AddHdr(PT_OPENBSD_RANDOMIZE, Sec->getPhdrFlags());<br>
+    PhdrEntry &Hdr = *AddHdr(PT_OPENBSD_RANDOMIZE, Sec->getPhdrFlags());<br>
     Hdr.add(Sec);<br>
   }<br>
<br>
   // PT_GNU_STACK is a special section to tell the loader to make the<br>
   // pages for the stack non-executable.<br>
   if (!Config->ZExecstack) {<br>
-    Phdr &Hdr = *AddHdr(PT_GNU_STACK, PF_R | PF_W);<br>
+    PhdrEntry &Hdr = *AddHdr(PT_GNU_STACK, PF_R | PF_W);<br>
     if (Config->ZStackSize != uint64_t(-1))<br>
-      Hdr.H.p_memsz = Config->ZStackSize;<br>
+      Hdr.p_memsz = Config->ZStackSize;<br>
   }<br>
<br>
   // PT_OPENBSD_WXNEEDED is a OpenBSD-specific header to mark the executable<br>
@@ -1247,7 +1245,7 @@ template <class ELFT> std::vector<PhdrEn<br>
 }<br>
<br>
 template <class ELFT><br>
-void Writer<ELFT>::addPtArmExid(std<wbr>::vector<PhdrEntry<ELFT>> &Phdrs) {<br>
+void Writer<ELFT>::addPtArmExid(std<wbr>::vector<PhdrEntry> &Phdrs) {<br>
   if (Config->EMachine != EM_ARM)<br>
     return;<br>
   auto I = std::find_if(<br>
@@ -1257,7 +1255,7 @@ void Writer<ELFT>::addPtArmExid(std<wbr>::vec<br>
     return;<br>
<br>
   // PT_ARM_EXIDX is the ARM EHABI equivalent of PT_GNU_EH_FRAME<br>
-  Phdr ARMExidx(PT_ARM_EXIDX, PF_R);<br>
+  PhdrEntry ARMExidx(PT_ARM_EXIDX, PF_R);<br>
   ARMExidx.add(*I);<br>
   Phdrs.push_back(ARMExidx);<br>
 }<br>
@@ -1265,12 +1263,12 @@ void Writer<ELFT>::addPtArmExid(std<wbr>::vec<br>
 // The first section of each PT_LOAD and the first section after PT_GNU_RELRO<br>
 // have to be page aligned so that the dynamic linker can set the permissions.<br>
 template <class ELFT> void Writer<ELFT>::fixSectionAlignm<wbr>ents() {<br>
-  for (const Phdr &P : Phdrs)<br>
-    if (P.H.p_type == PT_LOAD)<br>
+  for (const PhdrEntry &P : Phdrs)<br>
+    if (P.p_type == PT_LOAD)<br>
       P.First->PageAlign = true;<br>
<br>
-  for (const Phdr &P : Phdrs) {<br>
-    if (P.H.p_type != PT_GNU_RELRO)<br>
+  for (const PhdrEntry &P : Phdrs) {<br>
+    if (P.p_type != PT_GNU_RELRO)<br>
       continue;<br>
     // Find the first section after PT_GNU_RELRO. If it is in a PT_LOAD we<br>
     // have to align it to a page.<br>
@@ -1381,31 +1379,30 @@ template <class ELFT> void Writer<ELFT>:<br>
 // Finalize the program headers. We call this function after we assign<br>
 // file offsets and VAs to all sections.<br>
 template <class ELFT> void Writer<ELFT>::setPhdrs() {<br>
-  for (Phdr &P : Phdrs) {<br>
-    Elf_Phdr &H = P.H;<br>
+  for (PhdrEntry &P : Phdrs) {<br>
     OutputSectionBase *First = P.First;<br>
     OutputSectionBase *Last = P.Last;<br>
     if (First) {<br>
-      H.p_filesz = Last->Offset - First->Offset;<br>
+      P.p_filesz = Last->Offset - First->Offset;<br>
       if (Last->Type != SHT_NOBITS)<br>
-        H.p_filesz += Last->Size;<br>
-      H.p_memsz = Last->Addr + Last->Size - First->Addr;<br>
-      H.p_offset = First->Offset;<br>
-      H.p_vaddr = First->Addr;<br>
+        P.p_filesz += Last->Size;<br>
+      P.p_memsz = Last->Addr + Last->Size - First->Addr;<br>
+      P.p_offset = First->Offset;<br>
+      P.p_vaddr = First->Addr;<br>
       if (!P.HasLMA)<br>
-        H.p_paddr = First->getLMA();<br>
+        P.p_paddr = First->getLMA();<br>
     }<br>
-    if (H.p_type == PT_LOAD)<br>
-      H.p_align = Config->MaxPageSize;<br>
-    else if (H.p_type == PT_GNU_RELRO)<br>
-      H.p_align = 1;<br>
+    if (P.p_type == PT_LOAD)<br>
+      P.p_align = Config->MaxPageSize;<br>
+    else if (P.p_type == PT_GNU_RELRO)<br>
+      P.p_align = 1;<br>
<br>
     // The TLS pointer goes after PT_TLS. At least glibc will align it,<br>
     // so round up the size to make sure the offsets are correct.<br>
-    if (H.p_type == PT_TLS) {<br>
-      Out<ELFT>::TlsPhdr = &H;<br>
-      if (H.p_memsz)<br>
-        H.p_memsz = alignTo(H.p_memsz, H.p_align);<br>
+    if (P.p_type == PT_TLS) {<br>
+      Out<ELFT>::TlsPhdr = &P;<br>
+      if (P.p_memsz)<br>
+        P.p_memsz = alignTo(P.p_memsz, P.p_align);<br>
     }<br>
   }<br>
 }<br>
@@ -1473,14 +1470,13 @@ template <class ELFT> void Writer<ELFT>:<br>
   // _etext is the first location after the last read-only loadable segment.<br>
   // _edata is the first location after the last read-write loadable segment.<br>
   // _end is the first location after the uninitialized data region.<br>
-  for (Phdr &P : Phdrs) {<br>
-    Elf_Phdr &H = P.H;<br>
-    if (H.p_type != PT_LOAD)<br>
+  for (PhdrEntry &P : Phdrs) {<br>
+    if (P.p_type != PT_LOAD)<br>
       continue;<br>
-    Set(ElfSym<ELFT>::End, ElfSym<ELFT>::End2, H.p_vaddr + H.p_memsz);<br>
+    Set(ElfSym<ELFT>::End, ElfSym<ELFT>::End2, P.p_vaddr + P.p_memsz);<br>
<br>
-    uintX_t Val = H.p_vaddr + H.p_filesz;<br>
-    if (H.p_flags & PF_W)<br>
+    uintX_t Val = P.p_vaddr + P.p_filesz;<br>
+    if (P.p_flags & PF_W)<br>
       Set(ElfSym<ELFT>::Edata, ElfSym<ELFT>::Edata2, Val);<br>
     else<br>
       Set(ElfSym<ELFT>::Etext, ElfSym<ELFT>::Etext2, Val);<br>
@@ -1542,8 +1538,17 @@ template <class ELFT> void Writer<ELFT>:<br>
<br>
   // Write the program header table.<br>
   auto *HBuf = reinterpret_cast<Elf_Phdr *>(Buf + EHdr->e_phoff);<br>
-  for (Phdr &P : Phdrs)<br>
-    *HBuf++ = P.H;<br>
+  for (PhdrEntry &P : Phdrs) {<br>
+    HBuf->p_type = P.p_type;<br>
+    HBuf->p_flags = P.p_flags;<br>
+    HBuf->p_offset = P.p_offset;<br>
+    HBuf->p_vaddr = P.p_vaddr;<br>
+    HBuf->p_paddr = P.p_paddr;<br>
+    HBuf->p_filesz = P.p_filesz;<br>
+    HBuf->p_memsz = P.p_memsz;<br>
+    HBuf->p_align = P.p_align;<br>
+    ++HBuf;<br>
+  }<br>
<br>
   // Write the section header table. Note that the first table entry is null.<br>
   auto *SHdrs = reinterpret_cast<Elf_Shdr *>(Buf + EHdr->e_shoff);<br>
@@ -1671,11 +1676,6 @@ template void elf::writeResult<ELF32BE>(<br>
 template void elf::writeResult<ELF64LE>();<br>
 template void elf::writeResult<ELF64BE>();<br>
<br>
-template struct elf::PhdrEntry<ELF32LE>;<br>
-template struct elf::PhdrEntry<ELF32BE>;<br>
-template struct elf::PhdrEntry<ELF64LE>;<br>
-template struct elf::PhdrEntry<ELF64BE>;<br>
-<br>
 template bool elf::isRelroSection<ELF32LE>(c<wbr>onst OutputSectionBase *);<br>
 template bool elf::isRelroSection<ELF32BE>(c<wbr>onst OutputSectionBase *);<br>
 template bool elf::isRelroSection<ELF64LE>(c<wbr>onst OutputSectionBase *);<br>
<br>
Modified: lld/trunk/ELF/Writer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.h?rev=290115&r1=290114&r2=290115&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/Writer.h?<wbr>rev=290115&r1=290114&r2=290115<wbr>&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Writer.h (original)<br>
+++ lld/trunk/ELF/Writer.h Mon Dec 19 11:01:01 2016<br>
@@ -28,11 +28,19 @@ template <class ELFT> bool isRelroSectio<br>
 // This describes a program header entry.<br>
 // Each contains type, access flags and range of output sections that will be<br>
 // placed in it.<br>
-template <class ELFT> struct PhdrEntry {<br>
+struct PhdrEntry {<br>
   PhdrEntry(unsigned Type, unsigned Flags);<br>
   void add(OutputSectionBase *Sec);<br>
<br>
-  typename ELFT::Phdr H = {};<br>
+  uint64_t p_paddr = 0;<br>
+  uint64_t p_vaddr = 0;<br>
+  uint64_t p_align = 0;<br>
+  uint64_t p_memsz = 0;<br>
+  uint64_t p_filesz = 0;<br>
+  uint64_t p_offset = 0;<br>
+  uint32_t p_type = 0;<br>
+  uint32_t p_flags = 0;<br>
+<br>
   OutputSectionBase *First = nullptr;<br>
   OutputSectionBase *Last = nullptr;<br>
   bool HasLMA = false;<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>