Use short names for jumptable sections.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 20 Feb 2015 23:28:28 +0000 (23:28 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 20 Feb 2015 23:28:28 +0000 (23:28 +0000)
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
test/CodeGen/X86/global-sections-comdat.ll

index 0ef10bfa4407b1ad3d032c2c500922782b8fc332..49d0b091e317f24f0a6fc0cf518920cb7cae17a3 100644 (file)
@@ -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(
index 0557d9a0ee10dbad8eb9b8fe2db12aa13be5d83c..7b4d74c2a33ea989d9d626273ca8f807124c9b2d 100644 (file)
@@ -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