//===- MsgHandling.h ------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_MESSAGE_HANDLING_H
#define MCLD_MESSAGE_HANDLING_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <mcld/LD/MsgHandler.h>

namespace mcld {

class LinkerConfig;
class DiagnosticPrinter;
class DiagnosticLineInfo;

void InitializeDiagnosticEngine(const LinkerConfig& pConfig,
                                DiagnosticPrinter* pPrinter = NULL);

void FinalizeDiagnosticEngine();

bool Diagnose();

DiagnosticEngine& getDiagnosticEngine();

MsgHandler unreachable(unsigned int pID);
MsgHandler fatal(unsigned int pID);
MsgHandler error(unsigned int pID);
MsgHandler warning(unsigned int pID);
MsgHandler debug(unsigned int pID);
MsgHandler note(unsigned int pID);
MsgHandler ignore(unsigned int pID);

} // namespace of mcld

//===----------------------------------------------------------------------===//
//  Inline functions
//===----------------------------------------------------------------------===//
inline mcld::MsgHandler mcld::unreachable(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Unreachable);
}

inline mcld::MsgHandler mcld::fatal(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Fatal);
}

inline mcld::MsgHandler mcld::error(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Error);
}

inline mcld::MsgHandler mcld::warning(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Warning);
}

inline mcld::MsgHandler mcld::debug(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Debug);
}

inline mcld::MsgHandler mcld::note(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Note);
}

inline mcld::MsgHandler mcld::ignore(unsigned int pID)
{
  return getDiagnosticEngine().report(pID, DiagnosticEngine::Ignore);
}

#endif

