• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 using namespace mcld;
18 
19 //===----------------------------------------------------------------------===//
20 // DiagnosticEngine
21 //===----------------------------------------------------------------------===//
DiagnosticEngine()22 DiagnosticEngine::DiagnosticEngine()
23   : m_pConfig(NULL), m_pLineInfo(NULL), m_pPrinter(NULL),
24     m_pInfoMap(NULL), m_OwnPrinter(false) {
25 }
26 
~DiagnosticEngine()27 DiagnosticEngine::~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 
reset(const LinkerConfig & pConfig)38 void 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 
setLineInfo(DiagnosticLineInfo & pLineInfo)46 void DiagnosticEngine::setLineInfo(DiagnosticLineInfo& pLineInfo)
47 {
48   m_pLineInfo = &pLineInfo;
49 }
50 
setPrinter(DiagnosticPrinter & pPrinter,bool pShouldOwnPrinter)51 void 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.
emit()61 bool DiagnosticEngine::emit()
62 {
63   assert(NULL != m_pInfoMap);
64   bool emitted = m_pInfoMap->process(*this);
65   m_State.reset();
66   return emitted;
67 }
68 
69 MsgHandler
report(uint16_t pID,DiagnosticEngine::Severity pSeverity)70 DiagnosticEngine::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