1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- MsgHandler.h -------------------------------------------------------===//
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//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef MCLD_MESSAGE_HANDLER_H
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_MESSAGE_HANDLER_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <string>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/Twine.h>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/Path.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/DiagnosticEngine.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class MsgHandler
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief MsgHandler controls the timing to output message.
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
26affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MsgHandler
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
28affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  MsgHandler(DiagnosticEngine& pEngine);
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~MsgHandler();
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool emit();
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addString(llvm::StringRef pStr) const;
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addString(const std::string& pStr) const;
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addTaggedVal(intptr_t pValue, DiagnosticEngine::ArgumentKind pKind) const;
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
40affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void flushCounts()
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { m_Engine.state().numArgs = m_NumArgs; }
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
44affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticEngine& m_Engine;
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mutable unsigned int m_NumArgs;
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
49affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
50affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, llvm::StringRef pStr)
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pStr);
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
56affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
57affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, const std::string& pStr)
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pStr);
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
63affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
64affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, const sys::fs::Path& pPath)
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pPath.native());
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
70affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
71affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, const char* pStr)
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr),
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                        DiagnosticEngine::ak_c_string);
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
78affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
79affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, int pValue)
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
85affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
86affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, unsigned int pValue)
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
92affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
93affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, long pValue)
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
99affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
100affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, unsigned long pValue)
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
106affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
107affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, bool pValue)
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool);
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Inline member functions
115affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline MsgHandler
116affc150dc44fab1911775a49636d0ce85333b634Zonr ChangDiagnosticEngine::report(uint16_t pID, DiagnosticEngine::Severity pSeverity)
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_State.ID = pID;
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_State.severity = pSeverity;
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  MsgHandler result(*this);
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return result;
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
129