blob: fdcf13f66e77006a3fea33ff877e4ced22bbd0a6 [file] [log] [blame]
Zonr Changaffc1502012-07-16 14:28:23 +08001//===- MsgHandling.cpp ----------------------------------------------------===//
2//
3// The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include <mcld/LD/DiagnosticEngine.h>
10#include <mcld/LD/DiagnosticLineInfo.h>
11#include <mcld/LD/DiagnosticPrinter.h>
Shih-wei Liao22add6f2012-12-15 17:21:00 -080012#include <mcld/LD/TextDiagnosticPrinter.h>
Zonr Changaffc1502012-07-16 14:28:23 +080013#include <mcld/LD/MsgHandler.h>
14#include <mcld/Support/MsgHandling.h>
Shih-wei Liao22add6f2012-12-15 17:21:00 -080015#include <mcld/Support/raw_ostream.h>
16
Zonr Changaffc1502012-07-16 14:28:23 +080017#include <llvm/Support/ManagedStatic.h>
18#include <llvm/Support/raw_ostream.h>
Shih-wei Liao22add6f2012-12-15 17:21:00 -080019#include <llvm/Support/Signals.h>
20
21#include <cstdlib>
Zonr Changaffc1502012-07-16 14:28:23 +080022
23using namespace mcld;
24
25//===----------------------------------------------------------------------===//
Shih-wei Liao67e37f12012-07-27 03:50:34 -070026// static variables
27//===----------------------------------------------------------------------===//
28static llvm::ManagedStatic<DiagnosticEngine> g_pEngine;
29
30void
Shih-wei Liao22add6f2012-12-15 17:21:00 -080031mcld::InitializeDiagnosticEngine(const mcld::LinkerConfig& pConfig,
Shih-wei Liao67e37f12012-07-27 03:50:34 -070032 DiagnosticPrinter* pPrinter)
Zonr Changaffc1502012-07-16 14:28:23 +080033{
Shih-wei Liao22add6f2012-12-15 17:21:00 -080034 g_pEngine->reset(pConfig);
Shih-wei Liao67e37f12012-07-27 03:50:34 -070035 if (NULL != pPrinter)
36 g_pEngine->setPrinter(*pPrinter, false);
37 else {
Shih-wei Liao22add6f2012-12-15 17:21:00 -080038 DiagnosticPrinter* printer = new TextDiagnosticPrinter(mcld::errs(), pConfig);
Shih-wei Liao67e37f12012-07-27 03:50:34 -070039 g_pEngine->setPrinter(*printer, true);
Zonr Changaffc1502012-07-16 14:28:23 +080040 }
41}
42
43DiagnosticEngine& mcld::getDiagnosticEngine()
44{
Shih-wei Liao67e37f12012-07-27 03:50:34 -070045 return *g_pEngine;
Zonr Changaffc1502012-07-16 14:28:23 +080046}
47
Shih-wei Liao22add6f2012-12-15 17:21:00 -080048bool mcld::Diagnose()
49{
50 if (g_pEngine->getPrinter()->getNumErrors() > 0) {
51 // If we reached here, we are failing ungracefully. Run the interrupt handlers
52 // to make sure any special cleanups get done, in particular that we remove
53 // files registered with RemoveFileOnSignal.
54 llvm::sys::RunInterruptHandlers();
55 g_pEngine->getPrinter()->finish();
56 return false;
57 }
58 return true;
59}
60
61void mcld::FinalizeDiagnosticEngine()
62{
63 g_pEngine->getPrinter()->finish();
64}
65