1 /*========================== begin_copyright_notice ============================
2 
3 Copyright (C) 2020-2021 Intel Corporation
4 
5 SPDX-License-Identifier: MIT
6 
7 ============================= end_copyright_notice ===========================*/
8 
9 #ifndef VC_SUPPORT_STATUS_H
10 #define VC_SUPPORT_STATUS_H
11 
12 #include "vc/Support/StatusCode.h"
13 
14 #include <llvm/Support/Error.h>
15 
16 #include <system_error>
17 
18 namespace vc {
19 
20 class DynLoadError final : public llvm::ErrorInfo<DynLoadError> {
21 public:
22   static char ID;
23 
24 private:
25   std::string Message;
26 
27 public:
DynLoadError(llvm::StringRef Msg)28   DynLoadError(llvm::StringRef Msg) : Message(Msg.str()) {}
29 
30   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()31   std::error_code convertToErrorCode() const override {
32     return make_error_code(errc::dynamic_load_fail);
33   }
34 };
35 
36 class SymbolLookupError final : public llvm::ErrorInfo<SymbolLookupError> {
37 public:
38   static char ID;
39 
40 private:
41   std::string Library;
42   std::string Symbol;
43 
44 public:
SymbolLookupError(llvm::StringRef Lib,llvm::StringRef Sym)45   SymbolLookupError(llvm::StringRef Lib, llvm::StringRef Sym)
46       : Library(Lib.str()), Symbol(Sym.str()) {}
47 
48   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()49   std::error_code convertToErrorCode() const override {
50     return make_error_code(errc::symbol_not_found);
51   }
52 };
53 
54 class BadSpirvError final : public llvm::ErrorInfo<BadSpirvError> {
55 public:
56   static char ID;
57 
58 private:
59   std::string Message;
60 
61 public:
BadSpirvError(llvm::StringRef Msg)62   BadSpirvError(llvm::StringRef Msg) : Message(Msg.str()) {}
63 
64   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()65   std::error_code convertToErrorCode() const override {
66     return make_error_code(errc::bad_spirv);
67   }
68 };
69 
70 class BadBitcodeError final : public llvm::ErrorInfo<BadBitcodeError> {
71 public:
72   static char ID;
73 
74 private:
75   std::string Message;
76 
77 public:
BadBitcodeError(llvm::StringRef Msg)78   BadBitcodeError(llvm::StringRef Msg) : Message(Msg.str()) {}
79 
80   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()81   std::error_code convertToErrorCode() const override {
82     return make_error_code(errc::bad_bitcode);
83   }
84 };
85 
86 class InvalidModuleError final : public llvm::ErrorInfo<InvalidModuleError> {
87 public:
88   static char ID;
89 
90   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()91   std::error_code convertToErrorCode() const override {
92     return make_error_code(errc::invalid_module);
93   }
94 };
95 
96 class TargetMachineError final : public llvm::ErrorInfo<TargetMachineError> {
97 public:
98   static char ID;
99 
100   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()101   std::error_code convertToErrorCode() const override {
102     return make_error_code(errc::target_machine_not_created);
103   }
104 };
105 
106 class NotVCError final : public llvm::ErrorInfo<NotVCError> {
107 public:
108   static char ID;
109 
110   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()111   std::error_code convertToErrorCode() const override {
112     return make_error_code(errc::not_vc_codegen);
113   }
114 };
115 
116 class OptionError final : public llvm::ErrorInfo<OptionError> {
117 public:
118   static char ID;
119 
120 private:
121   std::string BadOption;
122   bool IsInternal;
123 
124 public:
OptionError(llvm::StringRef BadOpt,bool IsInternal_)125   OptionError(llvm::StringRef BadOpt, bool IsInternal_)
126       : BadOption(BadOpt.str()), IsInternal(IsInternal_) {}
127 
isInternal()128   bool isInternal() const { return IsInternal; }
129 
130   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()131   std::error_code convertToErrorCode() const override {
132     const errc c =
133         IsInternal ? errc::invalid_internal_option : errc::invalid_api_option;
134     return make_error_code(c);
135   }
136 };
137 
138 class OutputBinaryCreationError final
139     : public llvm::ErrorInfo<OutputBinaryCreationError> {
140 public:
141   static char ID;
142 
143 private:
144   std::string Message;
145 
146 public:
OutputBinaryCreationError(llvm::StringRef Msg)147   OutputBinaryCreationError(llvm::StringRef Msg) : Message{Msg.str()} {}
148 
149   void log(llvm::raw_ostream &OS) const override;
convertToErrorCode()150   std::error_code convertToErrorCode() const override {
151     return make_error_code(errc::output_not_created);
152   }
153 };
154 
155 } // namespace vc
156 
157 #endif
158