| //===- DiagnosticEngine.h -------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_DIAGNOSTIC_ENGINE_H |
| #define MCLD_DIAGNOSTIC_ENGINE_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| #include <string> |
| #include <llvm/Support/DataTypes.h> |
| #include <mcld/LD/DiagnosticInfos.h> |
| |
| namespace mcld { |
| |
| class Input; |
| class LinkerConfig; |
| class MsgHandler; |
| class DiagnosticPrinter; |
| class DiagnosticLineInfo; |
| |
| /** \class DiagnosticEngine |
| * \brief DiagnosticEngine is used to report problems and issues. |
| * |
| * DiagnosticEngine is used to report problems and issues. It creates the |
| * Diagnostics and passes them to the DiagnosticPrinter for reporting to the |
| * user. |
| * |
| * DiagnosticEngine is a complex class, it is responsible for |
| * - remember the argument string for MsgHandler |
| * - choice the severity of a message by options |
| */ |
| class DiagnosticEngine |
| { |
| public: |
| enum Severity { |
| Unreachable, |
| Fatal, |
| Error, |
| Warning, |
| Debug, |
| Note, |
| Ignore, |
| None |
| }; |
| |
| enum ArgumentKind { |
| ak_std_string, // std::string |
| ak_c_string, // const char * |
| ak_sint, // int |
| ak_uint, // unsigned int |
| ak_bool // bool |
| }; |
| |
| public: |
| DiagnosticEngine(); |
| |
| ~DiagnosticEngine(); |
| |
| void reset(const LinkerConfig& pConfig); |
| |
| void setLineInfo(DiagnosticLineInfo& pLineInfo); |
| |
| void setPrinter(DiagnosticPrinter& pPrinter, bool pShouldOwnPrinter = true); |
| |
| const DiagnosticPrinter* getPrinter() const { return m_pPrinter; } |
| DiagnosticPrinter* getPrinter() { return m_pPrinter; } |
| |
| |
| DiagnosticPrinter* takePrinter() { |
| m_OwnPrinter = false; |
| return m_pPrinter; |
| } |
| |
| bool ownPrinter() const |
| { return m_OwnPrinter; } |
| |
| // ----- emission ----- // |
| // emit - process the message to printer |
| bool emit(); |
| |
| // report - issue the message to the printer |
| MsgHandler report(uint16_t pID, Severity pSeverity); |
| |
| private: |
| friend class MsgHandler; |
| friend class Diagnostic; |
| |
| enum { |
| /// MaxArguments - The maximum number of arguments we can hold. We currently |
| /// only support up to 10 arguments (%0-%9). |
| MaxArguments = 10 |
| }; |
| |
| struct State |
| { |
| public: |
| State() : numArgs(0), ID(-1), severity(None), file(NULL) { } |
| ~State() { } |
| |
| void reset() { |
| numArgs = 0; |
| ID = -1; |
| severity = None; |
| file = NULL; |
| } |
| |
| public: |
| std::string ArgumentStrs[MaxArguments]; |
| intptr_t ArgumentVals[MaxArguments]; |
| uint8_t ArgumentKinds[MaxArguments]; |
| int8_t numArgs; |
| uint16_t ID; |
| Severity severity; |
| Input* file; |
| }; |
| |
| private: |
| State& state() |
| { return m_State; } |
| |
| const State& state() const |
| { return m_State; } |
| |
| DiagnosticInfos& infoMap() { |
| assert(NULL != m_pInfoMap && "DiagnosticEngine was not initialized!"); |
| return *m_pInfoMap; |
| } |
| |
| const DiagnosticInfos& infoMap() const { |
| assert(NULL != m_pInfoMap && "DiagnosticEngine was not initialized!"); |
| return *m_pInfoMap; |
| } |
| |
| private: |
| const LinkerConfig* m_pConfig; |
| DiagnosticLineInfo* m_pLineInfo; |
| DiagnosticPrinter* m_pPrinter; |
| DiagnosticInfos* m_pInfoMap; |
| bool m_OwnPrinter; |
| |
| State m_State; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |