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
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class MsgHandler
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief MsgHandler controls the timing to output message.
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
25affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MsgHandler
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
27affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  MsgHandler(DiagnosticEngine& pEngine);
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~MsgHandler();
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool emit();
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addString(llvm::StringRef pStr) const;
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addString(const std::string& pStr) const;
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addTaggedVal(intptr_t pValue, DiagnosticEngine::ArgumentKind pKind) const;
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
39affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void flushCounts()
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { m_Engine.state().numArgs = m_NumArgs; }
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
43affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticEngine& m_Engine;
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mutable unsigned int m_NumArgs;
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
48affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
49affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, llvm::StringRef pStr)
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pStr);
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
55affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
56affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, const std::string& pStr)
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pStr);
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
62affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
63affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, const sys::fs::Path& pPath)
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pPath.native());
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
69affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
70affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, const char* pStr)
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr),
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                        DiagnosticEngine::ak_c_string);
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
77affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
78affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, int pValue)
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
84affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
85affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, unsigned int pValue)
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
91affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
92affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, long pValue)
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
98affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
99affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, unsigned long pValue)
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
105affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline const MsgHandler &
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesoperator<<(const MsgHandler& pHandler, unsigned long long pValue)
107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_ulonglong);
109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return pHandler;
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesinline const MsgHandler &
113affc150dc44fab1911775a49636d0ce85333b634Zonr Changoperator<<(const MsgHandler& pHandler, bool pValue)
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool);
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
123