diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h
index 6cd2d8e..e3d6074 100644
--- a/include/llvm/CodeGen/AsmPrinter.h
+++ b/include/llvm/CodeGen/AsmPrinter.h
@@ -34,10 +34,10 @@
   class MachineModuleInfo;
   class MCInst;
   class MCContext;
+  class MCSection;
   class MCStreamer;
   class DwarfWriter;
   class Mangler;
-  class Section;
   class TargetAsmInfo;
   class TargetLoweringObjectFile;
   class Type;
@@ -113,7 +113,7 @@
     /// CurrentSection - The current section we are emitting to.  This is
     /// controlled and used by the SwitchSection method.
     std::string CurrentSection;
-    const Section* CurrentSection_;
+    const MCSection *CurrentSection_;
 
     /// IsInTextSection - True if the current section we are emitting to is a
     /// text section.
@@ -173,7 +173,7 @@
 
     /// SwitchToSection - Switch to the specified section of the executable if
     /// we are not already in it!
-    void SwitchToSection(const Section* NS);
+    void SwitchToSection(const MCSection *NS);
 
     /// getGlobalLinkName - Returns the asm/link name of of the specified
     /// global variable.  Should be overridden by each target asm printer to
diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h
index 3223858..06d7e6a 100644
--- a/include/llvm/MC/MCSection.h
+++ b/include/llvm/MC/MCSection.h
@@ -32,30 +32,35 @@
     void operator=(const MCSection&); // DO NOT IMPLEMENT
   protected:
     MCSection(const StringRef &Name, MCContext &Ctx);
+    // FIXME: HACK.
+    SectionKind Kind;
   public:
     virtual ~MCSection();
 
     static MCSection *Create(const StringRef &Name, MCContext &Ctx);
     
     const std::string &getName() const { return Name; }
+    SectionKind getKind() const { return Kind; }
   };
 
   /// MCSectionWithKind - This is used by targets that use the SectionKind enum
   /// to classify their sections.
   class MCSectionWithKind : public MCSection {
-    SectionKind Kind;
     MCSectionWithKind(const StringRef &Name, SectionKind K, MCContext &Ctx) 
-      : MCSection(Name, Ctx), Kind(K) {}
+      : MCSection(Name, Ctx) {
+      Kind = K;
+    }
   public:
     
     static MCSectionWithKind *Create(const StringRef &Name, SectionKind K,
                                      MCContext &Ctx);
 
-    SectionKind getKind() const { return Kind; }
   };
   
   
   
+  typedef MCSectionWithKind MCSectionELF;
+  
 } // end namespace llvm
 
 #endif
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index 97da9ab..a1bb6aa 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -16,7 +16,6 @@
 #ifndef LLVM_TARGET_ASM_INFO_H
 #define LLVM_TARGET_ASM_INFO_H
 
-#include "llvm/ADT/StringMap.h"
 #include "llvm/Support/DataTypes.h"
 #include <string>
 
diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h
index 713b545..feecaac 100644
--- a/include/llvm/Target/TargetLoweringObjectFile.h
+++ b/include/llvm/Target/TargetLoweringObjectFile.h
@@ -15,12 +15,16 @@
 #ifndef LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
 #define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
 
-// FIXME: Switch to MC.
-#include "llvm/Target/TargetAsmInfo.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringMap.h"
 
 namespace llvm {
+  class MCSection;
   class MCContext;
-
+  class GlobalValue;
+  class Mangler;
+  class TargetMachine;
+  
 /// SectionKind - This is a simple POD value that classifies the properties of
 /// a section.  A global variable is classified into the deepest possible
 /// classification, and then the target maps them onto their sections based on
@@ -199,60 +203,47 @@
   }
 };
 
-class Section {
-public:
-
-  std::string Name;
-  SectionKind Kind;
-
-  explicit Section() { }
-  Section(const std::string &N, SectionKind K) : Name(N), Kind(K) {}
-  const std::string &getName() const { return Name; }
-  SectionKind getKind() const { return Kind; }
-};
-  
   
 class TargetLoweringObjectFile {
-private:
-  mutable StringMap<Section> Sections;
+  MCContext *Ctx;
 protected:
   
   TargetLoweringObjectFile();
   
   /// TextSection - Section directive for standard text.
   ///
-  const Section *TextSection;           // Defaults to ".text".
+  const MCSection *TextSection;           // Defaults to ".text".
   
   /// DataSection - Section directive for standard data.
   ///
-  const Section *DataSection;           // Defaults to ".data".
+  const MCSection *DataSection;           // Defaults to ".data".
   
   
   
   // FIXME: SINK THESE.
-  const Section *BSSSection_;
+  const MCSection *BSSSection_;
 
   /// ReadOnlySection - This is the directive that is emitted to switch to a
   /// read-only section for constant data (e.g. data declared const,
   /// jump tables).
-  const Section *ReadOnlySection;       // Defaults to NULL
+  const MCSection *ReadOnlySection;       // Defaults to NULL
   
   /// TLSDataSection - Section directive for Thread Local data.
   ///
-  const Section *TLSDataSection;        // Defaults to ".tdata".
+  const MCSection *TLSDataSection;        // Defaults to ".tdata".
   
   /// TLSBSSSection - Section directive for Thread Local uninitialized data.
   /// Null if this target doesn't support a BSS section.
   ///
-  const Section *TLSBSSSection;         // Defaults to ".tbss".
+  const MCSection *TLSBSSSection;         // Defaults to ".tbss".
   
-  const Section *CStringSection_;
+  const MCSection *CStringSection_;
   
 public:
   // FIXME: NONPUB.
-  const Section *getOrCreateSection(const char *Name,
-                                    bool isDirective,
-                                    SectionKind::Kind K) const;
+  const MCSection *getOrCreateSection(const char *Name,
+                                      bool isDirective,
+                                      SectionKind::Kind K) const;
 public:
   
   virtual ~TargetLoweringObjectFile();
@@ -260,17 +251,19 @@
   /// Initialize - this method must be called before any actual lowering is
   /// done.  This specifies the current context for codegen, and gives the
   /// lowering implementations a chance to set up their default sections.
-  virtual void Initialize(MCContext &Ctx, const TargetMachine &TM) {}
+  virtual void Initialize(MCContext &ctx, const TargetMachine &TM) {
+    Ctx = &ctx;
+  }
   
   
-  const Section *getTextSection() const { return TextSection; }
-  const Section *getDataSection() const { return DataSection; }
+  const MCSection *getTextSection() const { return TextSection; }
+  const MCSection *getDataSection() const { return DataSection; }
   
   
   /// getSectionForMergeableConstant - Given a mergeable constant with the
   /// specified size and relocation information, return a section that it
   /// should be placed in.
-  virtual const Section *
+  virtual const MCSection *
   getSectionForMergeableConstant(SectionKind Kind) const;
   
   /// getKindForNamedSection - If this target wants to be able to override
@@ -285,15 +278,15 @@
   /// SectionForGlobal - This method computes the appropriate section to emit
   /// the specified global variable or function definition.  This should not
   /// be passed external (or available externally) globals.
-  const Section *SectionForGlobal(const GlobalValue *GV,
-                                  Mangler *Mang,
-                                  const TargetMachine &TM) const;
+  const MCSection *SectionForGlobal(const GlobalValue *GV,
+                                    Mangler *Mang,
+                                    const TargetMachine &TM) const;
   
   /// getSpecialCasedSectionGlobals - Allow the target to completely override
   /// section assignment of a global.
   /// FIXME: ELIMINATE this by making PIC16 implement ADDRESS with
   /// getFlagsForNamedSection.
-  virtual const Section *
+  virtual const MCSection *
   getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang,
                                 SectionKind Kind) const {
     return 0;
@@ -307,7 +300,7 @@
   }
   
 protected:
-  virtual const Section *
+  virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const;
 };
@@ -332,7 +325,7 @@
   /// getSectionForMergeableConstant - Given a mergeable constant with the
   /// specified size and relocation information, return a section that it
   /// should be placed in.
-  virtual const Section *
+  virtual const MCSection *
   getSectionForMergeableConstant(SectionKind Kind) const;
   
   virtual SectionKind::Kind getKindForNamedSection(const char *Section,
@@ -340,40 +333,40 @@
   void getSectionFlagsAsString(SectionKind Kind,
                                SmallVectorImpl<char> &Str) const;
   
-  virtual const Section *
+  virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const;
 protected:
-  const Section *DataRelSection;
-  const Section *DataRelLocalSection;
-  const Section *DataRelROSection;
-  const Section *DataRelROLocalSection;
+  const MCSection *DataRelSection;
+  const MCSection *DataRelLocalSection;
+  const MCSection *DataRelROSection;
+  const MCSection *DataRelROLocalSection;
   
-  const Section *MergeableConst4Section;
-  const Section *MergeableConst8Section;
-  const Section *MergeableConst16Section;
+  const MCSection *MergeableConst4Section;
+  const MCSection *MergeableConst8Section;
+  const MCSection *MergeableConst16Section;
 };
 
   
   
 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
-  const Section *TextCoalSection;
-  const Section *ConstTextCoalSection;
-  const Section *ConstDataCoalSection;
-  const Section *ConstDataSection;
-  const Section *DataCoalSection;
-  const Section *FourByteConstantSection;
-  const Section *EightByteConstantSection;
-  const Section *SixteenByteConstantSection;
+  const MCSection *TextCoalSection;
+  const MCSection *ConstTextCoalSection;
+  const MCSection *ConstDataCoalSection;
+  const MCSection *ConstDataSection;
+  const MCSection *DataCoalSection;
+  const MCSection *FourByteConstantSection;
+  const MCSection *EightByteConstantSection;
+  const MCSection *SixteenByteConstantSection;
 public:
   
   virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
 
-  virtual const Section *
+  virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const;
   
-  virtual const Section *
+  virtual const MCSection *
   getSectionForMergeableConstant(SectionKind Kind) const;
 };
 
@@ -386,7 +379,7 @@
   virtual void getSectionFlagsAsString(SectionKind Kind,
                                        SmallVectorImpl<char> &Str) const;
   
-  virtual const Section *
+  virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const;
 };
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 7106c6a..178bbaa 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -23,8 +23,9 @@
 #include "llvm/CodeGen/DwarfWriter.h"
 #include "llvm/Analysis/DebugInfo.h"
 #include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCStreamer.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormattedStream.h"
@@ -132,7 +133,7 @@
 
 /// SwitchToSection - Switch to the specified section of the executable if we
 /// are not already in it!
-void AsmPrinter::SwitchToSection(const Section *NS) {
+void AsmPrinter::SwitchToSection(const MCSection *NS) {
   const std::string &NewSection = NS->getName();
 
   // If we're already in this section, we're done.
@@ -308,10 +309,10 @@
 namespace {
   // SectionCPs - Keep track the alignment, constpool entries per Section.
   struct SectionCPs {
-    const Section *S;
+    const MCSection *S;
     unsigned Alignment;
     SmallVector<unsigned, 4> CPEs;
-    SectionCPs(const Section *s, unsigned a) : S(s), Alignment(a) {};
+    SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {};
   };
 }
 
@@ -347,7 +348,8 @@
     }
     }
 
-    const Section *S =getObjFileLowering().getSectionForMergeableConstant(Kind);
+    const MCSection *S =
+      getObjFileLowering().getSectionForMergeableConstant(Kind);
     
     // The number of sections are small, just do a linear search from the
     // last section to the first.
@@ -419,7 +421,7 @@
   const char *JumpTableDataSection = TAI->getJumpTableDataSection();
   const Function *F = MF.getFunction();
   
-  const Section *FuncSection =
+  const MCSection *FuncSection =
     getObjFileLowering().SectionForGlobal(F, Mang, TM);
 
   bool JTInDiffSection = false;
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index afcd44a..873cdc2 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -14,13 +14,14 @@
 #include "DwarfDebug.h"
 #include "llvm/Module.h"
 #include "llvm/CodeGen/MachineModuleInfo.h"
-#include "llvm/Support/Timer.h"
-#include "llvm/System/Path.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetFrameInfo.h"
 #include "llvm/Target/TargetLoweringObjectFile.h"
 #include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/Support/Timer.h"
+#include "llvm/System/Path.h"
 using namespace llvm;
 
 static TimerGroup &getDwarfTimerGroup() {
@@ -224,7 +225,7 @@
 DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
   : Dwarf(OS, A, T, "dbg"), ModuleCU(0),
     AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
-    ValuesSet(InitValuesSetSize), Values(), StringPool(), SectionMap(),
+    ValuesSet(InitValuesSetSize), Values(), StringPool(), 
     SectionSourceLines(), didInitial(false), shouldEmit(false),
     FunctionDbgScope(0), DebugTimer(0) {
   if (TimePassesIsEnabled)
@@ -2132,7 +2133,7 @@
     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
 
     if (Asm->isVerbose()) {
-      const Section* S = SectionMap[j + 1];
+      const MCSection *S = SectionMap[j + 1];
       O << '\t' << TAI->getCommentString() << " Section"
         << S->getName() << '\n';
     } else {
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h
index a4072f5..af76b0b 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -120,7 +120,7 @@
 
   /// SectionMap - Provides a unique id per text section.
   ///
-  UniqueVector<const Section*> SectionMap;
+  UniqueVector<const MCSection*> SectionMap;
 
   /// SectionSourceLines - Tracks line numbers per text section.
   ///
diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp
index 230c5ac..c743832 100644
--- a/lib/CodeGen/ELFWriter.cpp
+++ b/lib/CodeGen/ELFWriter.cpp
@@ -43,6 +43,7 @@
 #include "llvm/CodeGen/MachineCodeEmitter.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetELFWriterInfo.h"
@@ -334,8 +335,8 @@
       TM.getTargetLowering()->getObjFileLowering();
 
     // Get the ELF section where this global belongs from TLOF
-    const Section *S = TLOF.SectionForGlobal(GV, Mang, TM);
-    unsigned SectionFlags = getElfSectionFlags(S->getKind());
+    const MCSection *S = TLOF.SectionForGlobal(GV, Mang, TM);
+    unsigned SectionFlags = getElfSectionFlags(((MCSectionELF*)S)->getKind());
 
     // The symbol align should update the section alignment if needed
     const TargetData *TD = TM.getTargetData();
diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
index 5feafb4..eb39846 100644
--- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
+++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
@@ -27,6 +27,7 @@
 #include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineJumpTableInfo.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetLoweringObjectFile.h"
@@ -1159,7 +1160,7 @@
   if (Subtarget->isTargetELF())
     O << "\t.type " << name << ",%object\n";
   
-  const Section *TheSection =
+  const MCSection *TheSection =
     getObjFileLowering().SectionForGlobal(GVar, Mang, TM);
   SwitchToSection(TheSection);
 
diff --git a/lib/Target/Alpha/AlphaISelLowering.cpp b/lib/Target/Alpha/AlphaISelLowering.cpp
index f7a38c2..c5f24dc 100644
--- a/lib/Target/Alpha/AlphaISelLowering.cpp
+++ b/lib/Target/Alpha/AlphaISelLowering.cpp
@@ -31,14 +31,16 @@
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
 
-
+namespace {
 class TargetLoweringObjectFileAlpha : public TargetLoweringObjectFile {
 public:
-  TargetLoweringObjectFileAlpha() {
+  void Initialize(MCContext &Ctx, const TargetMachine &TM) {
+    TargetLoweringObjectFile::Initialize(Ctx, TM);
     TextSection = getOrCreateSection("_text", true, SectionKind::Text);
     DataSection = getOrCreateSection("_data", true, SectionKind::DataRel);
   }
 };
+}
   
   
 
diff --git a/lib/Target/PIC16/PIC16AsmPrinter.cpp b/lib/Target/PIC16/PIC16AsmPrinter.cpp
index 743ce9f..604d105 100644
--- a/lib/Target/PIC16/PIC16AsmPrinter.cpp
+++ b/lib/Target/PIC16/PIC16AsmPrinter.cpp
@@ -18,15 +18,15 @@
 #include "llvm/Function.h"
 #include "llvm/Module.h"
 #include "llvm/CodeGen/DwarfWriter.h"
-#include "llvm/Support/FormattedStream.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
-#include "llvm/Support/Mangler.h"
-#include "llvm/Support/ErrorHandling.h"
 #include "llvm/CodeGen/DwarfWriter.h"
 #include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/Target/TargetRegistry.h"
 #include "llvm/Target/TargetLoweringObjectFile.h"
-
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/FormattedStream.h"
+#include "llvm/Support/Mangler.h"
 using namespace llvm;
 
 #include "PIC16GenAsmWriter.inc"
@@ -71,7 +71,7 @@
   std::string T = PAN::getCodeSectionName(CurrentFnName);
   const char *codeSection = T.c_str();
  
-  const Section *fCodeSection = 
+  const MCSection *fCodeSection = 
     getObjFileLowering().getOrCreateSection(codeSection, false, 
                                             SectionKind::Text);
   // Start the Code Section.
@@ -348,7 +348,7 @@
   std::string T = PAN::getFrameSectionName(CurrentFnName);
   const char *SectionName = T.c_str();
 
-  const Section *fPDataSection =
+  const MCSection *fPDataSection =
     getObjFileLowering().getOrCreateSection(SectionName, false,
                                             SectionKind::DataRel);
   SwitchToSection(fPDataSection);
diff --git a/lib/Target/PIC16/PIC16ISelLowering.cpp b/lib/Target/PIC16/PIC16ISelLowering.cpp
index 811bb1e..87379a6 100644
--- a/lib/Target/PIC16/PIC16ISelLowering.cpp
+++ b/lib/Target/PIC16/PIC16ISelLowering.cpp
@@ -143,7 +143,7 @@
 
 // PIC16TargetLowering Constructor.
 PIC16TargetLowering::PIC16TargetLowering(PIC16TargetMachine &TM)
-  : TargetLowering(TM, new PIC16TargetObjectFile(TM)), TmpSize(0) {
+  : TargetLowering(TM, new PIC16TargetObjectFile()), TmpSize(0) {
  
   Subtarget = &TM.getSubtarget<PIC16Subtarget>();
 
diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.cpp b/lib/Target/PIC16/PIC16TargetObjectFile.cpp
index feec2fd..5a2d4d8 100644
--- a/lib/Target/PIC16/PIC16TargetObjectFile.cpp
+++ b/lib/Target/PIC16/PIC16TargetObjectFile.cpp
@@ -12,11 +12,13 @@
 #include "PIC16TargetMachine.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
+#include "llvm/MC/MCSection.h"
 using namespace llvm;
 
-
-PIC16TargetObjectFile::PIC16TargetObjectFile(const PIC16TargetMachine &tm) 
-: TM (tm) {
+void PIC16TargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &tm){
+  TargetLoweringObjectFile::Initialize(Ctx, tm);
+  TM = &tm;
+  
   BSSSection_  = getOrCreateSection("udata.# UDATA", false, SectionKind::BSS);
   ReadOnlySection = getOrCreateSection("romdata.# ROMDATA", false,
                                        SectionKind::ReadOnly);
@@ -26,9 +28,7 @@
   // in BeginModule, and gpasm cribbs for that .text symbol.
   TextSection = getOrCreateSection("", true, SectionKind::Text);
 
-  
-  PIC16Section *ROSection = new PIC16Section(ReadOnlySection);
-  ROSections.push_back(ROSection);
+  ROSections.push_back(new PIC16Section(ReadOnlySection));
   
   // FIXME: I don't know what the classification of these sections really is.
   ExternalVarDecls = new PIC16Section(getOrCreateSection("ExternalVarDecls",
@@ -40,14 +40,14 @@
 }
 
 
-const Section *
+const MCSection *
 PIC16TargetObjectFile::getBSSSectionForGlobal(const GlobalVariable *GV) const {
   assert(GV->hasInitializer() && "This global doesn't need space");
   Constant *C = GV->getInitializer();
   assert(C->isNullValue() && "Unitialized globals has non-zero initializer");
 
   // Find how much space this global needs.
-  const TargetData *TD = TM.getTargetData();
+  const TargetData *TD = TM->getTargetData();
   const Type *Ty = C->getType(); 
   unsigned ValSize = TD->getTypeAllocSize(Ty);
  
@@ -64,9 +64,9 @@
   // No BSS section spacious enough was found. Crate a new one.
   if (!FoundBSS) {
     std::string name = PAN::getUdataSectionName(BSSSections.size());
-    const Section *NewSection = getOrCreateSection(name.c_str(), false,
-                                                   // FIXME.
-                                                   SectionKind::Metadata);
+    const MCSection *NewSection = getOrCreateSection(name.c_str(), false,
+                                                     // FIXME.
+                                                     SectionKind::Metadata);
 
     FoundBSS = new PIC16Section(NewSection);
 
@@ -80,7 +80,7 @@
   return FoundBSS->S_;
 } 
 
-const Section *
+const MCSection *
 PIC16TargetObjectFile::getIDATASectionForGlobal(const GlobalVariable *GV) const{
   assert(GV->hasInitializer() && "This global doesn't need space");
   Constant *C = GV->getInitializer();
@@ -89,7 +89,7 @@
          "can split initialized RAM data only");
 
   // Find how much space this global needs.
-  const TargetData *TD = TM.getTargetData();
+  const TargetData *TD = TM->getTargetData();
   const Type *Ty = C->getType(); 
   unsigned ValSize = TD->getTypeAllocSize(Ty);
  
@@ -106,8 +106,7 @@
   // No IDATA section spacious enough was found. Crate a new one.
   if (!FoundIDATA) {
     std::string name = PAN::getIdataSectionName(IDATASections.size());
-    const Section *NewSection = getOrCreateSection(name.c_str(),
-                                                   false,
+    const MCSection *NewSection = getOrCreateSection(name.c_str(), false,
                                                    // FIXME.
                                                    SectionKind::Metadata);
 
@@ -125,7 +124,7 @@
 
 // Get the section for an automatic variable of a function.
 // For PIC16 they are globals only with mangled names.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::getSectionForAuto(const GlobalVariable *GV) const {
 
   const std::string name = PAN::getSectionNameForSym(GV->getName());
@@ -142,10 +141,10 @@
 
   // No Auto section was found. Crate a new one.
   if (!FoundAutoSec) {
-    const Section *NewSection = getOrCreateSection(name.c_str(),
-                                                   // FIXME.
-                                                   false,
-                                                   SectionKind::Metadata);
+    const MCSection *NewSection = getOrCreateSection(name.c_str(),
+                                                     // FIXME.
+                                                     false,
+                                                     SectionKind::Metadata);
 
     FoundAutoSec = new PIC16Section(NewSection);
 
@@ -162,7 +161,7 @@
 
 // Override default implementation to put the true globals into
 // multiple data sections if required.
-const Section*
+const MCSection *
 PIC16TargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV1,
                                               SectionKind Kind,
                                               Mangler *Mang,
@@ -224,7 +223,7 @@
 
 /// getSpecialCasedSectionGlobals - Allow the target to completely override
 /// section assignment of a global.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::getSpecialCasedSectionGlobals(const GlobalValue *GV,
                                                      Mangler *Mang,
                                                      SectionKind Kind) const {
@@ -250,7 +249,7 @@
 
 // Create a new section for global variable. If Addr is given then create
 // section at that address else create by name.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::CreateSectionForGlobal(const GlobalVariable *GV,
                                               Mangler *Mang,
                                               const std::string &Addr) const {
@@ -268,11 +267,11 @@
     return CreateROSectionForGlobal(GV, Addr);
 
   // Else let the default implementation take care of it.
-  return TargetLoweringObjectFile::SectionForGlobal(GV, Mang, TM);
+  return TargetLoweringObjectFile::SectionForGlobal(GV, Mang, *TM);
 }
 
 // Create uninitialized section for a variable.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::CreateBSSSectionForGlobal(const GlobalVariable *GV,
                                                  std::string Addr) const {
   assert(GV->hasInitializer() && "This global doesn't need space");
@@ -297,8 +296,8 @@
   
   PIC16Section *NewBSS = FoundBSS;
   if (NewBSS == NULL) {
-    const Section *NewSection = getOrCreateSection(Name.c_str(),
-                                                   false, SectionKind::BSS);
+    const MCSection *NewSection = getOrCreateSection(Name.c_str(), false,
+                                                     SectionKind::BSS);
     NewBSS = new PIC16Section(NewSection);
     BSSSections.push_back(NewBSS);
   }
@@ -314,14 +313,14 @@
 
 // Get rom section for a variable. Currently there can be only one rom section
 // unless a variable explicitly requests a section.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::getROSectionForGlobal(const GlobalVariable *GV) const {
   ROSections[0]->Items.push_back(GV);
   return ROSections[0]->S_;
 }
 
 // Create initialized data section for a variable.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::CreateIDATASectionForGlobal(const GlobalVariable *GV,
                                                    std::string Addr) const {
   assert(GV->hasInitializer() && "This global doesn't need space");
@@ -349,8 +348,7 @@
 
   PIC16Section *NewIDATASec = FoundIDATASec;
   if (NewIDATASec == NULL) {
-    const Section *NewSection = getOrCreateSection(Name.c_str(),
-                                                   false,
+    const MCSection *NewSection = getOrCreateSection(Name.c_str(), false,
                                                    // FIXME:
                                                    SectionKind::Metadata);
     NewIDATASec = new PIC16Section(NewSection);
@@ -365,7 +363,7 @@
 }
 
 // Create a section in rom for a variable.
-const Section *
+const MCSection *
 PIC16TargetObjectFile::CreateROSectionForGlobal(const GlobalVariable *GV,
                                                 std::string Addr) const {
   assert(GV->getType()->getAddressSpace() == PIC16ISD::ROM_SPACE &&
@@ -390,9 +388,8 @@
 
   PIC16Section *NewRomSec = FoundROSec;
   if (NewRomSec == NULL) {
-    const Section *NewSection = getOrCreateSection(Name.c_str(),
-                                                   false,
-                                                   SectionKind::ReadOnly);
+    const MCSection *NewSection = getOrCreateSection(Name.c_str(), false,
+                                                     SectionKind::ReadOnly);
     NewRomSec = new PIC16Section(NewSection);
     ROSections.push_back(NewRomSec);
   }
diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.h b/lib/Target/PIC16/PIC16TargetObjectFile.h
index 336730d..c296954 100644
--- a/lib/Target/PIC16/PIC16TargetObjectFile.h
+++ b/lib/Target/PIC16/PIC16TargetObjectFile.h
@@ -29,12 +29,12 @@
   /// FIXME: Reimplement by inheriting from MCSection.
   ///
   struct PIC16Section {
-    const Section *S_; // Connection to actual Section.
+    const MCSection *S_; // Connection to actual Section.
     unsigned Size;  // Total size of the objects contained.
     bool SectionPrinted;
     std::vector<const GlobalVariable*> Items;
     
-    PIC16Section(const Section *s) {
+    PIC16Section(const MCSection *s) {
       S_ = s;
       Size = 0;
       SectionPrinted = false;
@@ -44,7 +44,7 @@
   };
   
   class PIC16TargetObjectFile : public TargetLoweringObjectFile {
-    const PIC16TargetMachine &TM;
+    const TargetMachine *TM;
   public:
     mutable std::vector<PIC16Section*> BSSSections;
     mutable std::vector<PIC16Section*> IDATASections;
@@ -53,34 +53,36 @@
     mutable PIC16Section *ExternalVarDecls;
     mutable PIC16Section *ExternalVarDefs;
     
-    PIC16TargetObjectFile(const PIC16TargetMachine &TM);
     ~PIC16TargetObjectFile();
     
+    void Initialize(MCContext &Ctx, const TargetMachine &TM);
+
+    
     /// getSpecialCasedSectionGlobals - Allow the target to completely override
     /// section assignment of a global.
-    virtual const Section *
+    virtual const MCSection *
     getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang,
                                   SectionKind Kind) const;
-    virtual const Section *SelectSectionForGlobal(const GlobalValue *GV,
-                                                  SectionKind Kind,
-                                                  Mangler *Mang,
-                                                  const TargetMachine&) const;
+    virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
+                                                    SectionKind Kind,
+                                                    Mangler *Mang,
+                                                    const TargetMachine&) const;
   private:
     std::string getSectionNameForSym(const std::string &Sym) const;
 
-    const Section *getBSSSectionForGlobal(const GlobalVariable *GV) const;
-    const Section *getIDATASectionForGlobal(const GlobalVariable *GV) const;
-    const Section *getSectionForAuto(const GlobalVariable *GV) const;
-    const Section *CreateBSSSectionForGlobal(const GlobalVariable *GV,
-                                             std::string Addr = "") const;
-    const Section *CreateIDATASectionForGlobal(const GlobalVariable *GV,
+    const MCSection *getBSSSectionForGlobal(const GlobalVariable *GV) const;
+    const MCSection *getIDATASectionForGlobal(const GlobalVariable *GV) const;
+    const MCSection *getSectionForAuto(const GlobalVariable *GV) const;
+    const MCSection *CreateBSSSectionForGlobal(const GlobalVariable *GV,
                                                std::string Addr = "") const;
-    const Section *getROSectionForGlobal(const GlobalVariable *GV) const;
-    const Section *CreateROSectionForGlobal(const GlobalVariable *GV,
-                                            std::string Addr = "") const;
-    const Section *CreateSectionForGlobal(const GlobalVariable *GV,
-                                          Mangler *Mang,
-                                          const std::string &Addr = "") const;
+    const MCSection *CreateIDATASectionForGlobal(const GlobalVariable *GV,
+                                                 std::string Addr = "") const;
+    const MCSection *getROSectionForGlobal(const GlobalVariable *GV) const;
+    const MCSection *CreateROSectionForGlobal(const GlobalVariable *GV,
+                                              std::string Addr = "") const;
+    const MCSection *CreateSectionForGlobal(const GlobalVariable *GV,
+                                            Mangler *Mang,
+                                            const std::string &Addr = "") const;
   public:
     void SetSectionForGVs(Module &M);
     const std::vector<PIC16Section*> &getBSSSections() const {
diff --git a/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp b/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
index d01afb6..000c327 100644
--- a/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
@@ -32,6 +32,13 @@
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
+#include "llvm/MC/MCSection.h"
+#include "llvm/Target/TargetAsmInfo.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
+#include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetOptions.h"
+#include "llvm/Target/TargetRegistry.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/CommandLine.h"
@@ -39,12 +46,6 @@
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/FormattedStream.h"
-#include "llvm/Target/TargetAsmInfo.h"
-#include "llvm/Target/TargetLoweringObjectFile.h"
-#include "llvm/Target/TargetRegisterInfo.h"
-#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetOptions.h"
-#include "llvm/Target/TargetRegistry.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringSet.h"
@@ -892,7 +893,7 @@
   unsigned Size = TD->getTypeAllocSize(Type);
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
-  const Section *TheSection =
+  const MCSection *TheSection =
     getObjFileLowering().SectionForGlobal(GVar, Mang, TM);
   SwitchToSection(TheSection);
 
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp
index caeac30..36fda0b 100644
--- a/lib/Target/TargetLoweringObjectFile.cpp
+++ b/lib/Target/TargetLoweringObjectFile.cpp
@@ -16,10 +16,12 @@
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/GlobalVariable.h"
-#include "llvm/Support/Mangler.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetOptions.h"
+#include "llvm/Support/Mangler.h"
 #include "llvm/ADT/StringExtras.h"
 using namespace llvm;
 
@@ -27,7 +29,7 @@
 //                              Generic Code
 //===----------------------------------------------------------------------===//
 
-TargetLoweringObjectFile::TargetLoweringObjectFile() {
+TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
   TextSection = 0;
   DataSection = 0;
   BSSSection_ = 0;
@@ -176,7 +178,7 @@
 /// SectionForGlobal - This method computes the appropriate section to emit
 /// the specified global variable or function definition.  This should not
 /// be passed external (or available externally) globals.
-const Section *TargetLoweringObjectFile::
+const MCSection *TargetLoweringObjectFile::
 SectionForGlobal(const GlobalValue *GV, Mangler *Mang,
                  const TargetMachine &TM) const {
   assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
@@ -192,7 +194,7 @@
   if (GV->hasSection()) {
     // If the target has special section hacks for specifically named globals,
     // return them now.
-    if (const Section *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind))
+    if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind))
       return TS;
     
     // If the target has magic semantics for certain section names, make sure to
@@ -209,7 +211,7 @@
 }
 
 // Lame default implementation. Calculate the section name for global.
-const Section*
+const MCSection *
 TargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
                                                  SectionKind Kind,
                                                  Mangler *Mang,
@@ -231,7 +233,7 @@
 /// getSectionForMergableConstant - Given a mergable constant with the
 /// specified size and relocation information, return a section that it
 /// should be placed in.
-const Section *
+const MCSection *
 TargetLoweringObjectFile::
 getSectionForMergeableConstant(SectionKind Kind) const {
   if (Kind.isReadOnly() && ReadOnlySection != 0)
@@ -241,18 +243,13 @@
 }
 
 
-const Section *TargetLoweringObjectFile::
+const MCSection *TargetLoweringObjectFile::
 getOrCreateSection(const char *Name, bool isDirective,
                    SectionKind::Kind Kind) const {
-  Section &S = Sections[Name];
-
-  // This is newly-created section, set it up properly.
-  if (S.Name.empty()) {
-    S.Kind = SectionKind::get(Kind, false /*weak*/, !isDirective);
-    S.Name = Name;
-  }
-
-  return &S;
+  if (MCSection *S = Ctx->GetSection(Name))
+    return S;
+  SectionKind K = SectionKind::get(Kind, false /*weak*/, !isDirective);
+  return MCSectionWithKind::Create(Name, K, *Ctx);
 }
 
 
@@ -263,6 +260,7 @@
 
 void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
                                              const TargetMachine &TM) {
+  TargetLoweringObjectFile::Initialize(Ctx, TM);
   if (!HasCrazyBSS)
     BSSSection_ = getOrCreateSection("\t.bss", true, SectionKind::BSS);
   else
@@ -401,7 +399,7 @@
   return ".gnu.linkonce.d.rel.ro.";
 }
 
-const Section *TargetLoweringObjectFileELF::
+const MCSection *TargetLoweringObjectFileELF::
 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                        Mangler *Mang, const TargetMachine &TM) const {
   
@@ -458,7 +456,7 @@
 /// getSectionForMergeableConstant - Given a mergeable constant with the
 /// specified size and relocation information, return a section that it
 /// should be placed in.
-const Section *TargetLoweringObjectFileELF::
+const MCSection *TargetLoweringObjectFileELF::
 getSectionForMergeableConstant(SectionKind Kind) const {
   if (Kind.isMergeableConst4())
     return MergeableConst4Section;
@@ -480,6 +478,7 @@
 
 void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
                                                const TargetMachine &TM) {
+  TargetLoweringObjectFile::Initialize(Ctx, TM);
   TextSection = getOrCreateSection("\t.text", true, SectionKind::Text);
   DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel);
   
@@ -514,7 +513,7 @@
                                        false, SectionKind::DataRel);
 }
 
-const Section *TargetLoweringObjectFileMachO::
+const MCSection *TargetLoweringObjectFileMachO::
 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                        Mangler *Mang, const TargetMachine &TM) const {
   assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
@@ -569,7 +568,7 @@
   return DataSection;
 }
 
-const Section *
+const MCSection *
 TargetLoweringObjectFileMachO::
 getSectionForMergeableConstant(SectionKind Kind) const {
   // If this constant requires a relocation, we have to put it in the data
@@ -592,6 +591,7 @@
 
 void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
                                               const TargetMachine &TM) {
+  TargetLoweringObjectFile::Initialize(Ctx, TM);
   TextSection = getOrCreateSection("\t.text", true, SectionKind::Text);
   DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel);
 }
@@ -618,7 +618,7 @@
 }
 
 
-const Section *TargetLoweringObjectFileCOFF::
+const MCSection *TargetLoweringObjectFileCOFF::
 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                        Mangler *Mang, const TargetMachine &TM) const {
   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
@@ -635,9 +635,8 @@
   if (Kind.isText())
     return getTextSection();
   
-  if (Kind.isBSS())
-    if (const Section *S = BSSSection_)
-      return S;
+  if (Kind.isBSS() && BSSSection_ != 0)
+    return BSSSection_;
   
   if (Kind.isReadOnly() && ReadOnlySection != 0)
     return ReadOnlySection;
diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
index c7b0e27..a4b36a0 100644
--- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
@@ -29,6 +29,7 @@
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/CodeGen/DwarfWriter.h"
 #include "llvm/CodeGen/MachineJumpTableInfo.h"
@@ -783,7 +784,7 @@
   if (Subtarget->isTargetELF())
     O << "\t.type\t" << name << ",@object\n";
 
-  const Section *TheSection =
+  const MCSection *TheSection =
     getObjFileLowering().SectionForGlobal(GVar, Mang, TM);
   SwitchToSection(TheSection);
 
diff --git a/lib/Target/XCore/XCoreISelLowering.cpp b/lib/Target/XCore/XCoreISelLowering.cpp
index 7873463..24d9f9b 100644
--- a/lib/Target/XCore/XCoreISelLowering.cpp
+++ b/lib/Target/XCore/XCoreISelLowering.cpp
@@ -56,8 +56,7 @@
 }
 
 XCoreTargetLowering::XCoreTargetLowering(XCoreTargetMachine &XTM)
-  : TargetLowering(XTM,
-                   new XCoreTargetObjectFile(XTM.getSubtargetImpl()->isXS1A())),
+  : TargetLowering(XTM, new XCoreTargetObjectFile()),
     TM(XTM),
     Subtarget(*XTM.getSubtargetImpl()) {
 
diff --git a/lib/Target/XCore/XCoreTargetObjectFile.cpp b/lib/Target/XCore/XCoreTargetObjectFile.cpp
index 964ec82..c28a335 100644
--- a/lib/Target/XCore/XCoreTargetObjectFile.cpp
+++ b/lib/Target/XCore/XCoreTargetObjectFile.cpp
@@ -8,10 +8,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "XCoreTargetObjectFile.h"
+#include "XCoreSubtarget.h"
+#include "llvm/Target/TargetMachine.h"
 using namespace llvm;
 
 
-XCoreTargetObjectFile::XCoreTargetObjectFile(bool isXS1A) {
+void XCoreTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){
+  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
+
   TextSection = getOrCreateSection("\t.text", true, SectionKind::Text);
   DataSection = getOrCreateSection("\t.dp.data", false, SectionKind::DataRel);
   BSSSection_ = getOrCreateSection("\t.dp.bss", false, SectionKind::BSS);
@@ -22,11 +26,11 @@
   TLSDataSection = DataSection;
   TLSBSSSection = BSSSection_;
   
-  if (isXS1A)
+  if (TM.getSubtarget<XCoreSubtarget>().isXS1A())
     // FIXME: Why is this writable ("datarel")???
     ReadOnlySection = getOrCreateSection("\t.dp.rodata", false,
                                          SectionKind::DataRel);
   else
     ReadOnlySection = getOrCreateSection("\t.cp.rodata", false,
                                          SectionKind::ReadOnly);
-}
+}
\ No newline at end of file
diff --git a/lib/Target/XCore/XCoreTargetObjectFile.h b/lib/Target/XCore/XCoreTargetObjectFile.h
index af40e11..7efb990 100644
--- a/lib/Target/XCore/XCoreTargetObjectFile.h
+++ b/lib/Target/XCore/XCoreTargetObjectFile.h
@@ -16,8 +16,9 @@
 
   class XCoreTargetObjectFile : public TargetLoweringObjectFileELF {
   public:
-    XCoreTargetObjectFile(bool isXS1A);
     
+    void Initialize(MCContext &Ctx, const TargetMachine &TM);
+
     // TODO: Classify globals as xcore wishes.
   };
 } // end namespace llvm
diff --git a/test/CodeGen/XCore/fneg.ll b/test/CodeGen/XCore/fneg.ll
index 3fb7b01..3bcb7c7 100644
--- a/test/CodeGen/XCore/fneg.ll
+++ b/test/CodeGen/XCore/fneg.ll
@@ -1,5 +1,4 @@
-; RUN: llvm-as < %s | llc -march=xcore > %t1.s
-; RUN: grep "xor" %t1.s | count 1
+; RUN: llvm-as < %s | llc -march=xcore | grep "xor" | count 1
 define i1 @test(double %F) nounwind {
 entry:
 	%0 = fsub double -0.000000e+00, %F
