From 121eb4257d30348fadb3c4aaab0e9cc41c4588e1 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 27 Mar 2015 15:01:40 +0000 Subject: [PATCH] Close unique sections when switching away from them. It is not possible to switch back to unique secitons, so close them automatically when switching away. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233380 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCSection.h | 6 ++++-- include/llvm/MC/MCSectionCOFF.h | 2 +- include/llvm/MC/MCSectionELF.h | 6 ++---- lib/MC/MCSectionMachO.cpp | 2 +- lib/MC/MCStreamer.cpp | 6 ++++++ lib/Target/NVPTX/NVPTXSection.h | 3 ++- test/CodeGen/X86/global-sections-comdat.ll | 1 + 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h index ab8968ef2ba..fc0fc7bc8ff 100644 --- a/include/llvm/MC/MCSection.h +++ b/include/llvm/MC/MCSection.h @@ -39,10 +39,11 @@ private: mutable MCSymbol *End; protected: - MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin) - : Begin(Begin), End(nullptr), Variant(V), Kind(K) {} + MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin, bool Unique) + : Begin(Begin), End(nullptr), Variant(V), Kind(K), Unique(Unique) {} SectionVariant Variant; SectionKind Kind; + bool Unique; public: virtual ~MCSection(); @@ -54,6 +55,7 @@ public: MCSymbol *getBeginSymbol() const { return Begin; } MCSymbol *getEndSymbol(MCContext &Ctx) const; bool hasEnded() const; + bool isUnique() const { return Unique; } virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, const MCExpr *Subsection) const = 0; diff --git a/include/llvm/MC/MCSectionCOFF.h b/include/llvm/MC/MCSectionCOFF.h index b6ec1d852d4..201c4fae294 100644 --- a/include/llvm/MC/MCSectionCOFF.h +++ b/include/llvm/MC/MCSectionCOFF.h @@ -47,7 +47,7 @@ class MCSymbol; MCSectionCOFF(StringRef Section, unsigned Characteristics, MCSymbol *COMDATSymbol, int Selection, SectionKind K, MCSymbol *Begin) - : MCSection(SV_COFF, K, Begin), SectionName(Section), + : MCSection(SV_COFF, K, Begin, /*Unique*/ false), SectionName(Section), Characteristics(Characteristics), COMDATSymbol(COMDATSymbol), Selection(Selection) { assert ((Characteristics & 0x00F00000) == 0 && diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h index 434a5b6a892..2bbc81fd79b 100644 --- a/include/llvm/MC/MCSectionELF.h +++ b/include/llvm/MC/MCSectionELF.h @@ -39,8 +39,6 @@ class MCSectionELF : public MCSection { /// below. unsigned Flags; - bool Unique; - /// EntrySize - The size of each entry in this section. This size only /// makes sense for sections that contain fixed-sized entries. If a /// section does not contain fixed-sized entries 'EntrySize' will be 0. @@ -53,8 +51,8 @@ private: MCSectionELF(StringRef Section, unsigned type, unsigned flags, SectionKind K, unsigned entrySize, const MCSymbol *group, bool Unique, MCSymbol *Begin) - : MCSection(SV_ELF, K, Begin), SectionName(Section), Type(type), - Flags(flags), Unique(Unique), EntrySize(entrySize), Group(group) {} + : MCSection(SV_ELF, K, Begin, Unique), SectionName(Section), Type(type), + Flags(flags), EntrySize(entrySize), Group(group) {} ~MCSectionELF(); void setSectionName(StringRef Name) { SectionName = Name; } diff --git a/lib/MC/MCSectionMachO.cpp b/lib/MC/MCSectionMachO.cpp index c9f15914e4b..606d0747528 100644 --- a/lib/MC/MCSectionMachO.cpp +++ b/lib/MC/MCSectionMachO.cpp @@ -72,7 +72,7 @@ ENTRY(nullptr /*FIXME*/, S_ATTR_LOC_RELOC) MCSectionMachO::MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA, unsigned reserved2, SectionKind K, MCSymbol *Begin) - : MCSection(SV_MachO, K, Begin), TypeAndAttributes(TAA), + : MCSection(SV_MachO, K, Begin, /*Unique*/ false), TypeAndAttributes(TAA), Reserved2(reserved2) { assert(Segment.size() <= 16 && Section.size() <= 16 && "Segment or section string too long"); diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 27d0355bb11..3db23455404 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -669,6 +669,12 @@ void MCStreamer::SwitchSection(const MCSection *Section, MCSectionSubPair curSection = SectionStack.back().first; SectionStack.back().second = curSection; if (MCSectionSubPair(Section, Subsection) != curSection) { + const MCSection *CurSec = curSection.first; + if (CurSec && CurSec->isUnique()) { + MCSymbol *Sym = curSection.first->getEndSymbol(Context); + if (!Sym->isInSection()) + EmitLabel(Sym); + } SectionStack.back().first = MCSectionSubPair(Section, Subsection); assert(!Section->hasEnded() && "Section already ended"); ChangeSection(Section, Subsection); diff --git a/lib/Target/NVPTX/NVPTXSection.h b/lib/Target/NVPTX/NVPTXSection.h index 0d2627d62eb..eb6194a23ee 100644 --- a/lib/Target/NVPTX/NVPTXSection.h +++ b/lib/Target/NVPTX/NVPTXSection.h @@ -26,7 +26,8 @@ namespace llvm { class NVPTXSection : public MCSection { virtual void anchor(); public: - NVPTXSection(SectionVariant V, SectionKind K) : MCSection(V, K, nullptr) {} + NVPTXSection(SectionVariant V, SectionKind K) + : MCSection(V, K, nullptr, /*Unique*/ false) {} virtual ~NVPTXSection() {} /// Override this as NVPTX has its own way of printing switching diff --git a/test/CodeGen/X86/global-sections-comdat.ll b/test/CodeGen/X86/global-sections-comdat.ll index 730050dda5f..46188e7153b 100644 --- a/test/CodeGen/X86/global-sections-comdat.ll +++ b/test/CodeGen/X86/global-sections-comdat.ll @@ -36,6 +36,7 @@ bb5: ; LINUX-SECTIONS-SHORT: .section .text,"axG",@progbits,F1,comdat ; LINUX-SECTIONS-SHORT: .size F1, ; LINUX-SECTIONS-SHORT-NEXT: .cfi_endproc +; LINUX-SECTIONS-SHORT-NEXT: .Lsec_end0: ; LINUX-SECTIONS-SHORT-NEXT: .section .rodata,"aG",@progbits,F1,comdat $G16 = comdat any -- 2.34.1