Add comments about how we handle mergeable sections with relocations.

Also factored out code.

llvm-svn: 301833
This commit is contained in:
Rui Ueyama 2017-05-01 20:49:09 +00:00
parent c15d60b772
commit 92a8d798b8
1 changed files with 18 additions and 6 deletions

View File

@ -361,6 +361,15 @@ InputSectionBase *elf::ObjectFile<ELFT>::getRelocTarget(const Elf_Shdr &Sec) {
return Target;
}
// Create a regular InputSection class that has the same contents
// as a given section.
InputSectionBase *toRegularSection(MergeInputSection *Sec) {
auto *Ret = make<InputSection>(Sec->Flags, Sec->Type, Sec->Alignment,
Sec->Data, Sec->Name);
Ret->File = Sec->File;
return Ret;
}
template <class ELFT>
InputSectionBase *
elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec,
@ -398,12 +407,15 @@ elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec,
if (Target->FirstRelocation)
fatal(toString(this) +
": multiple relocation sections to one section are not supported");
if (isa<MergeInputSection>(Target)) {
this->Sections[Sec.sh_info] =
make<InputSection>(Target->Flags, Target->Type, Target->Alignment,
Target->Data, Target->Name);
this->Sections[Sec.sh_info]->File = Target->File;
Target = this->Sections[Sec.sh_info];
// Mergeable sections with relocations are tricky because relocations
// need to be taken into account when comparing section contents for
// merging. The MergeInputSection class currently doesn't care about
// relocations, and it's unlikely to support it in future because such
// sections are rare. We simply handle such sections as non-mergeable.
if (auto *MS = dyn_cast<MergeInputSection>(Target)) {
Target = toRegularSection(MS);
this->Sections[Sec.sh_info] = Target;
}
size_t NumRelocations;