Put each jump table in an independent section if the function is too.

This allows the linker to GC both, fixing pr22557.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228937 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2015-02-12 17:16:46 +00:00
parent a858be4291
commit 8eeedf74d3
7 changed files with 100 additions and 6 deletions

View File

@ -334,6 +334,28 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
return DataRelROSection;
}
const MCSection *TargetLoweringObjectFileELF::getSectionForJumpTable(
const Function &F, Mangler &Mang, const TargetMachine &TM) const {
// If the function can be removed, produce a unique section so that
// the table doesn't prevent the removal.
const Comdat *C = F.getComdat();
bool EmitUniqueSection = TM.getFunctionSections() || C;
if (!EmitUniqueSection)
return ReadOnlySection;
SmallString<128> Name(".rodata.");
TM.getNameWithPrefix(Name, &F, Mang, true);
unsigned Flags = ELF::SHF_ALLOC;
StringRef Group = "";
if (C) {
Flags |= ELF::SHF_GROUP;
Group = C->getName();
}
return getContext().getELFSection(Name, ELF::SHT_PROGBITS, Flags, 0, Group);
}
/// getSectionForConstant - Given a mergeable constant with the
/// specified size and relocation information, return a section that it
/// should be placed in.