| //===- MsgHandler.h -------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_MESSAGE_HANDLER_H |
| #define MCLD_MESSAGE_HANDLER_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| #include <string> |
| #include <llvm/ADT/StringRef.h> |
| #include <llvm/ADT/Twine.h> |
| #include <mcld/Support/Path.h> |
| #include <mcld/LD/DiagnosticEngine.h> |
| |
| namespace mcld { |
| |
| /** \class MsgHandler |
| * \brief MsgHandler controls the timing to output message. |
| */ |
| class MsgHandler |
| { |
| public: |
| MsgHandler(DiagnosticEngine& pEngine); |
| ~MsgHandler(); |
| |
| bool emit(); |
| |
| void addString(llvm::StringRef pStr) const; |
| |
| void addString(const std::string& pStr) const; |
| |
| void addTaggedVal(intptr_t pValue, DiagnosticEngine::ArgumentKind pKind) const; |
| |
| private: |
| void flushCounts() |
| { m_Engine.state().numArgs = m_NumArgs; } |
| |
| private: |
| DiagnosticEngine& m_Engine; |
| mutable unsigned int m_NumArgs; |
| }; |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, llvm::StringRef pStr) |
| { |
| pHandler.addString(pStr); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, const std::string& pStr) |
| { |
| pHandler.addString(pStr); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, const sys::fs::Path& pPath) |
| { |
| pHandler.addString(pPath.native()); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, const char* pStr) |
| { |
| pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr), |
| DiagnosticEngine::ak_c_string); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, int pValue) |
| { |
| pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, unsigned int pValue) |
| { |
| pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, long pValue) |
| { |
| pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, unsigned long pValue) |
| { |
| pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint); |
| return pHandler; |
| } |
| |
| inline const MsgHandler & |
| operator<<(const MsgHandler& pHandler, bool pValue) |
| { |
| pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool); |
| return pHandler; |
| } |
| |
| } // namespace of mcld |
| |
| #endif |
| |