diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index 55696b0..9d3efa7 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -22,10 +22,39 @@
 class MCAssembler;
 class MCContext;
 class MCExpr;
+class MCFragment;
 class MCSection;
 class MCSectionData;
 class MCSymbol;
 
+/// MCAsmFixup - Represent a fixed size region of bytes inside some fragment
+/// which needs to be rewritten. This region will either be rewritten by the
+/// assembler or cause a relocation entry to be generated.
+struct MCAsmFixup {
+  /// Fragment - The fragment containing the fixup.
+  MCFragment *Fragment;
+  
+  /// Offset - The offset inside the fragment which needs to be rewritten.
+  uint64_t Offset;
+
+  /// Value - The expression to eventually write into the fragment.
+  const MCExpr *Value;
+
+  /// Size - The fixup size.
+  unsigned Size;
+
+  /// FixedValue - The value to replace the fix up by.
+  //
+  // FIXME: This should not be here.
+  uint64_t FixedValue;
+
+public:
+  MCAsmFixup(MCFragment &_Fragment, uint64_t _Offset, const MCExpr &_Value,
+             unsigned _Size) 
+    : Fragment(&_Fragment), Offset(_Offset), Value(&_Value), Size(_Size),
+      FixedValue(0) {}
+};
+
 class MCFragment : public ilist_node<MCFragment> {
   MCFragment(const MCFragment&);     // DO NOT IMPLEMENT
   void operator=(const MCFragment&); // DO NOT IMPLEMENT
@@ -284,41 +313,14 @@
   void operator=(const MCSectionData&); // DO NOT IMPLEMENT
 
 public:
-  /// Fixup - Represent a fixed size region of bytes inside some fragment which
-  /// needs to be rewritten. This region will either be rewritten by the
-  /// assembler or cause a relocation entry to be generated.
-  struct Fixup {
-    /// Fragment - The fragment containing the fixup.
-    MCFragment *Fragment;
-    
-    /// Offset - The offset inside the fragment which needs to be rewritten.
-    uint64_t Offset;
-
-    /// Value - The expression to eventually write into the fragment.
-    const MCExpr *Value;
-
-    /// Size - The fixup size.
-    unsigned Size;
-
-    /// FixedValue - The value to replace the fix up by.
-    //
-    // FIXME: This should not be here.
-    uint64_t FixedValue;
-
-  public:
-    Fixup(MCFragment &_Fragment, uint64_t _Offset, const MCExpr &_Value,
-          unsigned _Size) 
-      : Fragment(&_Fragment), Offset(_Offset), Value(&_Value), Size(_Size),
-        FixedValue(0) {}
-  };
 
   typedef iplist<MCFragment> FragmentListType;
 
   typedef FragmentListType::const_iterator const_iterator;
   typedef FragmentListType::iterator iterator;
 
-  typedef std::vector<Fixup>::const_iterator const_fixup_iterator;
-  typedef std::vector<Fixup>::iterator fixup_iterator;
+  typedef std::vector<MCAsmFixup>::const_iterator const_fixup_iterator;
+  typedef std::vector<MCAsmFixup>::iterator fixup_iterator;
 
 private:
   iplist<MCFragment> Fragments;
@@ -347,7 +349,7 @@
   mutable unsigned LastFixupLookup;
 
   /// Fixups - The list of fixups in this section.
-  std::vector<Fixup> Fixups;
+  std::vector<MCAsmFixup> Fixups;
 
   /// HasInstructions - Whether this section has had instructions emitted into
   /// it.
@@ -385,7 +387,7 @@
   /// @name Fixup Access
   /// @{
 
-  std::vector<Fixup> &getFixups() {
+  std::vector<MCAsmFixup> &getFixups() {
     return Fixups;
   }
 
@@ -413,7 +415,8 @@
   //
   // FIXME: This isn't horribly slow in practice, but there are much nicer
   // solutions to applying the fixups.
-  const Fixup *LookupFixup(const MCFragment *Fragment, uint64_t Offset) const;
+  const MCAsmFixup *LookupFixup(const MCFragment *Fragment,
+                                uint64_t Offset) const;
 
   uint64_t getAddress() const { 
     assert(Address != ~UINT64_C(0) && "Address not set!");
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index bdc886b..682b505 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -403,7 +403,7 @@
     uint32_t Word1;
   };
   void ComputeScatteredRelocationInfo(MCAssembler &Asm,
-                                      MCSectionData::Fixup &Fixup,
+                                      MCAsmFixup &Fixup,
                                       const MCValue &Target,
                              DenseMap<const MCSymbol*,MCSymbolData*> &SymbolMap,
                                      std::vector<MachRelocationEntry> &Relocs) {
@@ -454,7 +454,7 @@
   }
 
   void ComputeRelocationInfo(MCAssembler &Asm,
-                             MCSectionData::Fixup &Fixup,
+                             MCAsmFixup &Fixup,
                              DenseMap<const MCSymbol*,MCSymbolData*> &SymbolMap,
                              std::vector<MachRelocationEntry> &Relocs) {
     MCValue Target;
@@ -912,15 +912,15 @@
     A->getSectionList().push_back(this);
 }
 
-const MCSectionData::Fixup *
-MCSectionData::LookupFixup(const MCFragment *Fragment, uint64_t Offset) const {
+const MCAsmFixup *MCSectionData::LookupFixup(const MCFragment *Fragment,
+                                             uint64_t Offset) const {
   // Use a one level cache to turn the common case of accessing the fixups in
   // order into O(1) instead of O(N).
   unsigned i = LastFixupLookup, Count = Fixups.size(), End = Fixups.size();
   if (i >= End)
     i = 0;
   while (Count--) {
-    const Fixup &F = Fixups[i];
+    const MCAsmFixup &F = Fixups[i];
     if (F.Fragment == Fragment && F.Offset == Offset) {
       LastFixupLookup = i;
       return &F;
@@ -998,8 +998,7 @@
 
       // Otherwise, add fixups for the values.
       for (uint64_t i = 0, e = FF.getCount(); i != e; ++i) {
-        MCSectionData::Fixup Fix(F, i * FF.getValueSize(),
-                                 FF.getValue(),FF.getValueSize());
+        MCAsmFixup Fix(F, i*FF.getValueSize(), FF.getValue(),FF.getValueSize());
         SD.getFixups().push_back(Fix);
       }
       break;
@@ -1107,7 +1106,7 @@
         // Find the fixup.
         //
         // FIXME: Find a better way to write in the fixes.
-        const MCSectionData::Fixup *Fixup =
+        const MCAsmFixup *Fixup =
           F.getParent()->LookupFixup(&F, i * FF.getValueSize());
         assert(Fixup && "Missing fixup for fill value!");
         Value = Fixup->FixedValue;
