1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- DiagnosticEngine.h -------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_DIAGNOSTICENGINE_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_DIAGNOSTICENGINE_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DiagnosticInfos.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/DataTypes.h>
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <string>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
17affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld {
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DiagnosticLineInfo;
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DiagnosticPrinter;
21affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass Input;
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MsgHandler;
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class DiagnosticEngine
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief DiagnosticEngine is used to report problems and issues.
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  DiagnosticEngine is used to report problems and issues. It creates the
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  Diagnostics and passes them to the DiagnosticPrinter for reporting to the
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  user.
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  DiagnosticEngine is a complex class, it is responsible for
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  - remember the argument string for MsgHandler
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  - choice the severity of a message by options
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DiagnosticEngine {
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum Severity {
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Unreachable,
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Fatal,
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Error,
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Warning,
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Debug,
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Note,
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Ignore,
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    None
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ArgumentKind {
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ak_std_string,  // std::string
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ak_c_string,    // const char *
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ak_sint,        // int
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ak_uint,        // unsigned int
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ak_ulonglong,   // unsigned long long
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ak_bool         // bool
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
5967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  DiagnosticEngine();
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~DiagnosticEngine();
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void reset(const LinkerConfig& pConfig);
6467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
6567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  void setLineInfo(DiagnosticLineInfo& pLineInfo);
6667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setPrinter(DiagnosticPrinter& pPrinter, bool pShouldOwnPrinter = true);
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const DiagnosticPrinter* getPrinter() const { return m_pPrinter; }
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DiagnosticPrinter* getPrinter() { return m_pPrinter; }
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticPrinter* takePrinter() {
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_OwnPrinter = false;
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return m_pPrinter;
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool ownPrinter() const { return m_OwnPrinter; }
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  emission  ----- //
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // emit - process the message to printer
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool emit();
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // report - issue the message to the printer
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  MsgHandler report(uint16_t pID, Severity pSeverity);
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  friend class MsgHandler;
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  friend class Diagnostic;
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum {
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    /// MaxArguments - The maximum number of arguments we can hold. We currently
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    /// only support up to 10 arguments (%0-%9).
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    MaxArguments = 10
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  struct State {
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    State() : numArgs(0), ID(-1), severity(None), file(NULL) {}
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ~State() {}
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    void reset() {
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      numArgs = 0;
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      ID = -1;
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      severity = None;
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      file = NULL;
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    std::string ArgumentStrs[MaxArguments];
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    intptr_t ArgumentVals[MaxArguments];
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    uint8_t ArgumentKinds[MaxArguments];
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    int8_t numArgs;
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    uint16_t ID;
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Severity severity;
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Input* file;
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  State& state() { return m_State; }
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const State& state() const { return m_State; }
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  DiagnosticInfos& infoMap() {
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    assert(m_pInfoMap != NULL && "DiagnosticEngine was not initialized!");
12567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    return *m_pInfoMap;
12667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  const DiagnosticInfos& infoMap() const {
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    assert(m_pInfoMap != NULL && "DiagnosticEngine was not initialized!");
13067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    return *m_pInfoMap;
13167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig* m_pConfig;
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticLineInfo* m_pLineInfo;
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DiagnosticPrinter* m_pPrinter;
13767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  DiagnosticInfos* m_pInfoMap;
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool m_OwnPrinter;
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  State m_State;
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_DIAGNOSTICENGINE_H_
146