//===- 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/MsgHandler.h" #include "mcld/LD/TextDiagnosticPrinter.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> namespace mcld { //===----------------------------------------------------------------------===// // static variables //===----------------------------------------------------------------------===// static llvm::ManagedStatic<DiagnosticEngine> g_pEngine; void InitializeDiagnosticEngine(const LinkerConfig& pConfig, DiagnosticPrinter* pPrinter) { g_pEngine->reset(pConfig); if (pPrinter != NULL) g_pEngine->setPrinter(*pPrinter, false); else { DiagnosticPrinter* printer = new TextDiagnosticPrinter(errs(), pConfig); g_pEngine->setPrinter(*printer, true); } } DiagnosticEngine& getDiagnosticEngine() { return *g_pEngine; } bool 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 FinalizeDiagnosticEngine() { g_pEngine->getPrinter()->finish(); } } // namespace mcld