diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp
index d0501c9..f50c684 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp
@@ -26,13 +26,13 @@
 #include "llvm/Support/ErrorHandling.h"
 using namespace llvm;
 
-Dwarf::Dwarf(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T,
-             const char *flavor)
+DwarfPrinter::DwarfPrinter(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T,
+                           const char *flavor)
 : O(OS), Asm(A), MAI(T), TD(Asm->TM.getTargetData()),
   RI(Asm->TM.getRegisterInfo()), M(NULL), MF(NULL), MMI(NULL),
   SubprogramCount(0), Flavor(flavor), SetCounter(1) {}
 
-void Dwarf::PrintRelDirective(bool Force32Bit, bool isInSection) const {
+void DwarfPrinter::PrintRelDirective(bool Force32Bit, bool isInSection) const {
   if (isInSection && MAI->getDwarfSectionOffsetDirective())
     O << MAI->getDwarfSectionOffsetDirective();
   else if (Force32Bit || TD->getPointerSize() == sizeof(int32_t))
@@ -43,12 +43,12 @@
 
 /// PrintLabelName - Print label name in form used by Dwarf writer.
 ///
-void Dwarf::PrintLabelName(const char *Tag, unsigned Number) const {
+void DwarfPrinter::PrintLabelName(const char *Tag, unsigned Number) const {
   O << MAI->getPrivateGlobalPrefix() << Tag;
   if (Number) O << Number;
 }
-void Dwarf::PrintLabelName(const char *Tag, unsigned Number,
-                           const char *Suffix) const {
+void DwarfPrinter::PrintLabelName(const char *Tag, unsigned Number,
+                                  const char *Suffix) const {
   O << MAI->getPrivateGlobalPrefix() << Tag;
   if (Number) O << Number;
   O << Suffix;
@@ -56,28 +56,28 @@
 
 /// EmitLabel - Emit location label for internal use by Dwarf.
 ///
-void Dwarf::EmitLabel(const char *Tag, unsigned Number) const {
+void DwarfPrinter::EmitLabel(const char *Tag, unsigned Number) const {
   PrintLabelName(Tag, Number);
   O << ":\n";
 }
 
 /// EmitReference - Emit a reference to a label.
 ///
-void Dwarf::EmitReference(const char *Tag, unsigned Number,
-                          bool IsPCRelative, bool Force32Bit) const {
+void DwarfPrinter::EmitReference(const char *Tag, unsigned Number,
+                                 bool IsPCRelative, bool Force32Bit) const {
   PrintRelDirective(Force32Bit);
   PrintLabelName(Tag, Number);
   if (IsPCRelative) O << "-" << MAI->getPCSymbol();
 }
-void Dwarf::EmitReference(const std::string &Name, bool IsPCRelative,
-                          bool Force32Bit) const {
+void DwarfPrinter::EmitReference(const std::string &Name, bool IsPCRelative,
+                                 bool Force32Bit) const {
   PrintRelDirective(Force32Bit);
   O << Name;
   if (IsPCRelative) O << "-" << MAI->getPCSymbol();
 }
 
-void Dwarf::EmitReference(const MCSymbol *Sym, bool IsPCRelative,
-                          bool Force32Bit) const {
+void DwarfPrinter::EmitReference(const MCSymbol *Sym, bool IsPCRelative,
+                                 bool Force32Bit) const {
   PrintRelDirective(Force32Bit);
   O << *Sym;
   if (IsPCRelative) O << "-" << MAI->getPCSymbol();
@@ -86,9 +86,9 @@
 /// EmitDifference - Emit the difference between two labels.  Some assemblers do
 /// not behave with absolute expressions with data directives, so there is an
 /// option (needsSet) to use an intermediary set expression.
-void Dwarf::EmitDifference(const char *TagHi, unsigned NumberHi,
-                           const char *TagLo, unsigned NumberLo,
-                           bool IsSmall) {
+void DwarfPrinter::EmitDifference(const char *TagHi, unsigned NumberHi,
+                                  const char *TagLo, unsigned NumberLo,
+                                  bool IsSmall) {
   if (MAI->needsSet()) {
     O << "\t.set\t";
     PrintLabelName("set", SetCounter, Flavor);
@@ -109,10 +109,11 @@
   }
 }
 
-void Dwarf::EmitSectionOffset(const char* Label, const char* Section,
-                              unsigned LabelNumber, unsigned SectionNumber,
-                              bool IsSmall, bool isEH,
-                              bool useSet) {
+void DwarfPrinter::EmitSectionOffset(const char* Label, const char* Section,
+                                     unsigned LabelNumber,
+                                     unsigned SectionNumber,
+                                     bool IsSmall, bool isEH,
+                                     bool useSet) {
   bool printAbsolute = false;
   if (isEH)
     printAbsolute = MAI->isAbsoluteEHSectionOffsets();
@@ -147,8 +148,9 @@
 
 /// EmitFrameMoves - Emit frame instructions to describe the layout of the
 /// frame.
-void Dwarf::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
-                           const std::vector<MachineMove> &Moves, bool isEH) {
+void DwarfPrinter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
+                                  const std::vector<MachineMove> &Moves,
+                                  bool isEH) {
   int stackGrowth =
     Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
     TargetFrameInfo::StackGrowsUp ?
