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()22DiagnosticEngine::DiagnosticEngine() 23 : m_pConfig(NULL), m_pLineInfo(NULL), m_pPrinter(NULL), 24 m_pInfoMap(NULL), m_OwnPrinter(false) { 25 } 26 ~DiagnosticEngine()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 reset(const LinkerConfig & pConfig)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 setLineInfo(DiagnosticLineInfo & pLineInfo)46void DiagnosticEngine::setLineInfo(DiagnosticLineInfo& pLineInfo) 47 { 48 m_pLineInfo = &pLineInfo; 49 } 50 setPrinter(DiagnosticPrinter & pPrinter,bool pShouldOwnPrinter)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. emit()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 69 MsgHandler report(uint16_t pID,DiagnosticEngine::Severity pSeverity)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