//===- 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();
}