mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
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. llvm-svn: 233380
This commit is contained in:
parent
c4f4971765
commit
7bdf3f2e35
@ -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;
|
||||
|
@ -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 &&
|
||||
|
@ -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; }
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user