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