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 @@
   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 @@
     /// 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 @@
     /// 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 @@
 
 class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
   bool HasCrazyBSS;
+  mutable void *UniquingMap;
 protected:
   /// TLSDataSection - Section directive for Thread Local data.
   ///
@@ -208,7 +209,10 @@
 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 @@
 
 
 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 @@
   // 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 f6ac5cc..8b7fcd2 100644
--- a/lib/MC/MCSection.cpp
+++ b/lib/MC/MCSection.cpp
@@ -27,16 +27,9 @@
 
 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 @@
 
 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 @@
 //===----------------------------------------------------------------------===//
 //                                  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 @@
 //                                  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,
