From 38cff389af1d78bd80df0479ef258493e0c5897e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 13 Aug 2009 00:37:15 +0000 Subject: sink uniquing of sections out of MCContext into the ELF and PECOFF TLOF implementations. MCContext no longer maintains a string -> section map. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78874 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCContext.h | 10 ------- include/llvm/MC/MCSection.h | 10 ++++--- include/llvm/Target/TargetLoweringObjectFile.h | 10 ++++++- lib/MC/MCContext.cpp | 5 ---- lib/MC/MCSection.cpp | 18 ++---------- lib/Target/TargetLoweringObjectFile.cpp | 38 ++++++++++++++++++++++---- 6 files changed, 49 insertions(+), 42 deletions(-) diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index adf3804..082b515 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -46,16 +46,6 @@ namespace llvm { public: MCContext(); ~MCContext(); - - /// GetSection - Look up a section with the given @param Name, returning - /// null if it doesn't exist. - MCSection *GetSection(const StringRef &Name) const; - - void SetSection(const StringRef &Name, MCSection *S) { - MCSection *&Entry = Sections[Name]; - assert(Entry == 0 && "Multiple sections with the same name created"); - Entry = S; - } /// CreateSymbol - Create a new symbol with the specified @param Name. /// diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h index aa40386..b33e8c9 100644 --- a/include/llvm/MC/MCSection.h +++ b/include/llvm/MC/MCSection.h @@ -52,8 +52,9 @@ namespace llvm { /// of a syntactic one. bool IsDirective; - MCSectionELF(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx); + MCSectionELF(const StringRef &name, bool isDirective, SectionKind K) + : MCSection(K), Name(name), IsDirective(isDirective) { + } public: static MCSectionELF *Create(const StringRef &Name, bool IsDirective, @@ -77,8 +78,9 @@ namespace llvm { /// of a syntactic one. bool IsDirective; - MCSectionCOFF(const StringRef &Name, bool IsDirective, SectionKind K, - MCContext &Ctx); + MCSectionCOFF(const StringRef &name, bool isDirective, SectionKind K) + : MCSection(K), Name(name), IsDirective(isDirective) { + } public: static MCSectionCOFF *Create(const StringRef &Name, bool IsDirective, diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 7f74c6b..102928b 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -183,6 +183,7 @@ protected: class TargetLoweringObjectFileELF : public TargetLoweringObjectFile { bool HasCrazyBSS; + mutable void *UniquingMap; protected: /// TLSDataSection - Section directive for Thread Local data. /// @@ -208,7 +209,10 @@ protected: public: TargetLoweringObjectFileELF(// FIXME: REMOVE AFTER UNIQUING IS FIXED. bool hasCrazyBSS = false) - : HasCrazyBSS(hasCrazyBSS) {} + : HasCrazyBSS(hasCrazyBSS), UniquingMap(0) {} + + ~TargetLoweringObjectFileELF(); + virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); @@ -302,7 +306,11 @@ public: class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { + mutable void *UniquingMap; public: + TargetLoweringObjectFileCOFF() : UniquingMap(0) {} + ~TargetLoweringObjectFileCOFF(); + virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); virtual const MCSection * diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 6333835..061d7c2 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -22,11 +22,6 @@ MCContext::~MCContext() { // we don't need to free them here. } -MCSection *MCContext::GetSection(const StringRef &Name) const { - StringMap::const_iterator I = Sections.find(Name); - return I != Sections.end() ? I->second : 0; -} - MCSymbol *MCContext::CreateSymbol(const StringRef &Name) { assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!"); diff --git a/lib/MC/MCSection.cpp b/lib/MC/MCSection.cpp index f6ac5cc..8b7fcd2 100644 --- a/lib/MC/MCSection.cpp +++ b/lib/MC/MCSection.cpp @@ -27,16 +27,9 @@ MCSection::~MCSection() { MCSectionELF *MCSectionELF:: Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { - return new (Ctx) MCSectionELF(Name, IsDirective, K, Ctx); + return new (Ctx) MCSectionELF(Name, IsDirective, K); } -MCSectionELF::MCSectionELF(const StringRef &name, bool isDirective, - SectionKind K, MCContext &Ctx) - : MCSection(K), Name(name), IsDirective(isDirective) { - Ctx.SetSection(Name, this); -} - - void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const { if (isDirective()) { @@ -118,16 +111,9 @@ void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI, MCSectionCOFF *MCSectionCOFF:: Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { - return new (Ctx) MCSectionCOFF(Name, IsDirective, K, Ctx); + return new (Ctx) MCSectionCOFF(Name, IsDirective, K); } -MCSectionCOFF::MCSectionCOFF(const StringRef &name, bool isDirective, - SectionKind K, MCContext &Ctx) - : MCSection(K), Name(name), IsDirective(isDirective) { - Ctx.SetSection(Name, this); -} - - void MCSectionCOFF::PrintSwitchToSection(const TargetAsmInfo &TAI, raw_ostream &OS) const { diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index e7680c8..00f4ffe 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -280,12 +280,25 @@ TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { //===----------------------------------------------------------------------===// // ELF //===----------------------------------------------------------------------===// +typedef StringMap ELFUniqueMapTy; + +TargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { + // If we have the section uniquing map, free it. + delete (ELFUniqueMapTy*)UniquingMap; +} const MCSection *TargetLoweringObjectFileELF:: getELFSection(const char *Name, bool isDirective, SectionKind Kind) const { - if (MCSection *S = getContext().GetSection(Name)) - return S; - return MCSectionELF::Create(Name, isDirective, Kind, getContext()); + // Create the map if it doesn't already exist. + if (UniquingMap == 0) + UniquingMap = new ELFUniqueMapTy(); + ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; + + // Do the lookup, if we have a hit, return it. + const MCSectionELF *&Entry = Map[Name]; + if (Entry) return Entry; + + return Entry = MCSectionELF::Create(Name, isDirective, Kind, getContext()); } void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, @@ -805,12 +818,25 @@ shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { // COFF //===----------------------------------------------------------------------===// +typedef StringMap COFFUniqueMapTy; + +TargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { + delete (COFFUniqueMapTy*)UniquingMap; +} + const MCSection *TargetLoweringObjectFileCOFF:: getCOFFSection(const char *Name, bool isDirective, SectionKind Kind) const { - if (MCSection *S = getContext().GetSection(Name)) - return S; - return MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); + // Create the map if it doesn't already exist. + if (UniquingMap == 0) + UniquingMap = new MachOUniqueMapTy(); + COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; + + // Do the lookup, if we have a hit, return it. + const MCSectionCOFF *&Entry = Map[Name]; + if (Entry) return Entry; + + return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); } void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, -- cgit v1.1