1//===- MsgHandler.h -------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_LD_MSGHANDLER_H
10#define MCLD_LD_MSGHANDLER_H
11#include <string>
12#include <llvm/ADT/StringRef.h>
13#include <llvm/ADT/Twine.h>
14#include <mcld/Support/Path.h>
15#include <mcld/LD/DiagnosticEngine.h>
16
17namespace mcld {
18
19/** \class MsgHandler
20 *  \brief MsgHandler controls the timing to output message.
21 */
22class MsgHandler
23{
24public:
25  MsgHandler(DiagnosticEngine& pEngine);
26  ~MsgHandler();
27
28  bool emit();
29
30  void addString(llvm::StringRef pStr) const;
31
32  void addString(const std::string& pStr) const;
33
34  void addTaggedVal(intptr_t pValue, DiagnosticEngine::ArgumentKind pKind) const;
35
36private:
37  void flushCounts()
38  { m_Engine.state().numArgs = m_NumArgs; }
39
40private:
41  DiagnosticEngine& m_Engine;
42  mutable unsigned int m_NumArgs;
43};
44
45inline const MsgHandler &
46operator<<(const MsgHandler& pHandler, llvm::StringRef pStr)
47{
48  pHandler.addString(pStr);
49  return pHandler;
50}
51
52inline const MsgHandler &
53operator<<(const MsgHandler& pHandler, const std::string& pStr)
54{
55  pHandler.addString(pStr);
56  return pHandler;
57}
58
59inline const MsgHandler &
60operator<<(const MsgHandler& pHandler, const sys::fs::Path& pPath)
61{
62  pHandler.addString(pPath.native());
63  return pHandler;
64}
65
66inline const MsgHandler &
67operator<<(const MsgHandler& pHandler, const char* pStr)
68{
69  pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr),
70                        DiagnosticEngine::ak_c_string);
71  return pHandler;
72}
73
74inline const MsgHandler &
75operator<<(const MsgHandler& pHandler, int pValue)
76{
77  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
78  return pHandler;
79}
80
81inline const MsgHandler &
82operator<<(const MsgHandler& pHandler, unsigned int pValue)
83{
84  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
85  return pHandler;
86}
87
88inline const MsgHandler &
89operator<<(const MsgHandler& pHandler, long pValue)
90{
91  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
92  return pHandler;
93}
94
95inline const MsgHandler &
96operator<<(const MsgHandler& pHandler, unsigned long pValue)
97{
98  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
99  return pHandler;
100}
101
102inline const MsgHandler &
103operator<<(const MsgHandler& pHandler, unsigned long long pValue)
104{
105  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_ulonglong);
106  return pHandler;
107}
108
109inline const MsgHandler &
110operator<<(const MsgHandler& pHandler, bool pValue)
111{
112  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool);
113  return pHandler;
114}
115
116} // namespace of mcld
117
118#endif
119
120