1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- MsgHandling.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/DiagnosticEngine.h>
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/DiagnosticLineInfo.h>
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/DiagnosticPrinter.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/TextDiagnosticPrinter.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/MsgHandler.h>
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/raw_ostream.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/ManagedStatic.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/raw_ostream.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Signals.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cstdlib>
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld;
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
2667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao// static variables
2767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao//===----------------------------------------------------------------------===//
2867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaostatic llvm::ManagedStatic<DiagnosticEngine> g_pEngine;
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaomcld::InitializeDiagnosticEngine(const mcld::LinkerConfig& pConfig,
3267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao                                 DiagnosticPrinter* pPrinter)
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_pEngine->reset(pConfig);
3567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (NULL != pPrinter)
3667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    g_pEngine->setPrinter(*pPrinter, false);
3767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  else {
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    DiagnosticPrinter* printer = new TextDiagnosticPrinter(mcld::errs(), pConfig);
3967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    g_pEngine->setPrinter(*printer, true);
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
43affc150dc44fab1911775a49636d0ce85333b634Zonr ChangDiagnosticEngine& mcld::getDiagnosticEngine()
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
4567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return *g_pEngine;
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool mcld::Diagnose()
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (g_pEngine->getPrinter()->getNumErrors() > 0) {
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // If we reached here, we are failing ungracefully. Run the interrupt handlers
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // to make sure any special cleanups get done, in particular that we remove
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // files registered with RemoveFileOnSignal.
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    llvm::sys::RunInterruptHandlers();
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    g_pEngine->getPrinter()->finish();
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return false;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid mcld::FinalizeDiagnosticEngine()
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_pEngine->getPrinter()->finish();
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
66