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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_MSGHANDLER_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_MSGHANDLER_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticEngine.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Path.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/Twine.h>
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <string>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class MsgHandler
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief MsgHandler controls the timing to output message.
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass MsgHandler {
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit MsgHandler(DiagnosticEngine& pEngine);
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~MsgHandler();
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool emit();
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addString(llvm::StringRef pStr) const;
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void addString(const std::string& pStr) const;
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void addTaggedVal(intptr_t pValue,
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    DiagnosticEngine::ArgumentKind pKind) const;
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void flushCounts() { m_Engine.state().numArgs = m_NumArgs; }
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticEngine& m_Engine;
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mutable unsigned int m_NumArgs;
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    llvm::StringRef pStr) {
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pStr);
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    const std::string& pStr) {
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pStr);
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    const sys::fs::Path& pPath) {
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addString(pPath.native());
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    const char* pStr) {
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr),
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                        DiagnosticEngine::ak_c_string);
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, int pValue) {
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    unsigned int pValue) {
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, long pValue) {
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    unsigned long pValue) {
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler,
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    unsigned long long pValue) {
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_ulonglong);
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return pHandler;
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, bool pValue) {
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool);
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return pHandler;
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_MSGHANDLER_H_
107