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