Home | History | Annotate | Download | only in LD
      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 
     15 namespace mcld {
     16 
     17 class Input;
     18 class LinkerConfig;
     19 class MsgHandler;
     20 class DiagnosticPrinter;
     21 class 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  */
     34 class DiagnosticEngine
     35 {
     36 public:
     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 
     57 public:
     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 
     87 private:
     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 
    120 private:
    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 
    137 private:
    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