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