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