diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-13 00:37:15 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-13 00:37:15 +0000 |
commit | 38cff389af1d78bd80df0479ef258493e0c5897e (patch) | |
tree | 7bbbecb058efb77eaf4ab59aac1f6c8a8e168e72 /lib/Target/TargetLoweringObjectFile.cpp | |
parent | f991ecf7231436437f6de1a22e93d0a1b380e078 (diff) |
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
Diffstat (limited to 'lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index e7680c8a87..00f4ffe560 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -280,12 +280,25 @@ TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { //===----------------------------------------------------------------------===// // ELF //===----------------------------------------------------------------------===// +typedef StringMap<const MCSectionELF*> 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<const MCSectionCOFF*> 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, |