| //===- MsgHandling.cpp ----------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <mcld/LD/DiagnosticEngine.h> |
| #include <mcld/LD/DiagnosticLineInfo.h> |
| #include <mcld/LD/DiagnosticPrinter.h> |
| #include <mcld/LD/TextDiagnosticPrinter.h> |
| #include <mcld/LD/MsgHandler.h> |
| #include <mcld/Support/MsgHandling.h> |
| #include <mcld/Support/raw_ostream.h> |
| |
| #include <llvm/Support/ManagedStatic.h> |
| #include <llvm/Support/raw_ostream.h> |
| #include <llvm/Support/Signals.h> |
| |
| #include <cstdlib> |
| |
| using namespace mcld; |
| |
| //===----------------------------------------------------------------------===// |
| // static variables |
| //===----------------------------------------------------------------------===// |
| static llvm::ManagedStatic<DiagnosticEngine> g_pEngine; |
| |
| void |
| mcld::InitializeDiagnosticEngine(const mcld::LinkerConfig& pConfig, |
| DiagnosticPrinter* pPrinter) |
| { |
| g_pEngine->reset(pConfig); |
| if (NULL != pPrinter) |
| g_pEngine->setPrinter(*pPrinter, false); |
| else { |
| DiagnosticPrinter* printer = new TextDiagnosticPrinter(mcld::errs(), pConfig); |
| g_pEngine->setPrinter(*printer, true); |
| } |
| } |
| |
| DiagnosticEngine& mcld::getDiagnosticEngine() |
| { |
| return *g_pEngine; |
| } |
| |
| bool mcld::Diagnose() |
| { |
| if (g_pEngine->getPrinter()->getNumErrors() > 0) { |
| // If we reached here, we are failing ungracefully. Run the interrupt handlers |
| // to make sure any special cleanups get done, in particular that we remove |
| // files registered with RemoveFileOnSignal. |
| llvm::sys::RunInterruptHandlers(); |
| g_pEngine->getPrinter()->finish(); |
| return false; |
| } |
| return true; |
| } |
| |
| void mcld::FinalizeDiagnosticEngine() |
| { |
| g_pEngine->getPrinter()->finish(); |
| } |
| |