forked from OSchip/llvm-project
Move finalize to OutputSectionCommands. NFC.
This removes a mapping from OutputSection to OutputSectionCommand and is another step in moving clearOutputSections earlier. llvm-svn: 304821
This commit is contained in:
parent
13f412f6a2
commit
8c284acf14
|
|
@ -1071,6 +1071,78 @@ static void writeInt(uint8_t *Buf, uint64_t Data, uint64_t Size) {
|
|||
llvm_unreachable("unsupported Size argument");
|
||||
}
|
||||
|
||||
static bool compareByFilePosition(InputSection *A, InputSection *B) {
|
||||
// Synthetic doesn't have link order dependecy, stable_sort will keep it last
|
||||
if (A->kind() == InputSectionBase::Synthetic ||
|
||||
B->kind() == InputSectionBase::Synthetic)
|
||||
return false;
|
||||
InputSection *LA = A->getLinkOrderDep();
|
||||
InputSection *LB = B->getLinkOrderDep();
|
||||
OutputSection *AOut = LA->getParent();
|
||||
OutputSection *BOut = LB->getParent();
|
||||
if (AOut != BOut)
|
||||
return AOut->SectionIndex < BOut->SectionIndex;
|
||||
return LA->OutSecOff < LB->OutSecOff;
|
||||
}
|
||||
|
||||
template <class ELFT> static void finalizeShtGroup(OutputSection *Sec) {
|
||||
// sh_link field for SHT_GROUP sections should contain the section index of
|
||||
// the symbol table.
|
||||
Sec->Link = InX::SymTab->getParent()->SectionIndex;
|
||||
|
||||
// sh_info then contain index of an entry in symbol table section which
|
||||
// provides signature of the section group.
|
||||
elf::ObjectFile<ELFT> *Obj = Sec->Sections[0]->getFile<ELFT>();
|
||||
assert(Config->Relocatable && Sec->Sections.size() == 1);
|
||||
ArrayRef<SymbolBody *> Symbols = Obj->getSymbols();
|
||||
Sec->Info = InX::SymTab->getSymbolIndex(Symbols[Sec->Sections[0]->Info - 1]);
|
||||
}
|
||||
|
||||
template <class ELFT> void OutputSectionCommand::finalize() {
|
||||
if ((Sec->Flags & SHF_LINK_ORDER) && !Sec->Sections.empty()) {
|
||||
// Link order may be distributed across several InputSectionDescriptions
|
||||
// but sort must consider them all at once.
|
||||
std::vector<InputSection **> ScriptSections;
|
||||
std::vector<InputSection *> Sections;
|
||||
for (BaseCommand *Base : Commands)
|
||||
if (auto *ISD = dyn_cast<InputSectionDescription>(Base))
|
||||
for (InputSection *&IS : ISD->Sections) {
|
||||
ScriptSections.push_back(&IS);
|
||||
Sections.push_back(IS);
|
||||
}
|
||||
std::sort(Sections.begin(), Sections.end(), compareByFilePosition);
|
||||
for (int I = 0, N = Sections.size(); I < N; ++I)
|
||||
*ScriptSections[I] = Sections[I];
|
||||
|
||||
// We must preserve the link order dependency of sections with the
|
||||
// SHF_LINK_ORDER flag. The dependency is indicated by the sh_link field. We
|
||||
// need to translate the InputSection sh_link to the OutputSection sh_link,
|
||||
// all InputSections in the OutputSection have the same dependency.
|
||||
if (auto *D = Sec->Sections.front()->getLinkOrderDep())
|
||||
Sec->Link = D->getParent()->SectionIndex;
|
||||
}
|
||||
|
||||
uint32_t Type = Sec->Type;
|
||||
if (Type == SHT_GROUP) {
|
||||
finalizeShtGroup<ELFT>(Sec);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Config->CopyRelocs || (Type != SHT_RELA && Type != SHT_REL))
|
||||
return;
|
||||
|
||||
InputSection *First = Sec->Sections[0];
|
||||
if (isa<SyntheticSection>(First))
|
||||
return;
|
||||
|
||||
Sec->Link = InX::SymTab->getParent()->SectionIndex;
|
||||
// sh_info for SHT_REL[A] sections should contain the section header index of
|
||||
// the section to which the relocation applies.
|
||||
InputSectionBase *S = First->getRelocatedSection();
|
||||
Sec->Info = S->getOutputSection()->SectionIndex;
|
||||
Sec->Flags |= SHF_INFO_LINK;
|
||||
}
|
||||
|
||||
// Compress section contents if this section contains debug info.
|
||||
template <class ELFT> void OutputSectionCommand::maybeCompress() {
|
||||
typedef typename ELFT::Chdr Elf_Chdr;
|
||||
|
|
@ -1201,3 +1273,8 @@ template void OutputSectionCommand::maybeCompress<ELF32LE>();
|
|||
template void OutputSectionCommand::maybeCompress<ELF32BE>();
|
||||
template void OutputSectionCommand::maybeCompress<ELF64LE>();
|
||||
template void OutputSectionCommand::maybeCompress<ELF64BE>();
|
||||
|
||||
template void OutputSectionCommand::finalize<ELF32LE>();
|
||||
template void OutputSectionCommand::finalize<ELF32BE>();
|
||||
template void OutputSectionCommand::finalize<ELF64LE>();
|
||||
template void OutputSectionCommand::finalize<ELF64BE>();
|
||||
|
|
|
|||
|
|
@ -136,6 +136,7 @@ struct OutputSectionCommand : BaseCommand {
|
|||
std::string Location;
|
||||
std::string MemoryRegionName;
|
||||
|
||||
template <class ELFT> void finalize();
|
||||
template <class ELFT> void writeTo(uint8_t *Buf);
|
||||
template <class ELFT> void maybeCompress();
|
||||
uint32_t getFiller();
|
||||
|
|
|
|||
|
|
@ -70,79 +70,6 @@ OutputSection::OutputSection(StringRef Name, uint32_t Type, uint64_t Flags)
|
|||
/*Link*/ 0),
|
||||
SectionIndex(INT_MAX) {}
|
||||
|
||||
static bool compareByFilePosition(InputSection *A, InputSection *B) {
|
||||
// Synthetic doesn't have link order dependecy, stable_sort will keep it last
|
||||
if (A->kind() == InputSectionBase::Synthetic ||
|
||||
B->kind() == InputSectionBase::Synthetic)
|
||||
return false;
|
||||
InputSection *LA = A->getLinkOrderDep();
|
||||
InputSection *LB = B->getLinkOrderDep();
|
||||
OutputSection *AOut = LA->getParent();
|
||||
OutputSection *BOut = LB->getParent();
|
||||
if (AOut != BOut)
|
||||
return AOut->SectionIndex < BOut->SectionIndex;
|
||||
return LA->OutSecOff < LB->OutSecOff;
|
||||
}
|
||||
|
||||
template <class ELFT> static void finalizeShtGroup(OutputSection *Sec) {
|
||||
// sh_link field for SHT_GROUP sections should contain the section index of
|
||||
// the symbol table.
|
||||
Sec->Link = InX::SymTab->getParent()->SectionIndex;
|
||||
|
||||
// sh_info then contain index of an entry in symbol table section which
|
||||
// provides signature of the section group.
|
||||
elf::ObjectFile<ELFT> *Obj = Sec->Sections[0]->getFile<ELFT>();
|
||||
assert(Config->Relocatable && Sec->Sections.size() == 1);
|
||||
ArrayRef<SymbolBody *> Symbols = Obj->getSymbols();
|
||||
Sec->Info = InX::SymTab->getSymbolIndex(Symbols[Sec->Sections[0]->Info - 1]);
|
||||
}
|
||||
|
||||
template <class ELFT> void OutputSection::finalize() {
|
||||
if ((this->Flags & SHF_LINK_ORDER) && !this->Sections.empty()) {
|
||||
OutputSectionCommand *Cmd = Script->getCmd(this);
|
||||
// Link order may be distributed across several InputSectionDescriptions
|
||||
// but sort must consider them all at once.
|
||||
std::vector<InputSection **> ScriptSections;
|
||||
std::vector<InputSection *> Sections;
|
||||
for (BaseCommand *Base : Cmd->Commands)
|
||||
if (auto *ISD = dyn_cast<InputSectionDescription>(Base))
|
||||
for (InputSection *&IS : ISD->Sections) {
|
||||
ScriptSections.push_back(&IS);
|
||||
Sections.push_back(IS);
|
||||
}
|
||||
std::sort(Sections.begin(), Sections.end(), compareByFilePosition);
|
||||
for (int I = 0, N = Sections.size(); I < N; ++I)
|
||||
*ScriptSections[I] = Sections[I];
|
||||
|
||||
// We must preserve the link order dependency of sections with the
|
||||
// SHF_LINK_ORDER flag. The dependency is indicated by the sh_link field. We
|
||||
// need to translate the InputSection sh_link to the OutputSection sh_link,
|
||||
// all InputSections in the OutputSection have the same dependency.
|
||||
if (auto *D = this->Sections.front()->getLinkOrderDep())
|
||||
this->Link = D->getParent()->SectionIndex;
|
||||
}
|
||||
|
||||
uint32_t Type = this->Type;
|
||||
if (Type == SHT_GROUP) {
|
||||
finalizeShtGroup<ELFT>(this);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Config->CopyRelocs || (Type != SHT_RELA && Type != SHT_REL))
|
||||
return;
|
||||
|
||||
InputSection *First = Sections[0];
|
||||
if (isa<SyntheticSection>(First))
|
||||
return;
|
||||
|
||||
this->Link = InX::SymTab->getParent()->SectionIndex;
|
||||
// sh_info for SHT_REL[A] sections should contain the section header index of
|
||||
// the section to which the relocation applies.
|
||||
InputSectionBase *S = First->getRelocatedSection();
|
||||
Info = S->getOutputSection()->SectionIndex;
|
||||
Flags |= SHF_INFO_LINK;
|
||||
}
|
||||
|
||||
static uint64_t updateOffset(uint64_t Off, InputSection *S) {
|
||||
Off = alignTo(Off, S->Alignment);
|
||||
S->OutSecOff = Off;
|
||||
|
|
@ -428,8 +355,3 @@ template void OutputSection::writeHeaderTo<ELF32LE>(ELF32LE::Shdr *Shdr);
|
|||
template void OutputSection::writeHeaderTo<ELF32BE>(ELF32BE::Shdr *Shdr);
|
||||
template void OutputSection::writeHeaderTo<ELF64LE>(ELF64LE::Shdr *Shdr);
|
||||
template void OutputSection::writeHeaderTo<ELF64BE>(ELF64BE::Shdr *Shdr);
|
||||
|
||||
template void OutputSection::finalize<ELF32LE>();
|
||||
template void OutputSection::finalize<ELF32BE>();
|
||||
template void OutputSection::finalize<ELF64LE>();
|
||||
template void OutputSection::finalize<ELF64BE>();
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@ public:
|
|||
void sort(std::function<int(InputSectionBase *S)> Order);
|
||||
void sortInitFini();
|
||||
void sortCtorsDtors();
|
||||
template <class ELFT> void finalize();
|
||||
void assignOffsets();
|
||||
std::vector<InputSection *> Sections;
|
||||
|
||||
|
|
|
|||
|
|
@ -1271,7 +1271,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
|
|||
// at the end because some tags like RELSZ depend on result
|
||||
// of finalizing other sections.
|
||||
for (OutputSectionCommand *Cmd : OutputSectionCommands)
|
||||
Cmd->Sec->finalize<ELFT>();
|
||||
Cmd->finalize<ELFT>();
|
||||
|
||||
// createThunks may have added local symbols to the static symbol table
|
||||
applySynthetic({InX::SymTab, InX::ShStrTab, InX::StrTab},
|
||||
|
|
|
|||
Loading…
Reference in New Issue