diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 0aed948..7dcca7b 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -222,7 +222,9 @@
   OS << ".zerofill ";
   
   // This is a mach-o specific directive.
-  OS << '"' << ((MCSectionMachO*)Section)->getName() << '"';
+  const MCSectionMachO *MOSection = ((const MCSectionMachO*)Section);
+  OS << '"' << MOSection->getSegmentName() << ","
+     << MOSection->getSectionName() << '"';
   
   
   if (Symbol != NULL) {
diff --git a/lib/MC/MCSection.cpp b/lib/MC/MCSection.cpp
index 65e86d3..291e40d 100644
--- a/lib/MC/MCSection.cpp
+++ b/lib/MC/MCSection.cpp
@@ -115,25 +115,272 @@
 // MCSectionMachO
 //===----------------------------------------------------------------------===//
 
-MCSectionMachO *MCSectionMachO::
-Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
-  return new (Ctx) MCSectionMachO(Name, IsDirective, K, Ctx);
-}
+/// SectionTypeDescriptors - These are strings that describe the various section
+/// types.  This *must* be kept in order with and stay synchronized with the
+/// section type list.
+static const struct {
+  const char *AssemblerName, *EnumName;
+} SectionTypeDescriptors[MCSectionMachO::LAST_KNOWN_SECTION_TYPE+1] = {
+  { "regular",                  "S_REGULAR" },                    // 0x00
+  { 0,                          "S_ZEROFILL" },                   // 0x01
+  { "cstring_literals",         "S_CSTRING_LITERALS" },           // 0x02
+  { "4byte_literals",           "S_4BYTE_LITERALS" },             // 0x03
+  { "8byte_literals",           "S_8BYTE_LITERALS" },             // 0x04
+  { "literal_pointers",         "S_LITERAL_POINTERS" },           // 0x05
+  { "non_lazy_symbol_pointers", "S_NON_LAZY_SYMBOL_POINTERS" },   // 0x06
+  { "lazy_symbol_pointers",     "S_LAZY_SYMBOL_POINTERS" },       // 0x07
+  { "symbol_stubs",             "S_SYMBOL_STUBS" },               // 0x08
+  { "mod_init_funcs",           "S_MOD_INIT_FUNC_POINTERS" },     // 0x09
+  { "mod_term_funcs",           "S_MOD_TERM_FUNC_POINTERS" },     // 0x0A
+  { "coalesced",                "S_COALESCED" },                  // 0x0B
+  { 0, /*FIXME??*/              "S_GB_ZEROFILL" },                // 0x0C
+  { "interposing",              "S_INTERPOSING" },                // 0x0D
+  { "16byte_literals",          "S_16BYTE_LITERALS" },            // 0x0E
+  { 0, /*FIXME??*/              "S_DTRACE_DOF" },                 // 0x0F
+  { 0, /*FIXME??*/              "S_LAZY_DYLIB_SYMBOL_POINTERS" }  // 0x10
+};
 
-MCSectionMachO::MCSectionMachO(const StringRef &name, bool isDirective,
-                               SectionKind K, MCContext &Ctx)
-  : MCSection(K), Name(name), IsDirective(isDirective) {
-  Ctx.SetSection(Name, this);
+
+/// SectionAttrDescriptors - This is an array of descriptors for section
+/// attributes.  Unlike the SectionTypeDescriptors, this is not directly indexed
+/// by attribute, instead it is searched.  The last entry has a zero AttrFlag
+/// value.
+static const struct {
+  unsigned AttrFlag;
+  const char *AssemblerName, *EnumName;
+} SectionAttrDescriptors[] = {
+#define ENTRY(ASMNAME, ENUM) \
+  { MCSectionMachO::ENUM, ASMNAME, #ENUM },
+ENTRY("pure_instructions",   S_ATTR_PURE_INSTRUCTIONS)
+ENTRY("no_toc",              S_ATTR_NO_TOC)
+ENTRY("strip_static_syms",   S_ATTR_STRIP_STATIC_SYMS)
+ENTRY("no_dead_strip",       S_ATTR_NO_DEAD_STRIP)
+ENTRY("live_support",        S_ATTR_LIVE_SUPPORT)
+ENTRY("self_modifying_code", S_ATTR_SELF_MODIFYING_CODE)
+ENTRY("debug",               S_ATTR_DEBUG)
+ENTRY(0 /*FIXME*/,           S_ATTR_SOME_INSTRUCTIONS)
+ENTRY(0 /*FIXME*/,           S_ATTR_EXT_RELOC)
+ENTRY(0 /*FIXME*/,           S_ATTR_LOC_RELOC)
+#undef ENTRY
+  { 0, "none", 0 }
+};
+
+
+MCSectionMachO *MCSectionMachO::
+Create(const StringRef &Segment, const StringRef &Section,
+       unsigned TypeAndAttributes, unsigned Reserved2,
+       SectionKind K, MCContext &Ctx) {
+  // S_SYMBOL_STUBS must be set for Reserved2 to be non-zero.
+  return new (Ctx) MCSectionMachO(Segment, Section, TypeAndAttributes,
+                                  Reserved2, K);
 }
 
 void MCSectionMachO::PrintSwitchToSection(const TargetAsmInfo &TAI,
                                           raw_ostream &OS) const {
-  if (!isDirective())
-    OS << "\t.section\t" << getName() << '\n';
+  OS << "\t.section\t" << getSegmentName() << ',' << getSectionName();
+  
+  // Get the section type and attributes.
+  unsigned TAA = getTypeAndAttributes();
+  if (TAA == 0) {
+    OS << '\n';
+    return;
+  }
+
+  OS << ',';
+  
+  unsigned SectionType = TAA & MCSectionMachO::SECTION_TYPE;
+  assert(SectionType <= MCSectionMachO::LAST_KNOWN_SECTION_TYPE &&
+         "Invalid SectionType specified!");
+
+  if (SectionTypeDescriptors[SectionType].AssemblerName)
+    OS << SectionTypeDescriptors[SectionType].AssemblerName;
   else
-    OS << getName() << '\n';
+    OS << "<<" << SectionTypeDescriptors[SectionType].EnumName << ">>";
+  
+  // If we don't have any attributes, we're done.
+  unsigned SectionAttrs = TAA & MCSectionMachO::SECTION_ATTRIBUTES;
+  if (SectionAttrs == 0) {
+    // If we have a S_SYMBOL_STUBS size specified, print it along with 'none' as
+    // the attribute specifier.
+    if (Reserved2 != 0)
+      OS << ",none," << Reserved2;
+    OS << '\n';
+    return;
+  }
+
+  // Check each attribute to see if we have it.
+  char Separator = ',';
+  for (unsigned i = 0; SectionAttrDescriptors[i].AttrFlag; ++i) {
+    // Check to see if we have this attribute.
+    if ((SectionAttrDescriptors[i].AttrFlag & SectionAttrs) == 0)
+      continue;
+    
+    // Yep, clear it and print it.
+    SectionAttrs &= ~SectionAttrDescriptors[i].AttrFlag;
+    
+    OS << Separator;
+    if (SectionAttrDescriptors[i].AssemblerName)
+      OS << SectionAttrDescriptors[i].AssemblerName;
+    else
+      OS << "<<" << SectionAttrDescriptors[i].EnumName << ">>";
+    Separator = '+';
+  }
+  
+  assert(SectionAttrs == 0 && "Unknown section attributes!");
+  
+  // If we have a S_SYMBOL_STUBS size specified, print it.
+  if (Reserved2 != 0)
+    OS << ',' << Reserved2;
+  OS << '\n';
 }
 
+/// StripSpaces - This removes leading and trailing spaces from the StringRef.
+static void StripSpaces(StringRef &Str) {
+  while (!Str.empty() && isspace(Str[0]))
+    Str = Str.substr(1);
+  while (!Str.empty() && isspace(Str.back()))
+    Str = Str.substr(0, Str.size()-1);
+}
+
+/// ParseSectionSpecifier - Parse the section specifier indicated by "Spec".
+/// This is a string that can appear after a .section directive in a mach-o
+/// flavored .s file.  If successful, this fills in the specified Out
+/// parameters and returns an empty string.  When an invalid section
+/// specifier is present, this returns a string indicating the problem.
+std::string MCSectionMachO::ParseSectionSpecifier(StringRef Spec,        // In.
+                                                  StringRef &Segment,    // Out.
+                                                  StringRef &Section,    // Out.
+                                                  unsigned  &TAA,        // Out.
+                                                  unsigned  &StubSize) { // Out.
+  // Find the first comma.
+  std::pair<StringRef, StringRef> Comma = Spec.split(',');
+  
+  // If there is no comma, we fail.
+  if (Comma.second.empty())
+    return "mach-o section specifier requires a segment and section "
+           "separated by a comma";
+  
+  // Capture segment, remove leading and trailing whitespace.
+  Segment = Comma.first;
+  StripSpaces(Segment);
+
+  // Verify that the segment is present and not too long.
+  if (Segment.empty() || Segment.size() > 16)
+    return "mach-o section specifier requires a segment whose length is "
+           "between 1 and 16 characters";
+  
+  // Split the section name off from any attributes if present.
+  Comma = Comma.second.split(',');
+
+  // Capture section, remove leading and trailing whitespace.
+  Section = Comma.first;
+  StripSpaces(Section);
+  
+  // Verify that the section is present and not too long.
+  if (Section.empty() || Section.size() > 16)
+    return "mach-o section specifier requires a section whose length is "
+           "between 1 and 16 characters";
+
+  // If there is no comma after the section, we're done.
+  TAA = 0;
+  StubSize = 0;
+  if (Comma.second.empty())
+    return "";
+  
+  // Otherwise, we need to parse the section type and attributes.
+  Comma = Comma.second.split(',');
+  
+  // Get the section type.
+  StringRef SectionType = Comma.first;
+  StripSpaces(SectionType);
+  
+  // Figure out which section type it is.
+  unsigned TypeID;
+  for (TypeID = 0; TypeID !=MCSectionMachO::LAST_KNOWN_SECTION_TYPE+1; ++TypeID)
+    if (SectionTypeDescriptors[TypeID].AssemblerName &&
+        SectionType == SectionTypeDescriptors[TypeID].AssemblerName)
+      break;
+  
+  // If we didn't find the section type, reject it.
+  if (TypeID > MCSectionMachO::LAST_KNOWN_SECTION_TYPE)
+    return "mach-o section specifier uses an unknown section type";
+  
+  // Remember the TypeID.
+  TAA = TypeID;
+
+  // If we have no comma after the section type, there are no attributes.
+  if (Comma.second.empty()) {
+    // S_SYMBOL_STUBS always require a symbol stub size specifier.
+    if (TAA == MCSectionMachO::S_SYMBOL_STUBS)
+      return "mach-o section specifier of type 'symbol_stubs' requires a size "
+             "specifier";
+    return "";
+  }
+
+  // Otherwise, we do have some attributes.  Split off the size specifier if
+  // present.
+  Comma = Comma.second.split(',');
+  StringRef Attrs = Comma.first;
+  
+  // The attribute list is a '+' separated list of attributes.
+  std::pair<StringRef, StringRef> Plus = Attrs.split('+');
+  
+  while (1) {
+    StringRef Attr = Plus.first;
+    StripSpaces(Attr);
+
+    // Look up the attribute.
+    for (unsigned i = 0; ; ++i) {
+      if (SectionAttrDescriptors[i].AttrFlag == 0)
+        return "mach-o section specifier has invalid attribute";
+      
+      if (SectionAttrDescriptors[i].AssemblerName &&
+          Attr == SectionAttrDescriptors[i].AssemblerName) {
+        TAA |= SectionAttrDescriptors[i].AttrFlag;
+        break;
+      }
+    }
+    
+    if (Plus.second.empty()) break;
+    Plus = Plus.second.split('+');
+  };
+
+  // Okay, we've parsed the section attributes, see if we have a stub size spec.
+  if (Comma.second.empty()) {
+    // S_SYMBOL_STUBS always require a symbol stub size specifier.
+    if (TAA == MCSectionMachO::S_SYMBOL_STUBS)
+      return "mach-o section specifier of type 'symbol_stubs' requires a size "
+      "specifier";
+    return "";
+  }
+
+  // If we have a stub size spec, we must have a sectiontype of S_SYMBOL_STUBS.
+  if ((TAA & MCSectionMachO::SECTION_TYPE) != MCSectionMachO::S_SYMBOL_STUBS)
+    return "mach-o section specifier cannot have a stub size specified because "
+           "it does not have type 'symbol_stubs'";
+  
+  // Okay, if we do, it must be a number.
+  StringRef StubSizeStr = Comma.second;
+  StripSpaces(StubSizeStr);
+  
+  // Convert the a null terminated buffer for strtoul.
+  char TmpBuffer[32];
+  if (StubSizeStr.size() >= 32)
+    return"mach-o section specifier has a stub size specifier that is too long";
+  
+  memcpy(TmpBuffer, StubSizeStr.data(), StubSizeStr.size());
+  TmpBuffer[StubSizeStr.size()] = 0;
+  
+  char *EndPtr;
+  StubSize = strtoul(TmpBuffer, &EndPtr, 0);
+
+  if (EndPtr[0] != 0)
+    return "mach-o section specifier has a malformed stub size";
+  
+  return "";
+}
+
+
 //===----------------------------------------------------------------------===//
 // MCSectionCOFF
 //===----------------------------------------------------------------------===//
diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
index ca61d55..9f79938 100644
--- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
+++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
@@ -1286,19 +1286,21 @@
     O << '\n';
     
     if (!FnStubs.empty()) {
-      const MCSection *StubSection;
-      if (TM.getRelocationModel() == Reloc::PIC_)
-        StubSection = TLOFMacho.getMachOSection(".section __TEXT,__picsymbolstu"
-                                                "b4,symbol_stubs,none,16", true,
-                                                SectionKind::getText());
-      else
-        StubSection = TLOFMacho.getMachOSection(".section __TEXT,__symbol_stub4"
-                                                ",symbol_stubs,none,12", true,
-                                                SectionKind::getText());
+      unsigned StubSize = 12;
+      const char *StubSectionName = "__symbol_stub4";
+      
+      if (TM.getRelocationModel() == Reloc::PIC_) {
+        StubSize = 16;
+        StubSectionName = "__picsymbolstub4";
+      }
+      
+      const MCSection *StubSection
+        = TLOFMacho.getMachOSection("__TEXT", StubSectionName,
+                                    MCSectionMachO::S_SYMBOL_STUBS,
+                                    StubSize, SectionKind::getText());
 
       const MCSection *LazySymbolPointerSection
-        = TLOFMacho.getMachOSection(".lazy_symbol_pointer", true,
-                                    SectionKind::getMetadata());
+        = TLOFMacho.getLazySymbolPointerSection();
     
       // Output stubs for dynamically-linked functions
       for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(),
@@ -1333,9 +1335,8 @@
     
     // Output non-lazy-pointers for external and common global variables.
     if (!GVNonLazyPtrs.empty()) {
-      SwitchToSection(TLOFMacho.getMachOSection(".non_lazy_symbol_pointer",
-                                                true,
-                                                SectionKind::getMetadata()));
+      // Switch with ".non_lazy_symbol_pointer" directive.
+      SwitchToSection(TLOFMacho.getNonLazySymbolPointerSection());
       for (StringMap<std::string>::iterator I = GVNonLazyPtrs.begin(),
            E = GVNonLazyPtrs.end(); I != E; ++I) {
         O << I->second << ":\n";
diff --git a/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp b/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
index 9884ca3..73c9c03 100644
--- a/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
@@ -846,22 +846,19 @@
 
   // Prime text sections so they are adjacent.  This reduces the likelihood a
   // large data or debug section causes a branch to exceed 16M limit.
-  
   TargetLoweringObjectFileMachO &TLOFMacho = 
     static_cast<TargetLoweringObjectFileMachO &>(getObjFileLowering());
-  SwitchToSection(TLOFMacho.getMachOSection("\t.section __TEXT,__textcoal_nt,"
-                                            "coalesced,pure_instructions", true,
-                                            SectionKind::getText()));
+  SwitchToSection(TLOFMacho.getTextCoalSection());
   if (TM.getRelocationModel() == Reloc::PIC_) {
-    SwitchToSection(TLOFMacho.getMachOSection("\t.section __TEXT,__picsymbolstu"
-                                              "b1,symbol_stubs,"
-                                              "pure_instructions,32", true,
-                                              SectionKind::getText()));
+    SwitchToSection(TLOFMacho.getMachOSection("__TEXT", "__picsymbolstub1",
+                                              MCSectionMachO::S_SYMBOL_STUBS |
+                                       MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
+                                              32, SectionKind::getText()));
   } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) {
-    SwitchToSection(TLOFMacho.getMachOSection("\t.section __TEXT,__symbol_stub1"
-                                              ",symbol_stubs,"
-                                              "pure_instructions,16", true,
-                                              SectionKind::getText()));
+    SwitchToSection(TLOFMacho.getMachOSection("__TEXT","__symbol_stub1",
+                                              MCSectionMachO::S_SYMBOL_STUBS |
+                                       MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
+                                              16, SectionKind::getText()));
   }
   SwitchToSection(getObjFileLowering().getTextSection());
 
@@ -985,17 +982,20 @@
   TargetLoweringObjectFileMachO &TLOFMacho = 
     static_cast<TargetLoweringObjectFileMachO &>(getObjFileLowering());
 
+  
+  const MCSection *LSPSection = 0;
+  if (!FnStubs.empty()) // .lazy_symbol_pointer
+    LSPSection = TLOFMacho.getLazySymbolPointerSection();
+    
+  
   // Output stubs for dynamically-linked functions
   if (TM.getRelocationModel() == Reloc::PIC_ && !FnStubs.empty()) {
     const MCSection *StubSection = 
-      TLOFMacho.getMachOSection("\t.section __TEXT,__picsymbolstub1,"
-                                "symbol_stubs,pure_instructions,32", true,
-                                SectionKind::getText());
-    const MCSection *LSPSection = 
-      TLOFMacho.getMachOSection(".lazy_symbol_pointer", true,
-                                SectionKind::getMetadata());
-    
-    for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(), E = FnStubs.end();
+      TLOFMacho.getMachOSection("__TEXT", "__picsymbolstub1",
+                                MCSectionMachO::S_SYMBOL_STUBS |
+                                MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
+                                32, SectionKind::getText());
+     for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(), E = FnStubs.end();
          I != E; ++I) {
       SwitchToSection(StubSection);
       EmitAlignment(4);
@@ -1020,13 +1020,11 @@
       O << (isPPC64 ? "\t.quad" : "\t.long") << " dyld_stub_binding_helper\n";
     }
   } else if (!FnStubs.empty()) {
-    const MCSection *StubSection = 
-      TLOFMacho.getMachOSection("\t.section __TEXT,__symbol_stub1,symbol_stubs,"
-                                "pure_instructions,16", true,
-                                SectionKind::getText());
-    const MCSection *LSPSection = 
-      TLOFMacho.getMachOSection(".lazy_symbol_pointer", true,
-                                SectionKind::getMetadata());
+    const MCSection *StubSection =
+      TLOFMacho.getMachOSection("__TEXT","__symbol_stub1",
+                                MCSectionMachO::S_SYMBOL_STUBS |
+                                MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
+                                16, SectionKind::getText());
     
     for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(), E = FnStubs.end();
          I != E; ++I) {
@@ -1063,10 +1061,8 @@
 
   // Output macho stubs for external and common global variables.
   if (!GVStubs.empty()) {
-    const MCSection *TheSection = 
-      TLOFMacho.getMachOSection(".non_lazy_symbol_pointer", true,
-                                SectionKind::getMetadata());
-    SwitchToSection(TheSection);
+    // Switch with ".non_lazy_symbol_pointer" directive.
+    SwitchToSection(TLOFMacho.getNonLazySymbolPointerSection());
     for (StringMap<std::string>::iterator I = GVStubs.begin(),
          E = GVStubs.end(); I != E; ++I) {
       O << I->second << ":\n";
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp
index e41e7a9..2cde7d9 100644
--- a/lib/Target/TargetLoweringObjectFile.cpp
+++ b/lib/Target/TargetLoweringObjectFile.cpp
@@ -510,118 +510,176 @@
 
 
 const MCSection *TargetLoweringObjectFileMachO::
-getMachOSection(const char *Name, bool isDirective, SectionKind Kind) const {
-  if (MCSection *S = getContext().GetSection(Name))
-    return S;
-  return MCSectionMachO::Create(Name, isDirective, Kind, getContext());
+getMachOSection(StringRef Segment, StringRef Section,
+                unsigned TypeAndAttributes,
+                unsigned Reserved2, SectionKind Kind) const {
+  // FIXME: UNIQUE HERE.
+  //if (MCSection *S = getContext().GetSection(Name))
+  //  return S;
+  
+  return MCSectionMachO::Create(Segment, Section, TypeAndAttributes, Reserved2,
+                                Kind, getContext());
 }
 
 
-
 void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
                                                const TargetMachine &TM) {
   TargetLoweringObjectFile::Initialize(Ctx, TM);
-  TextSection = getMachOSection("\t.text", true, SectionKind::getText());
-  DataSection = getMachOSection("\t.data", true, SectionKind::getDataRel());
   
-  CStringSection = getMachOSection("\t.cstring", true,
-                                   SectionKind::getMergeable1ByteCString());
-  UStringSection = getMachOSection("__TEXT,__ustring", false,
-                                   SectionKind::getMergeable2ByteCString());
-  FourByteConstantSection = getMachOSection("\t.literal4\n", true,
-                                            SectionKind::getMergeableConst4());
-  EightByteConstantSection = getMachOSection("\t.literal8\n", true,
-                                             SectionKind::getMergeableConst8());
+  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());
+  UStringSection
+    = getMachOSection("__TEXT","__ustring", 0,
+                      SectionKind::getMergeable2ByteCString());
+  FourByteConstantSection // .literal4
+    = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS,
+                      SectionKind::getMergeableConst4());
+  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;
   if (TM.getRelocationModel() != Reloc::Static &&
       TM.getTargetData()->getPointerSize() == 32)
-    SixteenByteConstantSection = 
-      getMachOSection("\t.literal16\n", true, 
+    SixteenByteConstantSection =   // .literal16
+      getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS,
                       SectionKind::getMergeableConst16());
-  else
-    SixteenByteConstantSection = 0;
   
-  ReadOnlySection = getMachOSection("\t.const", true,
-                                    SectionKind::getReadOnly());
+  ReadOnlySection  // .const
+    = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly());
   
-  TextCoalSection =
-    getMachOSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions",
-                    false, SectionKind::getText());
-  ConstTextCoalSection = getMachOSection("\t__TEXT,__const_coal,coalesced",
-                                         false, SectionKind::getText());
-  ConstDataCoalSection = getMachOSection("\t__DATA,__const_coal,coalesced",
-                                         false, SectionKind::getText());
-  ConstDataSection = getMachOSection("\t.const_data", true,
-                                     SectionKind::getReadOnlyWithRel());
-  DataCoalSection = getMachOSection("\t__DATA,__datacoal_nt,coalesced",
-                                    false, SectionKind::getDataRel());
+  TextCoalSection
+    = getMachOSection("__TEXT", "__textcoal_nt",
+                      MCSectionMachO::S_COALESCED |
+                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
+                      SectionKind::getText());
+  ConstTextCoalSection
+    = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED,
+                      SectionKind::getText());
+  ConstDataCoalSection
+    = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED,
+                      SectionKind::getText());
+  ConstDataSection  // .const_data
+    = getMachOSection("__DATA", "__const", 0,
+                      SectionKind::getReadOnlyWithRel());
+  DataCoalSection
+    = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
+                      SectionKind::getDataRel());
 
   if (TM.getRelocationModel() == Reloc::Static) {
-    StaticCtorSection =
-      getMachOSection(".constructor", true, SectionKind::getDataRel());
-    StaticDtorSection =
-      getMachOSection(".destructor", true, SectionKind::getDataRel());
+    StaticCtorSection
+      = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
+    StaticDtorSection
+      = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel());
   } else {
-    StaticCtorSection =
-      getMachOSection(".mod_init_func", true, SectionKind::getDataRel());
-    StaticDtorSection =
-      getMachOSection(".mod_term_func", true, SectionKind::getDataRel());
+    StaticCtorSection
+      = getMachOSection("__DATA", "__mod_init_func",
+                        MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
+                        SectionKind::getDataRel());
+    StaticDtorSection
+      = getMachOSection("__DATA", "__mod_term_func", 
+                        MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
+                        SectionKind::getDataRel());
   }
   
   // Exception Handling.
-  LSDASection = getMachOSection("__DATA,__gcc_except_tab", false,
+  LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0,
                                 SectionKind::getDataRel());
   EHFrameSection =
-    getMachOSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms"
-                    "+live_support", false, SectionKind::getReadOnly());
+    getMachOSection("__TEXT", "__eh_frame",
+                    MCSectionMachO::S_COALESCED |
+                    MCSectionMachO::S_ATTR_NO_TOC |
+                    MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
+                    MCSectionMachO::S_ATTR_LIVE_SUPPORT,
+                    SectionKind::getReadOnly());
 
   // Debug Information.
-  // FIXME: Don't use 'directive' syntax: need flags for debug/regular??
-  // FIXME: Need __DWARF segment.
   DwarfAbbrevSection = 
-    getMachOSection(".section __DWARF,__debug_abbrev,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfInfoSection =  
-    getMachOSection(".section __DWARF,__debug_info,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfLineSection =  
-    getMachOSection(".section __DWARF,__debug_line,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfFrameSection =  
-    getMachOSection(".section __DWARF,__debug_frame,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfPubNamesSection =  
-    getMachOSection(".section __DWARF,__debug_pubnames,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfPubTypesSection =  
-    getMachOSection(".section __DWARF,__debug_pubtypes,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfStrSection =  
-    getMachOSection(".section __DWARF,__debug_str,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfLocSection =  
-    getMachOSection(".section __DWARF,__debug_loc,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfARangesSection =  
-    getMachOSection(".section __DWARF,__debug_aranges,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfRangesSection =  
-    getMachOSection(".section __DWARF,__debug_ranges,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfMacroInfoSection =  
-    getMachOSection(".section __DWARF,__debug_macinfo,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
   DwarfDebugInlineSection = 
-    getMachOSection(".section __DWARF,__debug_inlined,regular,debug", true,
+    getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG,
                     SectionKind::getMetadata());
 }
 
+/// getLazySymbolPointerSection - Return the section corresponding to
+/// the .lazy_symbol_pointer directive.
+const MCSection *TargetLoweringObjectFileMachO::
+getLazySymbolPointerSection() const {
+  return getMachOSection("__DATA", "__la_symbol_ptr",
+                         MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
+                         SectionKind::getMetadata());
+}
+
+/// getNonLazySymbolPointerSection - Return the section corresponding to
+/// the .non_lazy_symbol_pointer directive.
+const MCSection *TargetLoweringObjectFileMachO::
+getNonLazySymbolPointerSection() const {
+  return getMachOSection("__DATA", "__nl_symbol_ptr",
+                         MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
+                         SectionKind::getMetadata());
+}
+
+
 const MCSection *TargetLoweringObjectFileMachO::
 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 
                          Mangler *Mang, const TargetMachine &TM) const {
-  return getMachOSection(GV->getSection().c_str(), false, Kind);
+  // Parse the section specifier and create it if valid.
+  StringRef Segment, Section;
+  unsigned TAA, StubSize;
+  std::string ErrorCode =
+    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
+                                          TAA, StubSize);
+  if (ErrorCode.empty())
+    return getMachOSection(Segment, Section, TAA, StubSize, Kind);
+  
+  
+  // If invalid, report the error with llvm_report_error.
+  llvm_report_error("Global variable '" + GV->getNameStr() +
+                    "' has an invalid section specifier '" + GV->getSection() +
+                    "': " + ErrorCode + ".");
+  // Fall back to dropping it into the data section.
+  return DataSection;
 }
 
 const MCSection *TargetLoweringObjectFileMachO::
diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
index 59cff0f..ae0e599 100644
--- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
@@ -918,9 +918,11 @@
     // Output stubs for dynamically-linked functions
     if (!FnStubs.empty()) {
       const MCSection *TheSection = 
-      TLOFMacho.getMachOSection("\t.section __IMPORT,__jump_table,symbol_stubs,"
-                                "self_modifying_code+pure_instructions,5", true,
-                                SectionKind::getMetadata());
+        TLOFMacho.getMachOSection("__IMPORT", "__jump_table",
+                                  MCSectionMachO::S_SYMBOL_STUBS |
+                                  MCSectionMachO::S_ATTR_SELF_MODIFYING_CODE |
+                                  MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
+                                  5, SectionKind::getMetadata());
       SwitchToSection(TheSection);
       for (StringMap<std::string>::iterator I = FnStubs.begin(),
            E = FnStubs.end(); I != E; ++I)
@@ -932,8 +934,8 @@
     // Output stubs for external and common global variables.
     if (!GVStubs.empty()) {
       const MCSection *TheSection = 
-        TLOFMacho.getMachOSection("\t.section __IMPORT,__pointers,"
-                                  "non_lazy_symbol_pointers", true,
+        TLOFMacho.getMachOSection("__IMPORT", "__pointers",
+                                  MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
                                   SectionKind::getMetadata());
       SwitchToSection(TheSection);
       for (StringMap<std::string>::iterator I = GVStubs.begin(),
