From e247dd28399445d4e65089f4c47883230bb1ecf0 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 4 Feb 2015 21:27:24 +0000 Subject: [PATCH] Don' try to make sections in comdats SHF_MERGE. Parts of llvm were not expecting it and we wouldn't print the entity size of the section. Given what comdats are used for, having SHF_MERGE sections would be just a small improvement, so just disable it for now. Fixes pr22463. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228196 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 8 ++++---- test/CodeGen/X86/global-sections-comdat.ll | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/X86/global-sections-comdat.ll diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 0cbd7753055..396d9e4fbfa 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -166,7 +166,7 @@ static unsigned getELFSectionType(StringRef Name, SectionKind K) { static unsigned -getELFSectionFlags(SectionKind K) { +getELFSectionFlags(SectionKind K, bool InCOMDAT) { unsigned Flags = 0; if (!K.isMetadata()) @@ -181,7 +181,7 @@ getELFSectionFlags(SectionKind K) { if (K.isThreadLocal()) Flags |= ELF::SHF_TLS; - if (K.isMergeableCString() || K.isMergeableConst()) + if (!InCOMDAT && (K.isMergeableCString() || K.isMergeableConst())) Flags |= ELF::SHF_MERGE; if (K.isMergeableCString()) @@ -211,7 +211,7 @@ const MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( Kind = getELFKindForNamedSection(SectionName, Kind); StringRef Group = ""; - unsigned Flags = getELFSectionFlags(Kind); + unsigned Flags = getELFSectionFlags(Kind, GV->hasComdat()); if (const Comdat *C = getELFComdat(GV)) { Group = C->getName(); Flags |= ELF::SHF_GROUP; @@ -243,7 +243,7 @@ static StringRef getSectionPrefixForGlobal(SectionKind Kind) { const MCSection *TargetLoweringObjectFileELF:: SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler &Mang, const TargetMachine &TM) const { - unsigned Flags = getELFSectionFlags(Kind); + unsigned Flags = getELFSectionFlags(Kind, GV->hasComdat()); // If we have -ffunction-section or -fdata-section then we should emit the // global value to a uniqued section specifically for it. diff --git a/test/CodeGen/X86/global-sections-comdat.ll b/test/CodeGen/X86/global-sections-comdat.ll new file mode 100644 index 00000000000..a4804a7c5cf --- /dev/null +++ b/test/CodeGen/X86/global-sections-comdat.ll @@ -0,0 +1,8 @@ +; RUN: llc < %s -mtriple=i386-unknown-linux | FileCheck %s -check-prefix=LINUX +; RUN: llc < %s -mtriple=i386-unknown-linux -data-sections | FileCheck %s -check-prefix=LINUX-SECTIONS + +$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