//===- 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 MCLDInfo;
class DiagnosticPrinter;
class DiagnosticLineInfo;

void InitializeDiagnosticEngine(const MCLDInfo& pLDInfo,
                                DiagnosticLineInfo* pLineInfo,
                                DiagnosticPrinter* pPrinter);

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

