implement support for uniquing MachO sections.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78866 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp
index 321af98..904f01a 100644
--- a/lib/Target/TargetLoweringObjectFile.cpp
+++ b/lib/Target/TargetLoweringObjectFile.cpp
@@ -24,6 +24,7 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Support/Mangler.h"
+#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringExtras.h"
 using namespace llvm;
 
@@ -128,7 +129,6 @@
   const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
   if (GVar == 0)
     return SectionKind::getText();
-
   
   // Handle thread-local data first.
   if (GVar->isThreadLocal()) {
@@ -509,17 +509,40 @@
 //                                 MachO
 //===----------------------------------------------------------------------===//
 
+typedef StringMap<const MCSectionMachO*> MachOUniqueMapTy;
 
-const MCSection *TargetLoweringObjectFileMachO::
+TargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() {
+  // If we have the MachO uniquing map, free it.
+  delete (MachOUniqueMapTy*)UniquingMap;
+}
+
+
+const MCSectionMachO *TargetLoweringObjectFileMachO::
 getMachOSection(const StringRef &Segment, const StringRef &Section,
                 unsigned TypeAndAttributes,
                 unsigned Reserved2, SectionKind Kind) const {
-  // FIXME: UNIQUE HERE.
-  //if (MCSection *S = getContext().GetSection(Name))
-  //  return S;
+  // We unique sections by their segment/section pair.  The returned section
+  // may not have the same flags as the requested section, if so this should be
+  // diagnosed by the client as an error.
   
-  return MCSectionMachO::Create(Segment, Section, TypeAndAttributes, Reserved2,
-                                Kind, getContext());
+  // Create the map if it doesn't already exist.
+  if (UniquingMap == 0)
+    UniquingMap = new MachOUniqueMapTy();
+  MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap;
+  
+  // Form the name to look up.
+  SmallString<64> Name;
+  Name.append(Segment.begin(), Segment.end());
+  Name.push_back(',');
+  Name.append(Section.begin(), Section.end());
+  
+  // Do the lookup, if we have a hit, return it.
+  const MCSectionMachO *&Entry = Map[StringRef(Name.data(), Name.size())];
+  if (Entry) return Entry;
+
+  // Otherwise, return a new section.
+  return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes,
+                                        Reserved2, Kind, getContext());
 }