1//===- DiagnosticEngine.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/DiagnosticPrinter.h>
11#include <mcld/LD/DiagnosticLineInfo.h>
12#include <mcld/LD/MsgHandler.h>
13#include <mcld/LinkerConfig.h>
14
15#include <cassert>
16
17using namespace mcld;
18
19//===----------------------------------------------------------------------===//
20// DiagnosticEngine
21//===----------------------------------------------------------------------===//
22DiagnosticEngine::DiagnosticEngine()
23  : m_pConfig(NULL), m_pLineInfo(NULL), m_pPrinter(NULL),
24    m_pInfoMap(NULL), m_OwnPrinter(false) {
25}
26
27DiagnosticEngine::~DiagnosticEngine()
28{
29  if (m_OwnPrinter && m_pPrinter != NULL)
30    delete m_pPrinter;
31
32  delete m_pInfoMap;
33
34  // FIXME: design the destructive relation of LineInfo.
35  delete m_pLineInfo;
36}
37
38void DiagnosticEngine::reset(const LinkerConfig& pConfig)
39{
40  m_pConfig = &pConfig;
41  delete m_pInfoMap;
42  m_pInfoMap = new DiagnosticInfos(*m_pConfig);
43  m_State.reset();
44}
45
46void DiagnosticEngine::setLineInfo(DiagnosticLineInfo& pLineInfo)
47{
48  m_pLineInfo = &pLineInfo;
49}
50
51void DiagnosticEngine::setPrinter(DiagnosticPrinter& pPrinter,
52                                  bool pShouldOwnPrinter)
53{
54  if (m_OwnPrinter && NULL != m_pPrinter)
55    delete m_pPrinter;
56  m_pPrinter = &pPrinter;
57  m_OwnPrinter = pShouldOwnPrinter;
58}
59
60// emit - process current diagnostic.
61bool DiagnosticEngine::emit()
62{
63  assert(NULL != m_pInfoMap);
64  bool emitted = m_pInfoMap->process(*this);
65  m_State.reset();
66  return emitted;
67}
68
69MsgHandler
70DiagnosticEngine::report(uint16_t pID, DiagnosticEngine::Severity pSeverity)
71{
72  m_State.ID = pID;
73  m_State.severity = pSeverity;
74
75  MsgHandler result(*this);
76  return result;
77}
78
79