diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp
index 147581a..f80e6e8 100755
--- a/lib/Target/X86/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/X86ATTAsmPrinter.cpp
@@ -92,7 +92,7 @@
   // Populate function information map.  Actually, We don't want to populate
   // non-stdcall or non-fastcall functions' information right now.
   if (CC == CallingConv::X86_StdCall || CC == CallingConv::X86_FastCall)
-    FunctionInfoMap[F] = *MF.getInfo<X86FunctionInfo>();
+    FunctionInfoMap[F] = *MF.getInfo<X86MachineFunctionInfo>();
 
   X86SharedAsmPrinter::decorateName(CurrentFnName, F);
 
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index 454bd86..bc103d7 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -32,9 +32,9 @@
 #include "llvm/Target/TargetOptions.h"
 using namespace llvm;
 
-static X86FunctionInfo calculateFunctionInfo(const Function *F,
-                                             const TargetData *TD) {
-  X86FunctionInfo Info;
+static X86MachineFunctionInfo calculateFunctionInfo(const Function *F,
+                                                    const TargetData *TD) {
+  X86MachineFunctionInfo Info;
   uint64_t Size = 0;
   
   switch (F->getCallingConv()) {
@@ -77,7 +77,7 @@
     
   FMFInfoMap::const_iterator info_item = FunctionInfoMap.find(F);
 
-  const X86FunctionInfo *Info;
+  const X86MachineFunctionInfo *Info;
   if (info_item == FunctionInfoMap.end()) {
     // Calculate apropriate function info and populate map
     FunctionInfoMap[F] = calculateFunctionInfo(F, TM.getTargetData());
diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h
index abbedf2..45be89e 100755
--- a/lib/Target/X86/X86AsmPrinter.h
+++ b/lib/Target/X86/X86AsmPrinter.h
@@ -48,7 +48,7 @@
   //
   // This structure is using e.g. for name decoration for stdcall & fastcall'ed
   // function, since we have to use arguments' size for decoration.
-  typedef std::map<const Function*, X86FunctionInfo> FMFInfoMap;
+  typedef std::map<const Function*, X86MachineFunctionInfo> FMFInfoMap;
   FMFInfoMap FunctionInfoMap;
 
   void decorateName(std::string& Name, const GlobalValue* GV);
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 209b17a..c6bdc2e 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -729,7 +729,8 @@
   RegSaveFrameIndex = 0xAAAAAAA;  // X86-64 only.
   ReturnAddrIndex = 0;            // No return address slot generated yet.
 
-  MF.getInfo<X86FunctionInfo>()->setBytesToPopOnReturn(BytesToPopOnReturn);
+  MF.getInfo<X86MachineFunctionInfo>()
+    ->setBytesToPopOnReturn(BytesToPopOnReturn);
 
   // Return the new list of results.
   return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(),
@@ -973,7 +974,8 @@
   BytesToPopOnReturn = StackSize;  // Callee pops all stack arguments.
   BytesCallerReserves = 0;
 
-  MF.getInfo<X86FunctionInfo>()->setBytesToPopOnReturn(BytesToPopOnReturn);
+  MF.getInfo<X86MachineFunctionInfo>()
+    ->setBytesToPopOnReturn(BytesToPopOnReturn);
 
   // Return the new list of results.
   return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(),
@@ -3441,7 +3443,7 @@
   if (Fn->hasExternalLinkage() &&
       Subtarget->isTargetCygMing() &&
       Fn->getName() == "main")
-    MF.getInfo<X86FunctionInfo>()->setForceFramePointer(true);
+    MF.getInfo<X86MachineFunctionInfo>()->setForceFramePointer(true);
 
   unsigned CC = cast<ConstantSDNode>(Op.getOperand(1))->getValue();
   if (Subtarget->is64Bit())
@@ -3457,10 +3459,10 @@
     case CallingConv::C:
       return LowerCCCArguments(Op, DAG);
     case CallingConv::X86_StdCall:
-      MF.getInfo<X86FunctionInfo>()->setDecorationStyle(StdCall);
+      MF.getInfo<X86MachineFunctionInfo>()->setDecorationStyle(StdCall);
       return LowerCCCArguments(Op, DAG, true);
     case CallingConv::X86_FastCall:
-      MF.getInfo<X86FunctionInfo>()->setDecorationStyle(FastCall);
+      MF.getInfo<X86MachineFunctionInfo>()->setDecorationStyle(FastCall);
       return LowerFastCCArguments(Op, DAG);
     }
 }
diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp
index 946840e..39b65ee 100755
--- a/lib/Target/X86/X86IntelAsmPrinter.cpp
+++ b/lib/Target/X86/X86IntelAsmPrinter.cpp
@@ -51,7 +51,7 @@
   // Populate function information map.  Actually, We don't want to populate
   // non-stdcall or non-fastcall functions' information right now.
   if (CC == CallingConv::X86_StdCall || CC == CallingConv::X86_FastCall)
-    FunctionInfoMap[F] = *MF.getInfo<X86FunctionInfo>();
+    FunctionInfoMap[F] = *MF.getInfo<X86MachineFunctionInfo>();
 
   X86SharedAsmPrinter::decorateName(CurrentFnName, F);
 
diff --git a/lib/Target/X86/X86MachineFunctionInfo.h b/lib/Target/X86/X86MachineFunctionInfo.h
index 4ec3ba3..b8cf1c4 100644
--- a/lib/Target/X86/X86MachineFunctionInfo.h
+++ b/lib/Target/X86/X86MachineFunctionInfo.h
@@ -24,9 +24,9 @@
   FastCall
 };
   
-/// X86FunctionInfo - This class is derived from MachineFunction private
+/// X86MachineFunctionInfo - This class is derived from MachineFunction private
 /// X86 target-specific information for each MachineFunction.
-class X86FunctionInfo : public MachineFunctionInfo {
+class X86MachineFunctionInfo : public MachineFunctionInfo {
   /// ForceFramePointer - True if the function is required to use of frame
   /// pointer for reasons other than it containing dynamic allocation or 
   /// that FP eliminatation is turned off. For example, Cygwin main function
@@ -42,13 +42,13 @@
   NameDecorationStyle DecorationStyle;
   
 public:
-  X86FunctionInfo() : ForceFramePointer(false),
-                      BytesToPopOnReturn(0),
-                      DecorationStyle(None) {}
+  X86MachineFunctionInfo() : ForceFramePointer(false),
+                             BytesToPopOnReturn(0),
+                             DecorationStyle(None) {}
   
-  X86FunctionInfo(MachineFunction &MF) : ForceFramePointer(false),
-                                         BytesToPopOnReturn(0),
-                                         DecorationStyle(None) {}
+  X86MachineFunctionInfo(MachineFunction &MF) : ForceFramePointer(false),
+                                                BytesToPopOnReturn(0),
+                                                DecorationStyle(None) {}
   
   bool getForceFramePointer() const { return ForceFramePointer;} 
   void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; }
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp
index cd2a0d4..709d205 100644
--- a/lib/Target/X86/X86RegisterInfo.cpp
+++ b/lib/Target/X86/X86RegisterInfo.cpp
@@ -927,7 +927,7 @@
 bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
   return (NoFramePointerElim || 
           MF.getFrameInfo()->hasVarSizedObjects() ||
-          MF.getInfo<X86FunctionInfo>()->getForceFramePointer());
+          MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer());
 }
 
 void X86RegisterInfo::
