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