From 68fa249cb5a9755f05e437db618d85e0097de8c3 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 17 Feb 2015 20:48:01 +0000 Subject: Add r228980 back. Add support for having multiple sections with the same name and comdat. Using this in combination with -ffunction-sections allows LLVM to output a .o file with mulitple sections named .text. This saves space by avoiding long unique names of the form .text.. llvm-svn: 229541 --- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 31 +++++++++++++---------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp') diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 17bd024ad28..07d9576222e 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -228,25 +228,25 @@ const MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( /// DataSections. static StringRef getSectionPrefixForGlobal(SectionKind Kind) { if (Kind.isText()) - return ".text."; + return ".text"; if (Kind.isReadOnly()) - return ".rodata."; + return ".rodata"; if (Kind.isBSS()) - return ".bss."; + return ".bss"; if (Kind.isThreadData()) - return ".tdata."; + return ".tdata"; if (Kind.isThreadBSS()) - return ".tbss."; + return ".tbss"; if (Kind.isDataNoRel()) - return ".data."; + return ".data"; if (Kind.isDataRelLocal()) - return ".data.rel.local."; + return ".data.rel.local"; if (Kind.isDataRel()) - return ".data.rel."; + return ".data.rel"; if (Kind.isReadOnlyWithRelLocal()) - return ".data.rel.ro.local."; + return ".data.rel.ro.local"; assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); - return ".data.rel.ro."; + return ".data.rel.ro"; } const MCSection *TargetLoweringObjectFileELF:: @@ -268,16 +268,19 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, StringRef Prefix = getSectionPrefixForGlobal(Kind); SmallString<128> Name(Prefix); - TM.getNameWithPrefix(Name, GV, Mang, true); - + bool UniqueSectionNames = TM.getUniqueSectionNames(); + if (UniqueSectionNames) { + Name.push_back('.'); + TM.getNameWithPrefix(Name, GV, Mang, true); + } StringRef Group = ""; if (const Comdat *C = getELFComdat(GV)) { Flags |= ELF::SHF_GROUP; Group = C->getName(); } - return getContext().getELFSection( - Name.str(), getELFSectionType(Name.str(), Kind), Flags, 0, Group); + return getContext().getELFSection(Name, getELFSectionType(Name, Kind), + Flags, 0, Group, !UniqueSectionNames); } if (Kind.isText()) return TextSection; -- cgit v1.2.3