1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- MsgHandler.h -------------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_MSGHANDLER_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_MSGHANDLER_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticEngine.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Path.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h> 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/Twine.h> 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <string> 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class MsgHandler 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief MsgHandler controls the timing to output message. 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass MsgHandler { 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit MsgHandler(DiagnosticEngine& pEngine); 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~MsgHandler(); 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool emit(); 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void addString(llvm::StringRef pStr) const; 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void addString(const std::string& pStr) const; 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines void addTaggedVal(intptr_t pValue, 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines DiagnosticEngine::ArgumentKind pKind) const; 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines void flushCounts() { m_Engine.state().numArgs = m_NumArgs; } 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang DiagnosticEngine& m_Engine; 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang mutable unsigned int m_NumArgs; 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::StringRef pStr) { 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addString(pStr); 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const std::string& pStr) { 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addString(pStr); 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines const sys::fs::Path& pPath) { 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addString(pPath.native()); 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines const char* pStr) { 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr), 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang DiagnosticEngine::ak_c_string); 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, int pValue) { 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint); 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned int pValue) { 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint); 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, long pValue) { 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint); 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned long pValue) { 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint); 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned long long pValue) { 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_ulonglong); 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return pHandler; 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinline const MsgHandler& operator<<(const MsgHandler& pHandler, bool pValue) { 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool); 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return pHandler; 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_MSGHANDLER_H_ 107