diff --git a/clang/include/clang/Frontend/DiagnosticOptions.h b/clang/include/clang/Frontend/DiagnosticOptions.h
new file mode 100644
index 0000000..958a8e9
--- /dev/null
+++ b/clang/include/clang/Frontend/DiagnosticOptions.h
@@ -0,0 +1,49 @@
+//===--- DiagnosticOptions.h ------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_FRONTEND_DIAGNOSTICOPTIONS_H
+#define LLVM_CLANG_FRONTEND_DIAGNOSTICOPTIONS_H
+
+#include <string>
+#include <vector>
+
+namespace clang {
+
+/// DiagnosticOptions - Options for controlling the compiler diagnostics
+/// engine.
+class DiagnosticOptions {
+public:
+  unsigned ShowColumn : 1;       /// Show column number on diagnostics.
+  unsigned ShowLocation : 1;     /// Show source location information.
+  unsigned ShowCarets : 1;       /// Show source location information.
+  unsigned ShowFixits : 1;       /// Show fixit information.
+  unsigned ShowSourceRanges : 1; /// Show source ranges in numeric form.
+  unsigned ShowOptionNames : 1;  /// Show the diagnostic name for mappable
+                                 /// diagnostics.
+  unsigned ShowColors : 1;       /// Show diagnostics with ANSI color sequences.
+
+  /// Column limit for formatting message diagnostics, or 0 if unused.
+  unsigned MessageLength;
+
+public:
+  DiagnosticOptions() {
+    ShowColumn = 1;
+    ShowLocation = 1;
+    ShowCarets = 1;
+    ShowFixits = 1;
+    ShowSourceRanges = 0;
+    ShowOptionNames = 0;
+    ShowColors = 0;
+    MessageLength = 0;
+  }
+};
+
+}  // end namespace clang
+
+#endif
diff --git a/clang/include/clang/Frontend/TextDiagnosticPrinter.h b/clang/include/clang/Frontend/TextDiagnosticPrinter.h
index 0fd8d44..98e5a75 100644
--- a/clang/include/clang/Frontend/TextDiagnosticPrinter.h
+++ b/clang/include/clang/Frontend/TextDiagnosticPrinter.h
@@ -23,42 +23,21 @@
 }
 
 namespace clang {
-class SourceManager;
+class DiagnosticOptions;
 class LangOptions;
+class SourceManager;
 
 class TextDiagnosticPrinter : public DiagnosticClient {
   llvm::raw_ostream &OS;
   const LangOptions *LangOpts;
+  const DiagnosticOptions *DiagOpts;
+
   SourceLocation LastWarningLoc;
   FullSourceLoc LastLoc;
   bool LastCaretDiagnosticWasNote;
 
-  bool ShowColumn;
-  bool CaretDiagnostics;
-  bool ShowLocation;
-  bool PrintRangeInfo;
-  bool PrintDiagnosticOption;
-  bool PrintFixItInfo;
-  unsigned MessageLength;
-  bool UseColors;
-
 public:
-  TextDiagnosticPrinter(llvm::raw_ostream &os,
-                        bool showColumn = true,
-                        bool caretDiagnistics = true, bool showLocation = true,
-                        bool printRangeInfo = true,
-                        bool printDiagnosticOption = true,
-                        bool printFixItInfo = true,
-                        unsigned messageLength = 0,
-                        bool useColors = false)
-    : OS(os), LangOpts(0),
-      LastCaretDiagnosticWasNote(false), ShowColumn(showColumn),
-      CaretDiagnostics(caretDiagnistics), ShowLocation(showLocation),
-      PrintRangeInfo(printRangeInfo),
-      PrintDiagnosticOption(printDiagnosticOption),
-      PrintFixItInfo(printFixItInfo),
-      MessageLength(messageLength),
-      UseColors(useColors) {}
+  TextDiagnosticPrinter(llvm::raw_ostream &os, const DiagnosticOptions &diags);
 
   void setLangOptions(const LangOptions *LO) {
     LangOpts = LO;
diff --git a/clang/lib/Frontend/TextDiagnosticPrinter.cpp b/clang/lib/Frontend/TextDiagnosticPrinter.cpp
index 14769c1..b1d8800 100644
--- a/clang/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/clang/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -13,6 +13,7 @@
 
 #include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Lex/Lexer.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/raw_ostream.h"
@@ -37,6 +38,12 @@
 /// \brief Number of spaces to indent when word-wrapping.
 const unsigned WordWrapIndentation = 6;
 
+TextDiagnosticPrinter::TextDiagnosticPrinter(llvm::raw_ostream &os,
+                                             const DiagnosticOptions &diags)
+  : OS(os), LangOpts(0), DiagOpts(&diags),
+    LastCaretDiagnosticWasNote(false) {
+}
+
 void TextDiagnosticPrinter::
 PrintIncludeStack(SourceLocation Loc, const SourceManager &SM) {
   if (Loc.isInvalid()) return;
@@ -46,7 +53,7 @@
   // Print out the other include frames first.
   PrintIncludeStack(PLoc.getIncludeLoc(), SM);
 
-  if (ShowLocation)
+  if (DiagOpts->ShowLocation)
     OS << "In file included from " << PLoc.getFilename()
        << ':' << PLoc.getLine() << ":\n";
   else
@@ -281,13 +288,13 @@
       Ranges[i] = SourceRange(S, E);
     }
 
-    if (ShowLocation) {
+    if (DiagOpts->ShowLocation) {
       std::pair<FileID, unsigned> IInfo = SM.getDecomposedInstantiationLoc(Loc);
 
       // Emit the file/line/column that this expansion came from.
       OS << SM.getBuffer(IInfo.first)->getBufferIdentifier() << ':'
          << SM.getLineNumber(IInfo.first, IInfo.second) << ':';
-      if (ShowColumn)
+      if (DiagOpts->ShowColumn)
         OS << SM.getColumnNumber(IInfo.first, IInfo.second) << ':';
       OS << ' ';
     }
@@ -370,13 +377,13 @@
   // produce easily machine parsable output.  Add a space before the source line
   // and the caret to make it trivial to tell the main diagnostic line from what
   // the user is intended to see.
-  if (PrintRangeInfo) {
+  if (DiagOpts->ShowSourceRanges) {
     SourceLine = ' ' + SourceLine;
     CaretLine = ' ' + CaretLine;
   }
 
   std::string FixItInsertionLine;
-  if (NumHints && PrintFixItInfo) {
+  if (NumHints && DiagOpts->ShowFixits) {
     for (const CodeModificationHint *Hint = Hints, *LastHint = Hints + NumHints;
          Hint != LastHint; ++Hint) {
       if (Hint->InsertionLoc.isValid()) {
@@ -417,20 +424,20 @@
   // Emit what we have computed.
   OS << SourceLine << '\n';
 
-  if (UseColors)
+  if (DiagOpts->ShowColors)
     OS.changeColor(caretColor, true);
   OS << CaretLine << '\n';
-  if (UseColors)
+  if (DiagOpts->ShowColors)
     OS.resetColor();
 
   if (!FixItInsertionLine.empty()) {
-    if (UseColors)
+    if (DiagOpts->ShowColors)
       // Print fixit line in color
       OS.changeColor(fixitColor, false);
-    if (PrintRangeInfo)
+    if (DiagOpts->ShowSourceRanges)
       OS << ' ';
     OS << FixItInsertionLine << '\n';
-    if (UseColors)
+    if (DiagOpts->ShowColors)
       OS.resetColor();
   }
 }
@@ -627,15 +634,15 @@
     }
 
     // Compute the column number.
-    if (ShowLocation) {
-      if (UseColors)
+    if (DiagOpts->ShowLocation) {
+      if (DiagOpts->ShowColors)
         OS.changeColor(savedColor, true);
       OS << PLoc.getFilename() << ':' << LineNo << ':';
-      if (ShowColumn)
+      if (DiagOpts->ShowColumn)
         if (unsigned ColNo = PLoc.getColumn())
           OS << ColNo << ':';
 
-      if (PrintRangeInfo && Info.getNumRanges()) {
+      if (DiagOpts->ShowSourceRanges && Info.getNumRanges()) {
         FileID CaretFileID =
           SM.getFileID(SM.getInstantiationLoc(Info.getLocation()));
         bool PrintedRange = false;
@@ -679,12 +686,12 @@
           OS << ':';
       }
       OS << ' ';
-      if (UseColors)
+      if (DiagOpts->ShowColors)
         OS.resetColor();
     }
   }
 
-  if (UseColors) {
+  if (DiagOpts->ShowColors) {
     // Print diagnostic category in bold and color
     switch (Level) {
     case Diagnostic::Ignored: assert(0 && "Invalid diagnostic type");
@@ -703,20 +710,20 @@
   case Diagnostic::Fatal:   OS << "fatal error: "; break;
   }
 
-  if (UseColors)
+  if (DiagOpts->ShowColors)
     OS.resetColor();
 
   llvm::SmallString<100> OutStr;
   Info.FormatDiagnostic(OutStr);
 
-  if (PrintDiagnosticOption)
+  if (DiagOpts->ShowOptionNames)
     if (const char *Opt = Diagnostic::getWarningOptionForDiag(Info.getID())) {
       OutStr += " [-W";
       OutStr += Opt;
       OutStr += ']';
     }
 
-  if (UseColors) {
+  if (DiagOpts->ShowColors) {
     // Print warnings, errors and fatal errors in bold, no color
     switch (Level) {
     case Diagnostic::Warning: OS.changeColor(savedColor, true); break;
@@ -726,17 +733,17 @@
     }
   }
 
-  if (MessageLength) {
+  if (DiagOpts->MessageLength) {
     // We will be word-wrapping the error message, so compute the
     // column number where we currently are (after printing the
     // location information).
     unsigned Column = OS.tell() - StartOfLocationInfo;
-    PrintWordWrapped(OS, OutStr, MessageLength, Column);
+    PrintWordWrapped(OS, OutStr, DiagOpts->MessageLength, Column);
   } else {
     OS.write(OutStr.begin(), OutStr.size());
   }
   OS << '\n';
-  if (UseColors)
+  if (DiagOpts->ShowColors)
     OS.resetColor();
 
   // If caret diagnostics are enabled and we have location, we want to
@@ -745,7 +752,7 @@
   // was part of a different warning or error diagnostic, or if the
   // diagnostic has ranges.  We don't want to emit the same caret
   // multiple times if one loc has multiple diagnostics.
-  if (CaretDiagnostics && Info.getLocation().isValid() &&
+  if (DiagOpts->ShowCarets && Info.getLocation().isValid() &&
       ((LastLoc != Info.getLocation()) || Info.getNumRanges() ||
        (LastCaretDiagnosticWasNote && Level != Diagnostic::Note) ||
        Info.getNumCodeModificationHints())) {
@@ -772,7 +779,7 @@
     EmitCaretDiagnostic(LastLoc, Ranges, NumRanges, LastLoc.getManager(),
                         Info.getCodeModificationHints(),
                         Info.getNumCodeModificationHints(),
-                        MessageLength);
+                        DiagOpts->MessageLength);
   }
 
   OS.flush();
diff --git a/clang/tools/clang-cc/clang-cc.cpp b/clang/tools/clang-cc/clang-cc.cpp
index 1a3b830..6b84c73 100644
--- a/clang/tools/clang-cc/clang-cc.cpp
+++ b/clang/tools/clang-cc/clang-cc.cpp
@@ -26,6 +26,7 @@
 #include "clang/Frontend/ASTConsumers.h"
 #include "clang/Frontend/ASTUnit.h"
 #include "clang/Frontend/CompileOptions.h"
+#include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Frontend/FixItRewriter.h"
 #include "clang/Frontend/FrontendDiagnostic.h"
 #include "clang/Frontend/InitHeaderSearch.h"
@@ -238,6 +239,8 @@
 // Diagnostic Options
 //===----------------------------------------------------------------------===//
 
+static DiagnosticOptions DiagOpts;
+
 static llvm::cl::opt<bool>
 VerifyDiagnostics("verify",
                   llvm::cl::desc("Verify emitted diagnostics and warnings"));
@@ -1566,14 +1569,7 @@
     // Output diags both where requested...
     Chain1.reset(Normal);
     // .. and to our log file.
-    Chain2.reset(new TextDiagnosticPrinter(*BuildLogFile,
-                                           !NoShowColumn,
-                                           !NoCaretDiagnostics,
-                                           !NoShowLocation,
-                                           PrintSourceRangeInfo,
-                                           PrintDiagnosticOption,
-                                           !NoDiagnosticsFixIt,
-                                           MessageLength));
+    Chain2.reset(new TextDiagnosticPrinter(*BuildLogFile, DiagOpts));
   }
 
   virtual void setLangOptions(const LangOptions *LO) {
@@ -2157,6 +2153,23 @@
   if (InputFilenames.empty())
     InputFilenames.push_back("-");
 
+  // If -fmessage-length=N was not specified, determine whether this
+  // is a terminal and, if so, implicitly define -fmessage-length
+  // appropriately.
+  if (MessageLength.getNumOccurrences() == 0)
+    MessageLength.setValue(llvm::sys::Process::StandardErrColumns());
+
+  // Initialize the diagnostic options.
+  DiagOpts.ShowColumn = !NoShowColumn;
+  DiagOpts.ShowLocation = !NoShowLocation;
+  DiagOpts.ShowCarets = !NoCaretDiagnostics;
+  DiagOpts.ShowFixits = !NoDiagnosticsFixIt;
+  DiagOpts.ShowSourceRanges = PrintSourceRangeInfo;
+  DiagOpts.ShowOptionNames = PrintDiagnosticOption;
+  DiagOpts.ShowColors = (!NoColorDiagnostic &&
+                         llvm::sys::Process::StandardErrHasColors());
+  DiagOpts.MessageLength = MessageLength;
+
   // Create the diagnostic client for reporting errors or for
   // implementing -verify.
   llvm::OwningPtr<DiagnosticClient> DiagClient;
@@ -2173,26 +2186,7 @@
     }
   } else if (HTMLDiag.empty()) {
     // Print diagnostics to stderr by default.
-
-    // If -fmessage-length=N was not specified, determine whether this
-    // is a terminal and, if so, implicitly define -fmessage-length
-    // appropriately.
-    if (MessageLength.getNumOccurrences() == 0)
-      MessageLength.setValue(llvm::sys::Process::StandardErrColumns());
-
-    // Disable color diagnostics if not supported on stderr.
-    if (!NoColorDiagnostic && !llvm::sys::Process::StandardErrHasColors())
-      NoColorDiagnostic.setValue(true);
-
-    DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(),
-                                               !NoShowColumn,
-                                               !NoCaretDiagnostics,
-                                               !NoShowLocation,
-                                               PrintSourceRangeInfo,
-                                               PrintDiagnosticOption,
-                                               !NoDiagnosticsFixIt,
-                                               MessageLength,
-                                               !NoColorDiagnostic));
+    DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), DiagOpts));
   } else {
     DiagClient.reset(CreateHTMLDiagnosticClient(HTMLDiag));
   }
