blob: d6086d782c4ef438d577e3bc93ae99f17c7b9900 [file] [log] [blame]
Ben Clayton6b4924f2021-02-17 20:13:34 +00001// Copyright 2021 The Tint Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef SRC_DEBUG_H_
16#define SRC_DEBUG_H_
17
Ben Clayton3a9a55e2021-02-18 16:33:38 +000018#include <utility>
Ben Clayton6b4924f2021-02-17 20:13:34 +000019
20#include "src/diagnostic/diagnostic.h"
21#include "src/diagnostic/formatter.h"
22#include "src/diagnostic/printer.h"
23
24namespace tint {
25
26/// Function type used for registering an internal compiler error reporter
27using InternalCompilerErrorReporter = void(const diag::List&);
28
Ben Clayton6b4924f2021-02-17 20:13:34 +000029/// Sets the global error reporter to be called in case of internal compiler
30/// errors.
31/// @param reporter the error reporter
32void SetInternalCompilerErrorReporter(InternalCompilerErrorReporter* reporter);
33
Ben Clayton3a9a55e2021-02-18 16:33:38 +000034/// InternalCompilerError is a helper for reporting internal compiler errors.
35/// Construct the InternalCompilerError with the source location of the ICE
36/// fault and append any error details with the `<<` operator.
37/// When the InternalCompilerError is destructed, the concatenated error message
38/// is appended to the diagnostics list with the severity of
39/// tint::diag::Severity::InternalCompilerError, and if a
40/// InternalCompilerErrorReporter is set, then it is called with the diagnostic
41/// list.
42class InternalCompilerError {
43 public:
44 /// Constructor
45 /// @param file the file containing the ICE
46 /// @param line the line containing the ICE
Ben Claytonffd28e22021-06-24 11:27:36 +000047 /// @param system the Tint system that has raised the ICE
Ben Clayton3a9a55e2021-02-18 16:33:38 +000048 /// @param diagnostics the list of diagnostics to append the ICE message to
Ben Claytonffd28e22021-06-24 11:27:36 +000049 InternalCompilerError(const char* file,
50 size_t line,
51 diag::System system,
52 diag::List& diagnostics);
Ben Clayton3a9a55e2021-02-18 16:33:38 +000053
54 /// Destructor.
55 /// Adds the internal compiler error message to the diagnostics list, and then
56 /// calls the InternalCompilerErrorReporter if one is set.
57 ~InternalCompilerError();
58
59 /// Appends `arg` to the ICE message.
60 /// @param arg the argument to append to the ICE message
61 /// @returns this object so calls can be chained
62 template <typename T>
63 InternalCompilerError& operator<<(T&& arg) {
64 msg_ << std::forward<T>(arg);
65 return *this;
66 }
67
68 private:
69 char const* const file_;
70 size_t const line_;
Ben Claytonffd28e22021-06-24 11:27:36 +000071 diag::System system_;
Ben Clayton3a9a55e2021-02-18 16:33:38 +000072 diag::List& diagnostics_;
73 std::stringstream msg_;
74};
Ben Clayton6b4924f2021-02-17 20:13:34 +000075
76} // namespace tint
77
78/// TINT_ICE() is a macro for appending an internal compiler error message
79/// to the diagnostics list `diagnostics`, and calling the
80/// InternalCompilerErrorReporter with the full diagnostic list if a reporter is
81/// set.
82/// The ICE message contains the callsite's file and line.
Ben Clayton3a9a55e2021-02-18 16:33:38 +000083/// Use the `<<` operator to append an error message to the ICE.
Ben Claytonffd28e22021-06-24 11:27:36 +000084#define TINT_ICE(system, diagnostics) \
85 tint::InternalCompilerError(__FILE__, __LINE__, \
86 ::tint::diag::System::system, diagnostics)
Ben Clayton6b4924f2021-02-17 20:13:34 +000087
88/// TINT_UNREACHABLE() is a macro for appending a "TINT_UNREACHABLE"
89/// internal compiler error message to the diagnostics list `diagnostics`, and
90/// calling the InternalCompilerErrorReporter with the full diagnostic list if a
91/// reporter is set.
92/// The ICE message contains the callsite's file and line.
Ben Clayton3a9a55e2021-02-18 16:33:38 +000093/// Use the `<<` operator to append an error message to the ICE.
Ben Claytonffd28e22021-06-24 11:27:36 +000094#define TINT_UNREACHABLE(system, diagnostics) \
95 TINT_ICE(system, diagnostics) << "TINT_UNREACHABLE "
Ben Clayton6b4924f2021-02-17 20:13:34 +000096
Ben Clayton50f169d2021-03-17 04:55:33 +000097/// TINT_UNIMPLEMENTED() is a macro for appending a "TINT_UNIMPLEMENTED"
98/// internal compiler error message to the diagnostics list `diagnostics`, and
99/// calling the InternalCompilerErrorReporter with the full diagnostic list if a
100/// reporter is set.
101/// The ICE message contains the callsite's file and line.
102/// Use the `<<` operator to append an error message to the ICE.
Ben Claytonffd28e22021-06-24 11:27:36 +0000103#define TINT_UNIMPLEMENTED(system, diagnostics) \
104 TINT_ICE(system, diagnostics) << "TINT_UNIMPLEMENTED "
Ben Clayton50f169d2021-03-17 04:55:33 +0000105
Ben Clayton01df2a72021-03-09 13:52:18 +0000106/// TINT_ASSERT() is a macro for checking the expression is true, triggering a
107/// TINT_ICE if it is not.
108/// The ICE message contains the callsite's file and line.
109/// @warning: Unlike TINT_ICE() and TINT_UNREACHABLE(), TINT_ASSERT() does not
110/// append a message to an existing tint::diag::List. As such, TINT_ASSERT()
111/// may silently fail in builds where SetInternalCompilerErrorReporter() is not
112/// called. Only use in places where there's no sensible place to put proper
113/// error handling.
Ben Clayton8a8ddcf2021-07-14 18:42:02 +0000114#define TINT_ASSERT(system, condition) \
115 do { \
116 if (!(condition)) { \
117 tint::diag::List diagnostics; \
118 TINT_ICE(system, diagnostics) \
119 << "TINT_ASSERT(" #system ", " #condition ")"; \
120 } \
Ben Clayton01df2a72021-03-09 13:52:18 +0000121 } while (false)
122
Ben Clayton6b4924f2021-02-17 20:13:34 +0000123#endif // SRC_DEBUG_H_