//===- DiagnosticEngine.cpp -----------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include <mcld/LD/DiagnosticEngine.h> #include <mcld/LD/DiagnosticPrinter.h> #include <mcld/LD/DiagnosticLineInfo.h> #include <mcld/LD/MsgHandler.h> #include <mcld/LinkerConfig.h> #include <cassert> using namespace mcld; //===----------------------------------------------------------------------===// // DiagnosticEngine //===----------------------------------------------------------------------===// DiagnosticEngine::DiagnosticEngine() : m_pConfig(NULL), m_pLineInfo(NULL), m_pPrinter(NULL), m_pInfoMap(NULL), m_OwnPrinter(false) { } DiagnosticEngine::~DiagnosticEngine() { if (m_OwnPrinter && m_pPrinter != NULL) delete m_pPrinter; delete m_pInfoMap; // FIXME: design the destructive relation of LineInfo. delete m_pLineInfo; } void DiagnosticEngine::reset(const LinkerConfig& pConfig) { m_pConfig = &pConfig; delete m_pInfoMap; m_pInfoMap = new DiagnosticInfos(*m_pConfig); m_State.reset(); } void DiagnosticEngine::setLineInfo(DiagnosticLineInfo& pLineInfo) { m_pLineInfo = &pLineInfo; } void DiagnosticEngine::setPrinter(DiagnosticPrinter& pPrinter, bool pShouldOwnPrinter) { if (m_OwnPrinter && NULL != m_pPrinter) delete m_pPrinter; m_pPrinter = &pPrinter; m_OwnPrinter = pShouldOwnPrinter; } // emit - process current diagnostic. bool DiagnosticEngine::emit() { assert(NULL != m_pInfoMap); bool emitted = m_pInfoMap->process(*this); m_State.reset(); return emitted; } MsgHandler DiagnosticEngine::report(uint16_t pID, DiagnosticEngine::Severity pSeverity) { m_State.ID = pID; m_State.severity = pSeverity; MsgHandler result(*this); return result; }