diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp
index b2ee955..61bf5b0 100644
--- a/lib/Target/TargetLoweringObjectFile.cpp
+++ b/lib/Target/TargetLoweringObjectFile.cpp
@@ -61,23 +61,23 @@
 
 static bool isSuitableForBSS(const GlobalVariable *GV) {
   Constant *C = GV->getInitializer();
-  
+
   // Must have zero initializer.
   if (!C->isNullValue())
     return false;
-  
+
   // Leave constant zeros in readonly constant sections, so they can be shared.
   if (GV->isConstant())
     return false;
-  
+
   // If the global has an explicit section specified, don't put it in BSS.
   if (!GV->getSection().empty())
     return false;
-  
+
   // If -nozero-initialized-in-bss is specified, don't ever use BSS.
   if (NoZerosInBSS)
     return false;
-  
+
   // Otherwise, put it in BSS!
   return true;
 }
@@ -87,7 +87,7 @@
 /// nul value and contains no other nuls in it.
 static bool IsNullTerminatedString(const Constant *C) {
   const ArrayType *ATy = cast<ArrayType>(C->getType());
-  
+
   // First check: is we have constant array of i8 terminated with zero
   if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) {
     if (ATy->getNumElements() == 0) return false;
@@ -96,7 +96,7 @@
       dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1));
     if (Null == 0 || Null->getZExtValue() != 0)
       return false; // Not null terminated.
-    
+
     // Verify that the null doesn't occur anywhere else in the string.
     for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i)
       // Reject constantexpr elements etc.
@@ -122,14 +122,14 @@
                                                        const TargetMachine &TM){
   assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
          "Can only be used for global definitions");
-  
+
   Reloc::Model ReloModel = TM.getRelocationModel();
-  
+
   // Early exit - functions should be always in text sections.
   const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
   if (GVar == 0)
     return SectionKind::getText();
-  
+
   // Handle thread-local data first.
   if (GVar->isThreadLocal()) {
     if (isSuitableForBSS(GVar))
@@ -142,7 +142,7 @@
     return SectionKind::getBSS();
 
   Constant *C = GVar->getInitializer();
-  
+
   // If the global is marked constant, we can put it into a mergable section,
   // a mergable string section, or general .data if it contains relocations.
   if (GVar->isConstant()) {
@@ -155,7 +155,7 @@
       // If initializer is a null-terminated string, put it in a "cstring"
       // section of the right width.
       if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
-        if (const IntegerType *ITy = 
+        if (const IntegerType *ITy =
               dyn_cast<IntegerType>(ATy->getElementType())) {
           if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 ||
                ITy->getBitWidth() == 32) &&
@@ -164,13 +164,13 @@
               return SectionKind::getMergeable1ByteCString();
             if (ITy->getBitWidth() == 16)
               return SectionKind::getMergeable2ByteCString();
-                                         
+
             assert(ITy->getBitWidth() == 32 && "Unknown width");
             return SectionKind::getMergeable4ByteCString();
           }
         }
       }
-        
+
       // Otherwise, just drop it into a mergable constant section.  If we have
       // a section for this size, use it, otherwise use the arbitrary sized
       // mergable section.
@@ -180,7 +180,7 @@
       case 16: return SectionKind::getMergeableConst16();
       default: return SectionKind::getMergeableConst();
       }
-      
+
     case Constant::LocalRelocation:
       // In static relocation model, the linker will resolve all addresses, so
       // the relocation entries will actually be constants by the time the app
@@ -189,11 +189,11 @@
       // merge entries in the section.
       if (ReloModel == Reloc::Static)
         return SectionKind::getReadOnly();
-              
+
       // Otherwise, the dynamic linker needs to fix it up, put it in the
       // writable data.rel.local section.
       return SectionKind::getReadOnlyWithRelLocal();
-              
+
     case Constant::GlobalRelocations:
       // In static relocation model, the linker will resolve all addresses, so
       // the relocation entries will actually be constants by the time the app
@@ -202,7 +202,7 @@
       // merge entries in the section.
       if (ReloModel == Reloc::Static)
         return SectionKind::getReadOnly();
-      
+
       // Otherwise, the dynamic linker needs to fix it up, put it in the
       // writable data.rel section.
       return SectionKind::getReadOnlyWithRel();
@@ -237,8 +237,8 @@
   // Select section name.
   if (GV->hasSection())
     return getExplicitSectionGlobal(GV, Kind, Mang, TM);
-  
-  
+
+
   // Use default section depending on the 'type' of global
   return SelectSectionForGlobal(GV, Kind, Mang, TM);
 }
@@ -251,13 +251,13 @@
                                                  Mangler *Mang,
                                                  const TargetMachine &TM) const{
   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
-  
+
   if (Kind.isText())
     return getTextSection();
-  
+
   if (Kind.isBSS() && BSSSection != 0)
     return BSSSection;
-  
+
   if (Kind.isReadOnly() && ReadOnlySection != 0)
     return ReadOnlySection;
 
@@ -271,7 +271,7 @@
 TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
   if (Kind.isReadOnly() && ReadOnlySection != 0)
     return ReadOnlySection;
-  
+
   return DataSection;
 }
 
@@ -293,11 +293,11 @@
   if (UniquingMap == 0)
     UniquingMap = new ELFUniqueMapTy();
   ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap;
-  
+
   // Do the lookup, if we have a hit, return it.
   const MCSectionELF *&Entry = Map[Section];
   if (Entry) return Entry;
-  
+
   return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit,
                                       getContext());
 }
@@ -308,73 +308,73 @@
     ((ELFUniqueMapTy*)UniquingMap)->clear();
   TargetLoweringObjectFile::Initialize(Ctx, TM);
 
-  BSSSection = 
+  BSSSection =
     getELFSection(".bss", MCSectionELF::SHT_NOBITS,
                   MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
                   SectionKind::getBSS());
-    
-  TextSection = 
+
+  TextSection =
     getELFSection(".text", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC,
                   SectionKind::getText());
 
-  DataSection = 
+  DataSection =
     getELFSection(".data", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
                   SectionKind::getDataRel());
 
-  ReadOnlySection = 
-    getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 
-                  MCSectionELF::SHF_ALLOC, 
+  ReadOnlySection =
+    getELFSection(".rodata", MCSectionELF::SHT_PROGBITS,
+                  MCSectionELF::SHF_ALLOC,
                   SectionKind::getReadOnly());
 
-  TLSDataSection = 
+  TLSDataSection =
     getELFSection(".tdata", MCSectionELF::SHT_PROGBITS,
-                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 
+                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
                   MCSectionELF::SHF_WRITE, SectionKind::getThreadData());
-  
-  TLSBSSSection = 
+
+  TLSBSSSection =
     getELFSection(".tbss", MCSectionELF::SHT_NOBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
                   MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS());
 
-  DataRelSection = 
+  DataRelSection =
     getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getDataRel());
 
-  DataRelLocalSection = 
+  DataRelLocalSection =
     getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getDataRelLocal());
 
-  DataRelROSection = 
+  DataRelROSection =
     getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getReadOnlyWithRel());
 
-  DataRelROLocalSection = 
+  DataRelROLocalSection =
     getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getReadOnlyWithRelLocal());
-    
-  MergeableConst4Section = 
+
+  MergeableConst4Section =
     getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
                   SectionKind::getMergeableConst4());
 
-  MergeableConst8Section = 
+  MergeableConst8Section =
     getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
                   SectionKind::getMergeableConst8());
 
-  MergeableConst16Section = 
+  MergeableConst16Section =
     getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
                   SectionKind::getMergeableConst16());
 
   StaticCtorSection =
-    getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 
+    getELFSection(".ctors", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getDataRel());
 
@@ -382,9 +382,9 @@
     getELFSection(".dtors", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getDataRel());
-  
+
   // Exception Handling Sections.
-  
+
   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
   // it contains relocatable pointers.  In PIC mode, this is probably a big
   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
@@ -393,70 +393,70 @@
     getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly());
   EHFrameSection =
-    getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 
+    getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS,
                   MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
                   SectionKind::getDataRel());
-  
+
   // Debug Info Sections.
-  DwarfAbbrevSection = 
-    getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfAbbrevSection =
+    getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfInfoSection = 
-    getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfInfoSection =
+    getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfLineSection = 
-    getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfLineSection =
+    getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfFrameSection = 
-    getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfFrameSection =
+    getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfPubNamesSection = 
-    getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfPubNamesSection =
+    getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfPubTypesSection = 
-    getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfPubTypesSection =
+    getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfStrSection = 
+  DwarfStrSection =
     getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfLocSection = 
-    getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfLocSection =
+    getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfARangesSection = 
-    getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfARangesSection =
+    getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfRangesSection = 
-    getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfRangesSection =
+    getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
-  DwarfMacroInfoSection = 
-    getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 
+  DwarfMacroInfoSection =
+    getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0,
                   SectionKind::getMetadata());
 }
 
 
-static SectionKind 
+static SectionKind
 getELFKindForNamedSection(const char *Name, SectionKind K) {
   if (Name[0] != '.') return K;
-  
+
   // Some lame default implementation based on some magic section names.
   if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
       strncmp(Name, ".llvm.linkonce.b.", 17) == 0 ||
       strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 ||
       strncmp(Name, ".llvm.linkonce.sb.", 18) == 0)
     return SectionKind::getBSS();
-  
+
   if (strcmp(Name, ".tdata") == 0 ||
       strncmp(Name, ".tdata.", 7) == 0 ||
       strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
       strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
     return SectionKind::getThreadData();
-  
+
   if (strcmp(Name, ".tbss") == 0 ||
       strncmp(Name, ".tbss.", 6) == 0 ||
       strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
       strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
     return SectionKind::getThreadBSS();
-  
+
   return K;
 }
 
@@ -486,16 +486,16 @@
 
   if (!K.isMetadata())
     Flags |= MCSectionELF::SHF_ALLOC;
-  
+
   if (K.isText())
     Flags |= MCSectionELF::SHF_EXECINSTR;
-  
+
   if (K.isWriteable())
     Flags |= MCSectionELF::SHF_WRITE;
-  
+
   if (K.isThreadLocal())
     Flags |= MCSectionELF::SHF_TLS;
-  
+
   // K.isMergeableConst() is left out to honour PR4650
   if (K.isMergeableCString() || K.isMergeableConst4() ||
       K.isMergeableConst8() || K.isMergeableConst16())
@@ -509,31 +509,31 @@
 
 
 const MCSection *TargetLoweringObjectFileELF::
-getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 
+getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const {
   const char *SectionName = GV->getSection().c_str();
 
   // Infer section flags from the section name if we can.
   Kind = getELFKindForNamedSection(SectionName, Kind);
-  
-  return getELFSection(SectionName, 
-                       getELFSectionType(SectionName, Kind), 
+
+  return getELFSection(SectionName,
+                       getELFSectionType(SectionName, Kind),
                        getELFSectionFlags(Kind), Kind, true);
 }
 
 static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
   if (Kind.isText())                 return ".gnu.linkonce.t.";
   if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
-  
+
   if (Kind.isThreadData())           return ".gnu.linkonce.td.";
   if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
-  
+
   if (Kind.isBSS())                  return ".gnu.linkonce.b.";
   if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
   if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
   if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
   if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
-  
+
   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
   return ".gnu.linkonce.d.rel.ro.";
 }
@@ -541,31 +541,31 @@
 const MCSection *TargetLoweringObjectFileELF::
 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                        Mangler *Mang, const TargetMachine &TM) const {
-  
+
   // If this global is linkonce/weak and the target handles this by emitting it
   // into a 'uniqued' section name, create and return the section now.
   if (GV->isWeakForLinker()) {
     const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
     std::string Name = Mang->makeNameProper(GV->getNameStr());
 
-    return getELFSection((Prefix+Name).c_str(), 
-                         getELFSectionType((Prefix+Name).c_str(), Kind), 
-                         getELFSectionFlags(Kind), 
+    return getELFSection((Prefix+Name).c_str(),
+                         getELFSectionType((Prefix+Name).c_str(), Kind),
+                         getELFSectionFlags(Kind),
                          Kind);
   }
-  
+
   if (Kind.isText()) return TextSection;
-  
+
   if (Kind.isMergeable1ByteCString() ||
       Kind.isMergeable2ByteCString() ||
       Kind.isMergeable4ByteCString()) {
-    
+
     // We also need alignment here.
     // FIXME: this is getting the alignment of the character, not the
     // alignment of the global!
-    unsigned Align = 
+    unsigned Align =
       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
-    
+
     const char *SizeSpec = ".rodata.str1.";
     if (Kind.isMergeable2ByteCString())
       SizeSpec = ".rodata.str2.";
@@ -573,16 +573,16 @@
       SizeSpec = ".rodata.str4.";
     else
       assert(Kind.isMergeable1ByteCString() && "unknown string width");
-    
-    
+
+
     std::string Name = SizeSpec + utostr(Align);
-    return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS, 
-                         MCSectionELF::SHF_ALLOC | 
-                         MCSectionELF::SHF_MERGE | 
-                         MCSectionELF::SHF_STRINGS, 
+    return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS,
+                         MCSectionELF::SHF_ALLOC |
+                         MCSectionELF::SHF_MERGE |
+                         MCSectionELF::SHF_STRINGS,
                          Kind);
   }
-  
+
   if (Kind.isMergeableConst()) {
     if (Kind.isMergeableConst4() && MergeableConst4Section)
       return MergeableConst4Section;
@@ -592,19 +592,19 @@
       return MergeableConst16Section;
     return ReadOnlySection;  // .const
   }
-  
+
   if (Kind.isReadOnly())             return ReadOnlySection;
-  
+
   if (Kind.isThreadData())           return TLSDataSection;
   if (Kind.isThreadBSS())            return TLSBSSSection;
-  
+
   if (Kind.isBSS())                  return BSSSection;
-  
+
   if (Kind.isDataNoRel())            return DataSection;
   if (Kind.isDataRelLocal())         return DataRelLocalSection;
   if (Kind.isDataRel())              return DataRelSection;
   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
-  
+
   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
   return DataRelROSection;
 }
@@ -622,7 +622,7 @@
     return MergeableConst16Section;
   if (Kind.isReadOnly())
     return ReadOnlySection;
-  
+
   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
   return DataRelROSection;
@@ -647,18 +647,18 @@
   // 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.
-  
+
   // 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 += Segment;
   Name.push_back(',');
   Name += Section;
-  
+
   // Do the lookup, if we have a hit, return it.
   const MCSectionMachO *&Entry = Map[Name.str()];
   if (Entry) return Entry;
@@ -674,14 +674,14 @@
   if (UniquingMap != 0)
     ((MachOUniqueMapTy*)UniquingMap)->clear();
   TargetLoweringObjectFile::Initialize(Ctx, TM);
-  
+
   TextSection // .text
     = getMachOSection("__TEXT", "__text",
                       MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
                       SectionKind::getText());
   DataSection // .data
     = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel());
-  
+
   CStringSection // .cstring
     = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS,
                       SectionKind::getMergeable1ByteCString());
@@ -694,7 +694,7 @@
   EightByteConstantSection // .literal8
     = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS,
                       SectionKind::getMergeableConst8());
-  
+
   // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
   // to using it in -static mode.
   SixteenByteConstantSection = 0;
@@ -703,10 +703,10 @@
     SixteenByteConstantSection =   // .literal16
       getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS,
                       SectionKind::getMergeableConst16());
-  
+
   ReadOnlySection  // .const
     = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly());
-  
+
   TextCoalSection
     = getMachOSection("__TEXT", "__textcoal_nt",
                       MCSectionMachO::S_COALESCED |
@@ -725,7 +725,7 @@
     = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
                       SectionKind::getDataRel());
 
-  
+
   LazySymbolPointerSection
     = getMachOSection("__DATA", "__la_symbol_ptr",
                       MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
@@ -734,7 +734,7 @@
     = getMachOSection("__DATA", "__nl_symbol_ptr",
                       MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
                       SectionKind::getMetadata());
-  
+
   if (TM.getRelocationModel() == Reloc::Static) {
     StaticCtorSection
       = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
@@ -746,11 +746,11 @@
                         MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
                         SectionKind::getDataRel());
     StaticDtorSection
-      = getMachOSection("__DATA", "__mod_term_func", 
+      = getMachOSection("__DATA", "__mod_term_func",
                         MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
                         SectionKind::getDataRel());
   }
-  
+
   // Exception Handling.
   LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0,
                                 SectionKind::getDataRel());
@@ -763,46 +763,46 @@
                     SectionKind::getReadOnly());
 
   // Debug Information.
-  DwarfAbbrevSection = 
+  DwarfAbbrevSection =
     getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfInfoSection =  
+  DwarfInfoSection =
     getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfLineSection =  
+  DwarfLineSection =
     getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfFrameSection =  
+  DwarfFrameSection =
     getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfPubNamesSection =  
+  DwarfPubNamesSection =
     getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfPubTypesSection =  
+  DwarfPubTypesSection =
     getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfStrSection =  
+  DwarfStrSection =
     getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfLocSection =  
+  DwarfLocSection =
     getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfARangesSection =  
+  DwarfARangesSection =
     getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfRangesSection =  
+  DwarfRangesSection =
     getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfMacroInfoSection =  
+  DwarfMacroInfoSection =
     getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
-  DwarfDebugInlineSection = 
+  DwarfDebugInlineSection =
     getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
 }
 
 const MCSection *TargetLoweringObjectFileMachO::
-getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 
+getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const {
   // Parse the section specifier and create it if valid.
   StringRef Segment, Section;
@@ -818,11 +818,11 @@
     // Fall back to dropping it into the data section.
     return DataSection;
   }
-  
+
   // Get the section.
   const MCSectionMachO *S =
     getMachOSection(Segment, Section, TAA, StubSize, Kind);
-  
+
   // Okay, now that we got the section, verify that the TAA & StubSize agree.
   // If the user declared multiple globals with different section flags, we need
   // to reject it here.
@@ -832,7 +832,7 @@
                       "' section type or attributes does not match previous"
                       " section specifier");
   }
-  
+
   return S;
 }
 
@@ -840,10 +840,10 @@
 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                        Mangler *Mang, const TargetMachine &TM) const {
   assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
-  
+
   if (Kind.isText())
     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
-  
+
   // If this is weak/linkonce, put this in a coalescable section, either in text
   // or data depending on if it is writable.
   if (GV->isWeakForLinker()) {
@@ -851,7 +851,7 @@
       return ConstTextCoalSection;
     return DataCoalSection;
   }
-  
+
   // FIXME: Alignment check should be handled by section classifier.
   if (Kind.isMergeable1ByteCString() ||
       Kind.isMergeable2ByteCString()) {
@@ -863,7 +863,7 @@
       return UStringSection;
     }
   }
-  
+
   if (Kind.isMergeableConst()) {
     if (Kind.isMergeableConst4())
       return FourByteConstantSection;
@@ -882,7 +882,7 @@
   // linker needs to write to it, put it in the data segment.
   if (Kind.isReadOnlyWithRel())
     return ConstDataSection;
-  
+
   // Otherwise, just drop the variable in the normal data section.
   return DataSection;
 }
@@ -893,7 +893,7 @@
   // segment, not in the text segment.
   if (Kind.isDataRel())
     return ConstDataSection;
-  
+
   if (Kind.isMergeableConst4())
     return FourByteConstantSection;
   if (Kind.isMergeableConst8())
@@ -911,7 +911,7 @@
   /// On Darwin, internally linked data beginning with "L" or "l" does not have
   /// the directive emitted (this occurs in ObjC metadata).
   if (!GV) return false;
-    
+
   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
     // FIXME: ObjC metadata is currently emitted as internal symbols that have
@@ -921,7 +921,7 @@
     if (Name[0] == 'L' || Name[0] == 'l')
       return false;
   }
-  
+
   return true;
 }
 
@@ -943,11 +943,11 @@
   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());
 }
 
@@ -962,7 +962,7 @@
     getCOFFSection(".ctors", false, SectionKind::getDataRel());
   StaticDtorSection =
     getCOFFSection(".dtors", false, SectionKind::getDataRel());
-  
+
   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
   // though it contains relocatable pointers.  In PIC mode, this is probably a
   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
@@ -971,19 +971,19 @@
     getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly());
   EHFrameSection =
     getCOFFSection(".eh_frame", false, SectionKind::getDataRel());
-  
+
   // Debug info.
   // FIXME: Don't use 'directive' mode here.
-  DwarfAbbrevSection =  
+  DwarfAbbrevSection =
     getCOFFSection("\t.section\t.debug_abbrev,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfInfoSection =    
+  DwarfInfoSection =
     getCOFFSection("\t.section\t.debug_info,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfLineSection =    
+  DwarfLineSection =
     getCOFFSection("\t.section\t.debug_line,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfFrameSection =   
+  DwarfFrameSection =
     getCOFFSection("\t.section\t.debug_frame,\"dr\"",
                    true, SectionKind::getMetadata());
   DwarfPubNamesSection =
@@ -992,25 +992,25 @@
   DwarfPubTypesSection =
     getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfStrSection =     
+  DwarfStrSection =
     getCOFFSection("\t.section\t.debug_str,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfLocSection =     
+  DwarfLocSection =
     getCOFFSection("\t.section\t.debug_loc,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfARangesSection = 
+  DwarfARangesSection =
     getCOFFSection("\t.section\t.debug_aranges,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfRangesSection =  
+  DwarfRangesSection =
     getCOFFSection("\t.section\t.debug_ranges,\"dr\"",
                    true, SectionKind::getMetadata());
-  DwarfMacroInfoSection = 
+  DwarfMacroInfoSection =
     getCOFFSection("\t.section\t.debug_macinfo,\"dr\"",
                    true, SectionKind::getMetadata());
 }
 
 const MCSection *TargetLoweringObjectFileCOFF::
-getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 
+getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const {
   return getCOFFSection(GV->getSection().c_str(), false, Kind);
 }
@@ -1028,7 +1028,7 @@
 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                        Mangler *Mang, const TargetMachine &TM) const {
   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
-  
+
   // If this global is linkonce/weak and the target handles this by emitting it
   // into a 'uniqued' section name, create and return the section now.
   if (GV->isWeakForLinker()) {
@@ -1036,10 +1036,9 @@
     std::string Name = Mang->makeNameProper(GV->getNameStr());
     return getCOFFSection((Prefix+Name).c_str(), false, Kind);
   }
-  
+
   if (Kind.isText())
     return getTextSection();
-  
+
   return getDataSection();
 }
-
