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