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