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