1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- DiagnosticEngine.cpp -----------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticEngine.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticLineInfo.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticPrinter.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/MsgHandler.h" 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cassert> 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 2067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao//===----------------------------------------------------------------------===// 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// DiagnosticEngine 2267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao//===----------------------------------------------------------------------===// 2367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei LiaoDiagnosticEngine::DiagnosticEngine() 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_pConfig(NULL), 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pLineInfo(NULL), 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pPrinter(NULL), 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pInfoMap(NULL), 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_OwnPrinter(false) { 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3137b74a387bb3993387029859c2d9d051c41c724eStephen HinesDiagnosticEngine::~DiagnosticEngine() { 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (m_OwnPrinter && m_pPrinter != NULL) 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang delete m_pPrinter; 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pInfoMap; 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // FIXME: design the destructive relation of LineInfo. 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete m_pLineInfo; 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid DiagnosticEngine::reset(const LinkerConfig& pConfig) { 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pConfig = &pConfig; 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pInfoMap; 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pInfoMap = new DiagnosticInfos(*m_pConfig); 4567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao m_State.reset(); 4667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao} 4767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid DiagnosticEngine::setLineInfo(DiagnosticLineInfo& pLineInfo) { 4967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao m_pLineInfo = &pLineInfo; 5067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao} 5167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 52affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid DiagnosticEngine::setPrinter(DiagnosticPrinter& pPrinter, 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool pShouldOwnPrinter) { 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (m_OwnPrinter && m_pPrinter != NULL) 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang delete m_pPrinter; 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_pPrinter = &pPrinter; 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OwnPrinter = pShouldOwnPrinter; 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// emit - process current diagnostic. 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool DiagnosticEngine::emit() { 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pInfoMap != NULL); 6367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao bool emitted = m_pInfoMap->process(*this); 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State.reset(); 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return emitted; 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6837b74a387bb3993387029859c2d9d051c41c724eStephen HinesMsgHandler DiagnosticEngine::report(uint16_t pID, 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines DiagnosticEngine::Severity pSeverity) { 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_State.ID = pID; 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_State.severity = pSeverity; 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MsgHandler result(*this); 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return result; 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 78