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