From c0939739700a65d222582d91a6eb6bf4bb442c4b Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 20 Feb 2015 23:28:28 +0000 Subject: [PATCH] Use short names for jumptable sections. Also refactor code to remove some duplication. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230087 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 54 +++++++++----------- test/CodeGen/X86/global-sections-comdat.ll | 7 +++ 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 0ef10bfa440..49d0b091e31 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -249,6 +249,27 @@ static StringRef getSectionPrefixForGlobal(SectionKind Kind) { return ".data.rel.ro"; } +static const MCSection * +getUniqueELFSection(MCContext &Ctx, const GlobalValue &GV, SectionKind Kind, + Mangler &Mang, const TargetMachine &TM, unsigned Flags) { + StringRef Prefix = getSectionPrefixForGlobal(Kind); + + SmallString<128> Name(Prefix); + 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 Ctx.getELFSection(Name, getELFSectionType(Name, Kind), Flags, 0, Group, + !UniqueSectionNames); +} + const MCSection *TargetLoweringObjectFileELF:: SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler &Mang, const TargetMachine &TM) const { @@ -264,24 +285,8 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, EmitUniquedSection = TM.getDataSections(); } - if (EmitUniquedSection || GV->hasComdat()) { - StringRef Prefix = getSectionPrefixForGlobal(Kind); - - SmallString<128> Name(Prefix); - 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, getELFSectionType(Name, Kind), - Flags, 0, Group, !UniqueSectionNames); - } + if (EmitUniquedSection || GV->hasComdat()) + return getUniqueELFSection(getContext(), *GV, Kind, Mang, TM, Flags); if (Kind.isText()) return TextSection; @@ -346,17 +351,8 @@ const MCSection *TargetLoweringObjectFileELF::getSectionForJumpTable( 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); + return getUniqueELFSection(getContext(), F, SectionKind::getReadOnly(), Mang, + TM, ELF::SHF_ALLOC); } bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection( diff --git a/test/CodeGen/X86/global-sections-comdat.ll b/test/CodeGen/X86/global-sections-comdat.ll index 0557d9a0ee1..7b4d74c2a33 100644 --- a/test/CodeGen/X86/global-sections-comdat.ll +++ b/test/CodeGen/X86/global-sections-comdat.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mtriple=i386-unknown-linux | FileCheck %s -check-prefix=LINUX ; RUN: llc < %s -mtriple=i386-unknown-linux -data-sections -function-sections | FileCheck %s -check-prefix=LINUX-SECTIONS +; RUN: llc < %s -mtriple=i386-unknown-linux -data-sections -function-sections -unique-section-names=false | FileCheck %s -check-prefix=LINUX-SECTIONS-SHORT $F1 = comdat any define void @F1(i32 %y) comdat { @@ -32,8 +33,14 @@ bb5: ; LINUX-SECTIONS-NEXT: .cfi_endproc ; LINUX-SECTIONS-NEXT: .section .rodata.F1,"aG",@progbits,F1,comdat +; LINUX-SECTIONS-SHORT: .section .text,"axG",@progbits,F1,comdat +; LINUX-SECTIONS-SHORT: .size F1, +; LINUX-SECTIONS-SHORT-NEXT: .cfi_endproc +; LINUX-SECTIONS-SHORT-NEXT: .section .rodata,"aG",@progbits,F1,comdat + $G16 = comdat any @G16 = unnamed_addr constant i32 42, comdat ; LINUX: .section .rodata.G16,"aG",@progbits,G16,comdat ; LINUX-SECTIONS: .section .rodata.G16,"aG",@progbits,G16,comdat +; LINUX-SECTIONS-SHORT: .section .rodata,"aG",@progbits,G16,comdat