DiagnosticEngine.h revision 533eae20118036f425f27bf0536ef0ccbb090b65
1//===- DiagnosticEngine.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_DIAGNOSTICENGINE_H 10#define MCLD_LD_DIAGNOSTICENGINE_H 11#include <string> 12#include <llvm/Support/DataTypes.h> 13#include <mcld/LD/DiagnosticInfos.h> 14 15namespace mcld { 16 17class Input; 18class LinkerConfig; 19class MsgHandler; 20class DiagnosticPrinter; 21class DiagnosticLineInfo; 22 23/** \class DiagnosticEngine 24 * \brief DiagnosticEngine is used to report problems and issues. 25 * 26 * DiagnosticEngine is used to report problems and issues. It creates the 27 * Diagnostics and passes them to the DiagnosticPrinter for reporting to the 28 * user. 29 * 30 * DiagnosticEngine is a complex class, it is responsible for 31 * - remember the argument string for MsgHandler 32 * - choice the severity of a message by options 33 */ 34class DiagnosticEngine 35{ 36public: 37 enum Severity { 38 Unreachable, 39 Fatal, 40 Error, 41 Warning, 42 Debug, 43 Note, 44 Ignore, 45 None 46 }; 47 48 enum ArgumentKind { 49 ak_std_string, // std::string 50 ak_c_string, // const char * 51 ak_sint, // int 52 ak_uint, // unsigned int 53 ak_ulonglong, // unsigned long long 54 ak_bool // bool 55 }; 56 57public: 58 DiagnosticEngine(); 59 60 ~DiagnosticEngine(); 61 62 void reset(const LinkerConfig& pConfig); 63 64 void setLineInfo(DiagnosticLineInfo& pLineInfo); 65 66 void setPrinter(DiagnosticPrinter& pPrinter, bool pShouldOwnPrinter = true); 67 68 const DiagnosticPrinter* getPrinter() const { return m_pPrinter; } 69 DiagnosticPrinter* getPrinter() { return m_pPrinter; } 70 71 72 DiagnosticPrinter* takePrinter() { 73 m_OwnPrinter = false; 74 return m_pPrinter; 75 } 76 77 bool ownPrinter() const 78 { return m_OwnPrinter; } 79 80 // ----- emission ----- // 81 // emit - process the message to printer 82 bool emit(); 83 84 // report - issue the message to the printer 85 MsgHandler report(uint16_t pID, Severity pSeverity); 86 87private: 88 friend class MsgHandler; 89 friend class Diagnostic; 90 91 enum { 92 /// MaxArguments - The maximum number of arguments we can hold. We currently 93 /// only support up to 10 arguments (%0-%9). 94 MaxArguments = 10 95 }; 96 97 struct State 98 { 99 public: 100 State() : numArgs(0), ID(-1), severity(None), file(NULL) { } 101 ~State() { } 102 103 void reset() { 104 numArgs = 0; 105 ID = -1; 106 severity = None; 107 file = NULL; 108 } 109 110 public: 111 std::string ArgumentStrs[MaxArguments]; 112 intptr_t ArgumentVals[MaxArguments]; 113 uint8_t ArgumentKinds[MaxArguments]; 114 int8_t numArgs; 115 uint16_t ID; 116 Severity severity; 117 Input* file; 118 }; 119 120private: 121 State& state() 122 { return m_State; } 123 124 const State& state() const 125 { return m_State; } 126 127 DiagnosticInfos& infoMap() { 128 assert(NULL != m_pInfoMap && "DiagnosticEngine was not initialized!"); 129 return *m_pInfoMap; 130 } 131 132 const DiagnosticInfos& infoMap() const { 133 assert(NULL != m_pInfoMap && "DiagnosticEngine was not initialized!"); 134 return *m_pInfoMap; 135 } 136 137private: 138 const LinkerConfig* m_pConfig; 139 DiagnosticLineInfo* m_pLineInfo; 140 DiagnosticPrinter* m_pPrinter; 141 DiagnosticInfos* m_pInfoMap; 142 bool m_OwnPrinter; 143 144 State m_State; 145}; 146 147} // namespace of mcld 148 149#endif 150 151