diff --git a/llvm/lib/Support/SourceMgr.cpp b/llvm/lib/Support/SourceMgr.cpp
index 6232265..123531e 100644
--- a/llvm/lib/Support/SourceMgr.cpp
+++ b/llvm/lib/Support/SourceMgr.cpp
@@ -76,17 +76,17 @@
   return LineNo;
 }
 
-void SourceMgr::PrintIncludeStack(SMLoc IncludeLoc) const {
+void SourceMgr::PrintIncludeStack(SMLoc IncludeLoc, raw_ostream &OS) const {
   if (IncludeLoc == SMLoc()) return;  // Top of stack.
   
   int CurBuf = FindBufferContainingLoc(IncludeLoc);
   assert(CurBuf != -1 && "Invalid or unspecified location!");
 
-  PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc);
+  PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS);
   
-  errs() << "Included from "
-         << getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
-         << ":" << FindLineNumber(IncludeLoc, CurBuf) << ":\n";
+  OS << "Included from "
+     << getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
+     << ":" << FindLineNumber(IncludeLoc, CurBuf) << ":\n";
 }
 
 
@@ -99,19 +99,11 @@
   int CurBuf = FindBufferContainingLoc(Loc);
   assert(CurBuf != -1 && "Invalid or unspecified location!");
   
-  PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc);
+  PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS);
   
   MemoryBuffer *CurMB = getBufferInfo(CurBuf).Buffer;
   
   
-  OS << CurMB->getBufferIdentifier() << ":"
-     << FindLineNumber(Loc, CurBuf) << ": ";
-
-  if (Type)
-    OS << Type << ": ";
-
-  OS << Msg << "\n";
-  
   // Scan backward to find the start of the line.
   const char *LineStart = Loc.getPointer();
   while (LineStart != CurMB->getBufferStart() && 
@@ -122,10 +114,51 @@
   while (LineEnd != CurMB->getBufferEnd() && 
          LineEnd[0] != '\n' && LineEnd[0] != '\r')
     ++LineEnd;
+  
+  std::string PrintedMsg;
+  if (Type) {
+    PrintedMsg = Type;
+    PrintedMsg += ": ";
+  }
+  PrintedMsg += Msg;
+  
+  
   // Print out the line.
-  OS << std::string(LineStart, LineEnd) << "\n";
-  // Print out spaces before the caret.
-  for (const char *Pos = LineStart; Pos != Loc.getPointer(); ++Pos)
-    OS << (*Pos == '\t' ? '\t' : ' ');
-  OS << "^\n";
+  SMDiagnostic(CurMB->getBufferIdentifier(), FindLineNumber(Loc, CurBuf),
+               Loc.getPointer()-LineStart, PrintedMsg,
+               std::string(LineStart, LineEnd)).Print(0, OS);
+  
 }
+
+//===----------------------------------------------------------------------===//
+// SMDiagnostic Implementation
+//===----------------------------------------------------------------------===//
+
+void SMDiagnostic::Print(const char *ProgName, raw_ostream &S) {
+  if (ProgName && ProgName[0])
+    S << ProgName << ": ";
+
+  if (Filename == "-")
+    S << "<stdin>";
+  else
+    S << Filename;
+  
+  if (LineNo != -1) {
+    S << ':' << LineNo;
+    if (ColumnNo != -1)
+      S << ':' << (ColumnNo+1);
+  }
+  
+  S << ": " << Message << '\n';
+  
+  if (LineNo != -1 && ColumnNo != -1) {
+    S << LineContents << '\n';
+    
+    // Print out spaces/tabs before the caret.
+    for (unsigned i = 0; i != unsigned(ColumnNo); ++i)
+      S << (LineContents[i] == '\t' ? '\t' : ' ');
+    S << "^\n";
+  }
+}
+
+
