//===- 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 MCLDInfo; 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 MCLDInfo& pLDInfo); void setLineInfo(DiagnosticLineInfo& pLineInfo); void setPrinter(DiagnosticPrinter& pPrinter, bool pShouldOwnPrinter = true); DiagnosticPrinter* getPrinter() { return m_pPrinter; } const DiagnosticPrinter* getPrinter() const { 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 MCLDInfo* m_pLDInfo; DiagnosticLineInfo* m_pLineInfo; DiagnosticPrinter* m_pPrinter; DiagnosticInfos* m_pInfoMap; bool m_OwnPrinter; State m_State; }; } // namespace of mcld #endif