blob: 11dbe1b908df512591c1bbb6094df2ce120dfbb3 [file] [log] [blame]
//===- 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/MC/MCLDInfo.h>
using namespace mcld;
//==========================
// DiagnosticEngine
DiagnosticEngine::DiagnosticEngine(const MCLDInfo& pLDInfo,
DiagnosticLineInfo* pLineInfo,
DiagnosticPrinter* pPrinter,
bool pShouldOwnPrinter)
: m_LDInfo(pLDInfo),
m_pLineInfo(pLineInfo),
m_pPrinter(pPrinter),
m_InfoMap(pLDInfo),
m_OwnPrinter(pShouldOwnPrinter) {
if (NULL == m_pPrinter) {
m_pPrinter = new DiagnosticPrinter(); // Dumb printer
m_OwnPrinter = true;
}
}
DiagnosticEngine::~DiagnosticEngine()
{
if (m_OwnPrinter && m_pPrinter != NULL)
delete m_pPrinter;
if (NULL != m_pLineInfo)
delete m_pLineInfo;
}
void DiagnosticEngine::setPrinter(DiagnosticPrinter& pPrinter,
bool pShouldOwnPrinter)
{
if (m_OwnPrinter && m_pPrinter != NULL)
delete m_pPrinter;
m_pPrinter = &pPrinter;
m_OwnPrinter = pShouldOwnPrinter;
}
// emit - process current diagnostic.
bool DiagnosticEngine::emit()
{
bool emitted = m_InfoMap.process(*this);
m_State.reset();
return emitted;
}