summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCContext.h10
-rw-r--r--include/llvm/MC/MCSection.h10
-rw-r--r--include/llvm/Target/TargetLoweringObjectFile.h10
-rw-r--r--lib/MC/MCContext.cpp5
-rw-r--r--lib/MC/MCSection.cpp18
-rw-r--r--lib/Target/TargetLoweringObjectFile.cpp38
6 files changed, 49 insertions, 42 deletions
diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h
index adf380472a..082b515a2e 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 aa40386bfd..b33e8c9b42 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 7f74c6b055..102928b659 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 63338353a1..061d7c2498 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<MCSection*>::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 f6ac5cc5cb..8b7fcd2815 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 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,