1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- TextDiagnosticPrinter.cpp ------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/TextDiagnosticPrinter.h>
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDInfo.h>
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/Signals.h>
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <string>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld;
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
16affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors UnreachableColor = llvm::raw_ostream::RED;
17affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors FatalColor       = llvm::raw_ostream::YELLOW;
18affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors ErrorColor       = llvm::raw_ostream::RED;
19affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors WarningColor     = llvm::raw_ostream::MAGENTA;
20affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors DebugColor       = llvm::raw_ostream::CYAN;
21affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors NoteColor        = llvm::raw_ostream::GREEN;
22affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors IgnoreColor      = llvm::raw_ostream::BLUE;
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Used for changing only the bold attribute.
25affc150dc44fab1911775a49636d0ce85333b634Zonr Changstatic const enum llvm::raw_ostream::Colors SavedColor = llvm::raw_ostream::SAVEDCOLOR;
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// TextDiagnosticPrinter
29affc150dc44fab1911775a49636d0ce85333b634Zonr ChangTextDiagnosticPrinter::TextDiagnosticPrinter(llvm::raw_ostream& pOStream,
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                             const MCLDInfo& pLDInfo)
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  : m_OStream(pOStream), m_LDInfo(pLDInfo), m_pInput(NULL) {
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
34affc150dc44fab1911775a49636d0ce85333b634Zonr ChangTextDiagnosticPrinter::~TextDiagnosticPrinter()
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// HandleDiagnostic - Handle this diagnostic, reporting it to the user or
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// capturing it to a log as needed.
40affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid
41affc150dc44fab1911775a49636d0ce85333b634Zonr ChangTextDiagnosticPrinter::handleDiagnostic(DiagnosticEngine::Severity pSeverity,
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                        const Diagnostic& pInfo)
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticPrinter::handleDiagnostic(pSeverity, pInfo);
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  std::string out_string;
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pInfo.format(out_string);
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  switch (pSeverity) {
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Unreachable: {
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.changeColor(UnreachableColor, true);
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << "Unreachable: ";
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.resetColor();
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << out_string << "\n";
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Fatal: {
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.changeColor(FatalColor, true);
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << "Fatal: ";
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.resetColor();
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << out_string << "\n";
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Error: {
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.changeColor(ErrorColor, true);
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << "Error: ";
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.resetColor();
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << out_string << "\n";
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Warning: {
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.changeColor(WarningColor, true);
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << "Warning: ";
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.resetColor();
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << out_string << "\n";
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Debug: {
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      // show debug message only if verbose >= 0
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      if (0 <= m_LDInfo.options().verbose()) {
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.changeColor(DebugColor, true);
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "Debug: ";
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.resetColor();
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << out_string << "\n";
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Note: {
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      // show ignored message only if verbose >= 1
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      if (1 <= m_LDInfo.options().verbose()) {
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.changeColor(NoteColor, true);
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "Note: ";
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.resetColor();
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << out_string << "\n";
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Ignore: {
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      // show ignored message only if verbose >= 2
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      if (2 <= m_LDInfo.options().verbose()) {
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.changeColor(IgnoreColor, true);
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "Ignore: ";
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.resetColor();
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << out_string << "\n";
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    default:
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  switch (pSeverity) {
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Unreachable: {
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << "\n\n";
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.changeColor(llvm::raw_ostream::YELLOW);
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream << "You encounter a bug of MCLinker, please report to:\n"
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                << "  mclinker@googlegroups.com\n";
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_OStream.resetColor();
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    /** fall through **/
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Fatal: {
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      // If we reached here, we are failing ungracefully. Run the interrupt handlers
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      // to make sure any special cleanups get done, in particular that we remove
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      // files registered with RemoveFileOnSignal.
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      llvm::sys::RunInterruptHandlers();
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      exit(1);
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Error: {
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      int16_t error_limit = m_LDInfo.options().maxErrorNum();
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      if ((error_limit != -1) &&
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang          (getNumErrors() > static_cast<unsigned>(error_limit))) {
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "\n\n";
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.changeColor(llvm::raw_ostream::YELLOW);
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "too many error messages (>" << error_limit << ")...\n";
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.resetColor();
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        llvm::sys::RunInterruptHandlers();
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        exit(1);
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case DiagnosticEngine::Warning: {
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      int16_t warning_limit = m_LDInfo.options().maxWarnNum();
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      if ((warning_limit != -1) &&
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang          (getNumWarnings() > static_cast<unsigned>(warning_limit))) {
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "\n\n";
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.changeColor(llvm::raw_ostream::YELLOW);
148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream << "too many warning messages (>" << warning_limit << ")...\n";
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        m_OStream.resetColor();
150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        llvm::sys::RunInterruptHandlers();
151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        exit(1);
152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
154affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    default:
155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
156affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
157affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
159affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid TextDiagnosticPrinter::beginInput(const Input& pInput, const MCLDInfo& pLDInfo)
160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
161affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_pInput = &pInput;
162affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
164affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid TextDiagnosticPrinter::endInput()
165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_pInput = NULL;
167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
168