<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>