1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- DiagnosticEngine.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_DIAGNOSTICENGINE_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_DIAGNOSTICENGINE_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticInfos.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/DataTypes.h> 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <string> 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 17affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld { 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DiagnosticLineInfo; 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DiagnosticPrinter; 21affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass Input; 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 23affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MsgHandler; 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class DiagnosticEngine 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief DiagnosticEngine is used to report problems and issues. 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * DiagnosticEngine is used to report problems and issues. It creates the 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * Diagnostics and passes them to the DiagnosticPrinter for reporting to the 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * user. 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * DiagnosticEngine is a complex class, it is responsible for 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * - remember the argument string for MsgHandler 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * - choice the severity of a message by options 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DiagnosticEngine { 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum Severity { 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Unreachable, 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Fatal, 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Error, 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Warning, 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Debug, 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Note, 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Ignore, 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang None 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum ArgumentKind { 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ak_std_string, // std::string 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ak_c_string, // const char * 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ak_sint, // int 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ak_uint, // unsigned int 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ak_ulonglong, // unsigned long long 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ak_bool // bool 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 5967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao DiagnosticEngine(); 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~DiagnosticEngine(); 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void reset(const LinkerConfig& pConfig); 6467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 6567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao void setLineInfo(DiagnosticLineInfo& pLineInfo); 6667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void setPrinter(DiagnosticPrinter& pPrinter, bool pShouldOwnPrinter = true); 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const DiagnosticPrinter* getPrinter() const { return m_pPrinter; } 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines DiagnosticPrinter* getPrinter() { return m_pPrinter; } 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang DiagnosticPrinter* takePrinter() { 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OwnPrinter = false; 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return m_pPrinter; 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool ownPrinter() const { return m_OwnPrinter; } 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // ----- emission ----- // 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // emit - process the message to printer 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool emit(); 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // report - issue the message to the printer 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MsgHandler report(uint16_t pID, Severity pSeverity); 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang friend class MsgHandler; 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang friend class Diagnostic; 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum { 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// MaxArguments - The maximum number of arguments we can hold. We currently 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// only support up to 10 arguments (%0-%9). 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MaxArguments = 10 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines struct State { 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines State() : numArgs(0), ID(-1), severity(None), file(NULL) {} 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ~State() {} 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void reset() { 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang numArgs = 0; 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ID = -1; 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang severity = None; 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang file = NULL; 106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang std::string ArgumentStrs[MaxArguments]; 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang intptr_t ArgumentVals[MaxArguments]; 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint8_t ArgumentKinds[MaxArguments]; 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int8_t numArgs; 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint16_t ID; 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Severity severity; 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Input* file; 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines State& state() { return m_State; } 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const State& state() const { return m_State; } 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao DiagnosticInfos& infoMap() { 12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pInfoMap != NULL && "DiagnosticEngine was not initialized!"); 12567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return *m_pInfoMap; 12667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao const DiagnosticInfos& infoMap() const { 12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pInfoMap != NULL && "DiagnosticEngine was not initialized!"); 13067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return *m_pInfoMap; 13167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao } 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig* m_pConfig; 135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang DiagnosticLineInfo* m_pLineInfo; 136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang DiagnosticPrinter* m_pPrinter; 13767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao DiagnosticInfos* m_pInfoMap; 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool m_OwnPrinter; 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang State m_State; 141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 14537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_DIAGNOSTICENGINE_H_ 146