Coverage Report

Created: 2020-06-26 05:44

/home/arjun/llvm-project/mlir/include/mlir/IR/Diagnostics.h
Line
Count
Source (jump to first uncovered line)
1
//===- Diagnostics.h - MLIR Diagnostics -------------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file defines utilities for emitting diagnostics.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef MLIR_IR_DIAGNOSTICS_H
14
#define MLIR_IR_DIAGNOSTICS_H
15
16
#include "mlir/IR/Location.h"
17
#include <functional>
18
19
namespace llvm {
20
class MemoryBuffer;
21
class SMLoc;
22
class SourceMgr;
23
} // end namespace llvm
24
25
namespace mlir {
26
class DiagnosticEngine;
27
class Identifier;
28
struct LogicalResult;
29
class MLIRContext;
30
class Operation;
31
class OperationName;
32
class Type;
33
34
namespace detail {
35
struct DiagnosticEngineImpl;
36
} // end namespace detail
37
38
/// Defines the different supported severity of a diagnostic.
39
enum class DiagnosticSeverity {
40
  Note,
41
  Warning,
42
  Error,
43
  Remark,
44
};
45
46
//===----------------------------------------------------------------------===//
47
// DiagnosticArgument
48
//===----------------------------------------------------------------------===//
49
50
/// A variant type that holds a single argument for a diagnostic.
51
class DiagnosticArgument {
52
public:
53
  /// Enum that represents the different kinds of diagnostic arguments
54
  /// supported.
55
  enum class DiagnosticArgumentKind {
56
    Attribute,
57
    Double,
58
    Integer,
59
    String,
60
    Type,
61
    Unsigned,
62
  };
63
64
  /// Outputs this argument to a stream.
65
  void print(raw_ostream &os) const;
66
67
  /// Returns the kind of this argument.
68
0
  DiagnosticArgumentKind getKind() const { return kind; }
69
70
  /// Returns this argument as an Attribute.
71
  Attribute getAsAttribute() const;
72
73
  /// Returns this argument as a double.
74
0
  double getAsDouble() const {
75
0
    assert(getKind() == DiagnosticArgumentKind::Double);
76
0
    return doubleVal;
77
0
  }
78
79
  /// Returns this argument as a signed integer.
80
0
  int64_t getAsInteger() const {
81
0
    assert(getKind() == DiagnosticArgumentKind::Integer);
82
0
    return static_cast<int64_t>(opaqueVal);
83
0
  }
84
85
  /// Returns this argument as a string.
86
0
  StringRef getAsString() const {
87
0
    assert(getKind() == DiagnosticArgumentKind::String);
88
0
    return stringVal;
89
0
  }
90
91
  /// Returns this argument as a Type.
92
  Type getAsType() const;
93
94
  /// Returns this argument as an unsigned integer.
95
0
  uint64_t getAsUnsigned() const {
96
0
    assert(getKind() == DiagnosticArgumentKind::Unsigned);
97
0
    return static_cast<uint64_t>(opaqueVal);
98
0
  }
99
100
private:
101
  friend class Diagnostic;
102
103
  // Construct from an Attribute.
104
  explicit DiagnosticArgument(Attribute attr);
105
106
  // Construct from a floating point number.
107
  explicit DiagnosticArgument(double val)
108
0
      : kind(DiagnosticArgumentKind::Double), doubleVal(val) {}
109
0
  explicit DiagnosticArgument(float val) : DiagnosticArgument(double(val)) {}
110
111
  // Construct from a signed integer.
112
  template <typename T>
113
  explicit DiagnosticArgument(
114
      T val, typename std::enable_if<std::is_signed<T>::value &&
115
                                     std::numeric_limits<T>::is_integer &&
116
                                     sizeof(T) <= sizeof(int64_t)>::type * = 0)
117
0
      : kind(DiagnosticArgumentKind::Integer), opaqueVal(int64_t(val)) {}
118
119
  // Construct from an unsigned integer.
120
  template <typename T>
121
  explicit DiagnosticArgument(
122
      T val, typename std::enable_if<std::is_unsigned<T>::value &&
123
                                     std::numeric_limits<T>::is_integer &&
124
                                     sizeof(T) <= sizeof(uint64_t)>::type * = 0)
125
0
      : kind(DiagnosticArgumentKind::Unsigned), opaqueVal(uint64_t(val)) {}
Unexecuted instantiation: _ZN4mlir18DiagnosticArgumentC2IjEET_PNSt9enable_ifIXaaaasr3std11is_unsignedIS2_EE5valuesr3std14numeric_limitsIS2_EE10is_integerlestS2_Lm8EEvE4typeE
Unexecuted instantiation: _ZN4mlir18DiagnosticArgumentC2ImEET_PNSt9enable_ifIXaaaasr3std11is_unsignedIS2_EE5valuesr3std14numeric_limitsIS2_EE10is_integerlestS2_Lm8EEvE4typeE
126
127
  // Construct from a string reference.
128
  explicit DiagnosticArgument(StringRef val)
129
0
      : kind(DiagnosticArgumentKind::String), stringVal(val) {}
130
131
  // Construct from a Type.
132
  explicit DiagnosticArgument(Type val);
133
134
  /// The kind of this argument.
135
  DiagnosticArgumentKind kind;
136
137
  /// The value of this argument.
138
  union {
139
    double doubleVal;
140
    intptr_t opaqueVal;
141
    StringRef stringVal;
142
  };
143
};
144
145
0
inline raw_ostream &operator<<(raw_ostream &os, const DiagnosticArgument &arg) {
146
0
  arg.print(os);
147
0
  return os;
148
0
}
149
150
//===----------------------------------------------------------------------===//
151
// Diagnostic
152
//===----------------------------------------------------------------------===//
153
154
/// This class contains all of the information necessary to report a diagnostic
155
/// to the DiagnosticEngine. It should generally not be constructed directly,
156
/// and instead used transitively via InFlightDiagnostic.
157
class Diagnostic {
158
  using NoteVector = std::vector<std::unique_ptr<Diagnostic>>;
159
160
  /// This class implements a wrapper iterator around NoteVector::iterator to
161
  /// implicitly dereference the unique_ptr.
162
  template <typename IteratorTy, typename NotePtrTy = decltype(*IteratorTy()),
163
            typename ResultTy = decltype(**IteratorTy())>
164
  class NoteIteratorImpl
165
      : public llvm::mapped_iterator<IteratorTy, ResultTy (*)(NotePtrTy)> {
166
0
    static ResultTy &unwrap(NotePtrTy note) { return *note; }
Unexecuted instantiation: _ZN4mlir10Diagnostic16NoteIteratorImplIN9__gnu_cxx17__normal_iteratorIPSt10unique_ptrIS0_St14default_deleteIS0_EESt6vectorIS7_SaIS7_EEEERS7_RS0_E6unwrapESD_
Unexecuted instantiation: _ZN4mlir10Diagnostic16NoteIteratorImplIN9__gnu_cxx17__normal_iteratorIPKSt10unique_ptrIS0_St14default_deleteIS0_EESt6vectorIS7_SaIS7_EEEERS8_RS0_E6unwrapESE_
167
168
  public:
169
    NoteIteratorImpl(IteratorTy it)
170
        : llvm::mapped_iterator<IteratorTy, ResultTy (*)(NotePtrTy)>(it,
171
0
                                                                     &unwrap) {}
172
  };
173
174
public:
175
  Diagnostic(Location loc, DiagnosticSeverity severity)
176
0
      : loc(loc), severity(severity) {}
177
0
  Diagnostic(Diagnostic &&) = default;
178
0
  Diagnostic &operator=(Diagnostic &&) = default;
179
180
  /// Returns the severity of this diagnostic.
181
0
  DiagnosticSeverity getSeverity() const { return severity; }
182
183
  /// Returns the source location for this diagnostic.
184
0
  Location getLocation() const { return loc; }
185
186
  /// Returns the current list of diagnostic arguments.
187
0
  MutableArrayRef<DiagnosticArgument> getArguments() { return arguments; }
188
0
  ArrayRef<DiagnosticArgument> getArguments() const { return arguments; }
189
190
  /// Stream operator for inserting new diagnostic arguments.
191
  template <typename Arg>
192
  typename std::enable_if<!std::is_convertible<Arg, StringRef>::value,
193
                          Diagnostic &>::type
194
0
  operator<<(Arg &&val) {
195
0
    arguments.push_back(DiagnosticArgument(std::forward<Arg>(val)));
196
0
    return *this;
197
0
  }
Unexecuted instantiation: _ZN4mlir10DiagnosticlsImEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS3_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRjEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS4_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsINS_4TypeEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS4_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRNS_9AttributeEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS5_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRKNS_4TypeEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS6_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRNS_10MemRefTypeEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS5_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRlEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS4_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRNS_4TypeEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS5_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIjEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS3_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRNS_10StringAttrEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS5_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRmEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS4_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRNS_10TensorTypeEEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS5_
Unexecuted instantiation: _ZN4mlir10DiagnosticlsIRKjEENSt9enable_ifIXntsr3std14is_convertibleIT_N4llvm9StringRefEEE5valueERS0_E4typeEOS5_
198
199
  /// Stream in a string literal.
200
0
  Diagnostic &operator<<(const char *val) {
201
0
    arguments.push_back(DiagnosticArgument(val));
202
0
    return *this;
203
0
  }
204
205
  /// Stream in a Twine argument.
206
  Diagnostic &operator<<(char val);
207
  Diagnostic &operator<<(const Twine &val);
208
  Diagnostic &operator<<(Twine &&val);
209
210
  /// Stream in an Identifier.
211
  Diagnostic &operator<<(Identifier val);
212
213
  /// Stream in an OperationName.
214
  Diagnostic &operator<<(OperationName val);
215
216
  /// Stream in an Operation.
217
  Diagnostic &operator<<(Operation &val);
218
0
  Diagnostic &operator<<(Operation *val) {
219
0
    return *this << *val;
220
0
  }
221
222
  /// Stream in a range.
223
  template <typename T> Diagnostic &operator<<(iterator_range<T> range) {
224
    return appendRange(range);
225
  }
226
  template <typename T> Diagnostic &operator<<(ArrayRef<T> range) {
227
    return appendRange(range);
228
  }
229
230
  /// Append a range to the diagnostic. The default delimiter between elements
231
  /// is ','.
232
  template <typename T, template <typename> class Container>
233
  Diagnostic &appendRange(const Container<T> &c, const char *delim = ", ") {
234
    llvm::interleave(
235
        c, [this](const auto &a) { *this << a; }, [&]() { *this << delim; });
236
    return *this;
237
  }
238
239
  /// Append arguments to the diagnostic.
240
  template <typename Arg1, typename Arg2, typename... Args>
241
0
  Diagnostic &append(Arg1 &&arg1, Arg2 &&arg2, Args &&... args) {
242
0
    append(std::forward<Arg1>(arg1));
243
0
    return append(std::forward<Arg2>(arg2), std::forward<Args>(args)...);
244
0
  }
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA31_KcN4llvm9StringRefEJRA2_S2_EEERS0_OT_OT0_DpOT1_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIN4llvm9StringRefERA2_KcJEEERS0_OT_OT0_DpOT1_
245
  /// Append one argument to the diagnostic.
246
0
  template <typename Arg> Diagnostic &append(Arg &&arg) {
247
0
    *this << std::forward<Arg>(arg);
248
0
    return *this;
249
0
  }
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRN4llvm9StringRefEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA2_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRKN4llvm5TwineEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA46_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendImEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA33_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA23_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA26_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRjEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA25_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendINS_4TypeEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA62_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA66_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA45_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA28_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA56_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA12_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIN4llvm9StringRefEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA32_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA18_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA38_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA30_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNS_9AttributeEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA43_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA24_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA3_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRKNS_4TypeEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA49_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA77_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA11_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNS_10MemRefTypeEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA16_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA8_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRlEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIPKcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA20_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA70_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA34_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNS_4TypeEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA19_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIjEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA10_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA29_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA41_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA52_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA39_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA61_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA54_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA71_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA31_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNS_10StringAttrEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRmEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA36_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA44_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA42_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA74_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA85_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA53_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA83_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA92_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA103_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNS_10TensorTypeEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA50_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNS_10IdentifierEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA37_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA27_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendINS_13OperationNameEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA6_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA22_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA9_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA17_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRKjEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIN4llvm5TwineEEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA5_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA60_KcEERS0_OT_
Unexecuted instantiation: _ZN4mlir10Diagnostic6appendIRA75_KcEERS0_OT_
250
251
  /// Outputs this diagnostic to a stream.
252
  void print(raw_ostream &os) const;
253
254
  /// Converts the diagnostic to a string.
255
  std::string str() const;
256
257
  /// Attaches a note to this diagnostic. A new location may be optionally
258
  /// provided, if not, then the location defaults to the one specified for this
259
  /// diagnostic. Notes may not be attached to other notes.
260
  Diagnostic &attachNote(Optional<Location> noteLoc = llvm::None);
261
262
  using note_iterator = NoteIteratorImpl<NoteVector::iterator>;
263
  using const_note_iterator = NoteIteratorImpl<NoteVector::const_iterator>;
264
265
  /// Returns the notes held by this diagnostic.
266
0
  iterator_range<note_iterator> getNotes() {
267
0
    return {notes.begin(), notes.end()};
268
0
  }
269
0
  iterator_range<const_note_iterator> getNotes() const {
270
0
    return {notes.begin(), notes.end()};
271
0
  }
272
273
  /// Allow a diagnostic to be converted to 'failure'.
274
  operator LogicalResult() const;
275
276
private:
277
  Diagnostic(const Diagnostic &rhs) = delete;
278
  Diagnostic &operator=(const Diagnostic &rhs) = delete;
279
280
  /// The source location.
281
  Location loc;
282
283
  /// The severity of this diagnostic.
284
  DiagnosticSeverity severity;
285
286
  /// The current list of arguments.
287
  SmallVector<DiagnosticArgument, 4> arguments;
288
289
  /// A list of string values used as arguments. This is used to guarantee the
290
  /// liveness of non-constant strings used in diagnostics.
291
  std::vector<std::unique_ptr<char[]>> strings;
292
293
  /// A list of attached notes.
294
  NoteVector notes;
295
};
296
297
0
inline raw_ostream &operator<<(raw_ostream &os, const Diagnostic &diag) {
298
0
  diag.print(os);
299
0
  return os;
300
0
}
301
302
//===----------------------------------------------------------------------===//
303
// InFlightDiagnostic
304
//===----------------------------------------------------------------------===//
305
306
/// This class represents a diagnostic that is inflight and set to be reported.
307
/// This allows for last minute modifications of the diagnostic before it is
308
/// emitted by a DiagnosticEngine.
309
class InFlightDiagnostic {
310
public:
311
  InFlightDiagnostic() = default;
312
  InFlightDiagnostic(InFlightDiagnostic &&rhs)
313
0
      : owner(rhs.owner), impl(std::move(rhs.impl)) {
314
0
    // Reset the rhs diagnostic.
315
0
    rhs.impl.reset();
316
0
    rhs.abandon();
317
0
  }
318
0
  ~InFlightDiagnostic() {
319
0
    if (isInFlight())
320
0
      report();
321
0
  }
322
323
  /// Stream operator for new diagnostic arguments.
324
0
  template <typename Arg> InFlightDiagnostic &operator<<(Arg &&arg) & {
325
0
    return append(std::forward<Arg>(arg));
326
0
  }
327
0
  template <typename Arg> InFlightDiagnostic &&operator<<(Arg &&arg) && {
328
0
    return std::move(append(std::forward<Arg>(arg)));
329
0
  }
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRN4llvm9StringRefEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA2_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRKN4llvm5TwineEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA46_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsImEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA33_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA23_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA26_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRjEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA25_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsINS_4TypeEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA62_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA66_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA45_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA28_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA56_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA12_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIN4llvm9StringRefEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA32_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA18_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA38_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA30_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNS_9AttributeEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA43_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA24_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA3_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRKNS_4TypeEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA49_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA77_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA11_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNS_10MemRefTypeEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA16_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA8_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRlEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIPKcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA20_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA70_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA34_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNS_4TypeEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA19_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIjEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA10_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA29_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA41_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA52_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA39_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA61_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA54_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA71_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA31_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNS_10StringAttrEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRmEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA36_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA44_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA42_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA74_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA85_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA53_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA83_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA92_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA103_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNS_10TensorTypeEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA50_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNS_10IdentifierEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA37_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA27_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsINS_13OperationNameEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA6_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA22_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA9_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA17_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRKjEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIN4llvm5TwineEEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA5_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA60_KcEEOS0_OT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnosticlsIRA75_KcEEOS0_OT_
330
331
  /// Append arguments to the diagnostic.
332
0
  template <typename... Args> InFlightDiagnostic &append(Args &&... args) & {
333
0
    assert(isActive() && "diagnostic not active");
334
0
    if (isInFlight())
335
0
      impl->append(std::forward<Args>(args)...);
336
0
    return *this;
337
0
  }
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRN4llvm9StringRefEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA2_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRKN4llvm5TwineEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA46_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJmEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA33_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA23_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA26_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRjEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA25_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJNS_4TypeEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA62_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA66_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA45_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA28_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA56_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA12_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJN4llvm9StringRefEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA32_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA18_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA38_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA30_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNS_9AttributeEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA43_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA24_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA3_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRKNS_4TypeEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA49_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA77_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA11_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNS_10MemRefTypeEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA16_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA8_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRlEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJPKcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA20_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA70_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA34_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNS_4TypeEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA19_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJjEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA10_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA29_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA41_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA52_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA39_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA61_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA54_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA71_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA31_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNS_10StringAttrEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRmEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA36_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA44_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA42_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA74_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA85_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA53_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA83_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA92_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA103_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNS_10TensorTypeEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA50_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNS_10IdentifierEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA37_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA27_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJNS_13OperationNameEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA6_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA22_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA9_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA17_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRKjEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJN4llvm5TwineEEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA5_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA60_KcEEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA31_KcN4llvm9StringRefERA2_S2_EEERS0_DpOT_
Unexecuted instantiation: _ZNR4mlir18InFlightDiagnostic6appendIJRA75_KcEEERS0_DpOT_
338
0
  template <typename... Args> InFlightDiagnostic &&append(Args &&... args) && {
339
0
    return std::move(append(std::forward<Args>(args)...));
340
0
  }
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnostic6appendIJRA28_KcEEEOS0_DpOT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnostic6appendIJRA20_KcEEEOS0_DpOT_
Unexecuted instantiation: _ZNO4mlir18InFlightDiagnostic6appendIJRA31_KcN4llvm9StringRefERA2_S2_EEEOS0_DpOT_
341
342
  /// Attaches a note to this diagnostic.
343
0
  Diagnostic &attachNote(Optional<Location> noteLoc = llvm::None) {
344
0
    assert(isActive() && "diagnostic not active");
345
0
    return impl->attachNote(noteLoc);
346
0
  }
347
348
  /// Reports the diagnostic to the engine.
349
  void report();
350
351
  /// Abandons this diagnostic so that it will no longer be reported.
352
  void abandon();
353
354
  /// Allow an inflight diagnostic to be converted to 'failure', otherwise
355
  /// 'success' if this is an empty diagnostic.
356
  operator LogicalResult() const;
357
358
private:
359
  InFlightDiagnostic &operator=(const InFlightDiagnostic &) = delete;
360
  InFlightDiagnostic &operator=(InFlightDiagnostic &&) = delete;
361
  InFlightDiagnostic(DiagnosticEngine *owner, Diagnostic &&rhs)
362
0
      : owner(owner), impl(std::move(rhs)) {}
363
364
  /// Returns if the diagnostic is still active, i.e. it has a live diagnostic.
365
0
  bool isActive() const { return impl.hasValue(); }
366
367
  /// Returns if the diagnostic is still in flight to be reported.
368
0
  bool isInFlight() const { return owner; }
369
370
  // Allow access to the constructor.
371
  friend DiagnosticEngine;
372
373
  /// The engine that this diagnostic is to report to.
374
  DiagnosticEngine *owner = nullptr;
375
376
  /// The raw diagnostic that is inflight to be reported.
377
  Optional<Diagnostic> impl;
378
};
379
380
//===----------------------------------------------------------------------===//
381
// DiagnosticEngine
382
//===----------------------------------------------------------------------===//
383
384
/// This class is the main interface for diagnostics. The DiagnosticEngine
385
/// manages the registration of diagnostic handlers as well as the core API for
386
/// diagnostic emission. This class should not be constructed directly, but
387
/// instead interfaced with via an MLIRContext instance.
388
class DiagnosticEngine {
389
public:
390
  ~DiagnosticEngine();
391
392
  // Diagnostic handler registration and use. MLIR supports the ability for the
393
  // IR to carry arbitrary metadata about operation location information. If a
394
  // problem is detected by the compiler, it can invoke the emitError /
395
  // emitWarning / emitRemark method on an Operation and have it get reported
396
  // through this interface.
397
  //
398
  // Tools using MLIR are encouraged to register error handlers and define a
399
  // schema for their location information.  If they don't, then warnings and
400
  // notes will be dropped and errors will be emitted to errs.
401
402
  /// The handler type for MLIR diagnostics. This function takes a diagnostic as
403
  /// input, and returns success if the handler has fully processed this
404
  /// diagnostic. Returns failure otherwise.
405
  using HandlerTy = std::function<LogicalResult(Diagnostic &)>;
406
407
  /// A handle to a specific registered handler object.
408
  using HandlerID = uint64_t;
409
410
  /// Register a new handler for diagnostics to the engine. Diagnostics are
411
  /// process by handlers in stack-like order, meaning that the last added
412
  /// handlers will process diagnostics first. This function returns a unique
413
  /// identifier for the registered handler, which can be used to unregister
414
  /// this handler at a later time.
415
  HandlerID registerHandler(const HandlerTy &handler);
416
417
  /// Set the diagnostic handler with a function that returns void. This is a
418
  /// convenient wrapper for handlers that always completely process the given
419
  /// diagnostic.
420
  template <typename FuncTy, typename RetT = decltype(std::declval<FuncTy>()(
421
                                 std::declval<Diagnostic &>()))>
422
  std::enable_if_t<std::is_same<RetT, void>::value, HandlerID>
423
0
  registerHandler(FuncTy &&handler) {
424
0
    return registerHandler([=](Diagnostic &diag) {
425
0
      handler(diag);
426
0
      return success();
427
0
    });
Unexecuted instantiation: Diagnostics.cpp:_ZZN4mlir16DiagnosticEngine15registerHandlerIZNS_26SourceMgrDiagnosticHandlerC1ERN4llvm9SourceMgrEPNS_11MLIRContextERNS3_11raw_ostreamEE3$_0vEENSt9enable_ifIXsr3std7is_sameIT0_vEE5valueEmE4typeEOT_ENKUlRNS_10DiagnosticEE_clESI_
Unexecuted instantiation: Diagnostics.cpp:_ZZN4mlir16DiagnosticEngine15registerHandlerIZNS_34SourceMgrDiagnosticVerifierHandlerC1ERN4llvm9SourceMgrEPNS_11MLIRContextERNS3_11raw_ostreamEE3$_1vEENSt9enable_ifIXsr3std7is_sameIT0_vEE5valueEmE4typeEOT_ENKUlRNS_10DiagnosticEE_clESI_
428
0
  }
Unexecuted instantiation: Diagnostics.cpp:_ZN4mlir16DiagnosticEngine15registerHandlerIZNS_26SourceMgrDiagnosticHandlerC1ERN4llvm9SourceMgrEPNS_11MLIRContextERNS3_11raw_ostreamEE3$_0vEENSt9enable_ifIXsr3std7is_sameIT0_vEE5valueEmE4typeEOT_
Unexecuted instantiation: Diagnostics.cpp:_ZN4mlir16DiagnosticEngine15registerHandlerIZNS_34SourceMgrDiagnosticVerifierHandlerC1ERN4llvm9SourceMgrEPNS_11MLIRContextERNS3_11raw_ostreamEE3$_1vEENSt9enable_ifIXsr3std7is_sameIT0_vEE5valueEmE4typeEOT_
429
430
  /// Erase the registered diagnostic handler with the given identifier.
431
  void eraseHandler(HandlerID id);
432
433
  /// Create a new inflight diagnostic with the given location and severity.
434
0
  InFlightDiagnostic emit(Location loc, DiagnosticSeverity severity) {
435
0
    assert(severity != DiagnosticSeverity::Note &&
436
0
           "notes should not be emitted directly");
437
0
    return InFlightDiagnostic(this, Diagnostic(loc, severity));
438
0
  }
439
440
  /// Emit a diagnostic using the registered issue handler if present, or with
441
  /// the default behavior if not.
442
  void emit(Diagnostic diag);
443
444
private:
445
  friend class MLIRContextImpl;
446
  DiagnosticEngine();
447
448
  /// The internal implementation of the DiagnosticEngine.
449
  std::unique_ptr<detail::DiagnosticEngineImpl> impl;
450
};
451
452
/// Utility method to emit an error message using this location.
453
InFlightDiagnostic emitError(Location loc);
454
InFlightDiagnostic emitError(Location loc, const Twine &message);
455
456
/// Utility method to emit a warning message using this location.
457
InFlightDiagnostic emitWarning(Location loc);
458
InFlightDiagnostic emitWarning(Location loc, const Twine &message);
459
460
/// Utility method to emit a remark message using this location.
461
InFlightDiagnostic emitRemark(Location loc);
462
InFlightDiagnostic emitRemark(Location loc, const Twine &message);
463
464
/// Overloads of the above emission functions that take an optionally null
465
/// location. If the location is null, no diagnostic is emitted and a failure is
466
/// returned. Given that the provided location may be null, these methods take
467
/// the diagnostic arguments directly instead of relying on the returned
468
/// InFlightDiagnostic.
469
template <typename... Args>
470
0
LogicalResult emitOptionalError(Optional<Location> loc, Args &&... args) {
471
0
  if (loc)
472
0
    return emitError(*loc).append(std::forward<Args>(args)...);
473
0
  return failure();
474
0
}
Unexecuted instantiation: _ZN4mlir17emitOptionalErrorIJRA28_KcEEENS_13LogicalResultEN4llvm8OptionalINS_8LocationEEEDpOT_
Unexecuted instantiation: _ZN4mlir17emitOptionalErrorIJRA20_KcEEENS_13LogicalResultEN4llvm8OptionalINS_8LocationEEEDpOT_
475
template <typename... Args>
476
LogicalResult emitOptionalWarning(Optional<Location> loc, Args &&... args) {
477
  if (loc)
478
    return emitWarning(*loc).append(std::forward<Args>(args)...);
479
  return failure();
480
}
481
template <typename... Args>
482
LogicalResult emitOptionalRemark(Optional<Location> loc, Args &&... args) {
483
  if (loc)
484
    return emitRemark(*loc).append(std::forward<Args>(args)...);
485
  return failure();
486
}
487
488
//===----------------------------------------------------------------------===//
489
// ScopedDiagnosticHandler
490
//===----------------------------------------------------------------------===//
491
492
/// This diagnostic handler is a simple RAII class that registers and erases a
493
/// diagnostic handler on a given context. This class can be either be used
494
/// directly, or in conjunction with a derived diagnostic handler.
495
class ScopedDiagnosticHandler {
496
public:
497
0
  explicit ScopedDiagnosticHandler(MLIRContext *ctx) : handlerID(0), ctx(ctx) {}
498
  template <typename FuncTy>
499
  ScopedDiagnosticHandler(MLIRContext *ctx, FuncTy &&handler)
500
      : handlerID(0), ctx(ctx) {
501
    setHandler(std::forward<FuncTy>(handler));
502
  }
503
  ~ScopedDiagnosticHandler();
504
505
protected:
506
  /// Set the handler to manage via RAII.
507
0
  template <typename FuncTy> void setHandler(FuncTy &&handler) {
508
0
    auto &diagEngine = ctx->getDiagEngine();
509
0
    if (handlerID)
510
0
      diagEngine.eraseHandler(handlerID);
511
0
    handlerID = diagEngine.registerHandler(std::forward<FuncTy>(handler));
512
0
  }
Unexecuted instantiation: Diagnostics.cpp:_ZN4mlir23ScopedDiagnosticHandler10setHandlerIZNS_26SourceMgrDiagnosticHandlerC1ERN4llvm9SourceMgrEPNS_11MLIRContextERNS3_11raw_ostreamEE3$_0EEvOT_
Unexecuted instantiation: Diagnostics.cpp:_ZN4mlir23ScopedDiagnosticHandler10setHandlerIZNS_34SourceMgrDiagnosticVerifierHandlerC1ERN4llvm9SourceMgrEPNS_11MLIRContextERNS3_11raw_ostreamEE3$_1EEvOT_
513
514
private:
515
  /// The unique id for the scoped handler.
516
  DiagnosticEngine::HandlerID handlerID;
517
518
  /// The context to erase the handler from.
519
  MLIRContext *ctx;
520
};
521
522
//===----------------------------------------------------------------------===//
523
// SourceMgrDiagnosticHandler
524
//===----------------------------------------------------------------------===//
525
526
namespace detail {
527
struct SourceMgrDiagnosticHandlerImpl;
528
} // end namespace detail
529
530
/// This class is a utility diagnostic handler for use with llvm::SourceMgr.
531
class SourceMgrDiagnosticHandler : public ScopedDiagnosticHandler {
532
public:
533
  SourceMgrDiagnosticHandler(llvm::SourceMgr &mgr, MLIRContext *ctx,
534
                             raw_ostream &os);
535
  SourceMgrDiagnosticHandler(llvm::SourceMgr &mgr, MLIRContext *ctx);
536
  ~SourceMgrDiagnosticHandler();
537
538
  /// Emit the given diagnostic information with the held source manager.
539
  void emitDiagnostic(Location loc, Twine message, DiagnosticSeverity kind,
540
                      bool displaySourceLine = true);
541
542
protected:
543
  /// Emit the given diagnostic with the held source manager.
544
  void emitDiagnostic(Diagnostic &diag);
545
546
  /// Get a memory buffer for the given file, or nullptr if no file is
547
  /// available.
548
  const llvm::MemoryBuffer *getBufferForFile(StringRef filename);
549
550
  /// The source manager that we are wrapping.
551
  llvm::SourceMgr &mgr;
552
553
  /// The output stream to use when printing diagnostics.
554
  raw_ostream &os;
555
556
private:
557
  /// Convert a location into the given memory buffer into an SMLoc.
558
  llvm::SMLoc convertLocToSMLoc(FileLineColLoc loc);
559
560
  /// The maximum depth that a call stack will be printed.
561
  /// TODO(riverriddle) This should be a tunable flag.
562
  unsigned callStackLimit = 10;
563
564
  std::unique_ptr<detail::SourceMgrDiagnosticHandlerImpl> impl;
565
};
566
567
//===----------------------------------------------------------------------===//
568
// SourceMgrDiagnosticVerifierHandler
569
//===----------------------------------------------------------------------===//
570
571
namespace detail {
572
struct SourceMgrDiagnosticVerifierHandlerImpl;
573
} // end namespace detail
574
575
/// This class is a utility diagnostic handler for use with llvm::SourceMgr that
576
/// verifies that emitted diagnostics match 'expected-*' lines on the
577
/// corresponding line of the source file.
578
class SourceMgrDiagnosticVerifierHandler : public SourceMgrDiagnosticHandler {
579
public:
580
  SourceMgrDiagnosticVerifierHandler(llvm::SourceMgr &srcMgr, MLIRContext *ctx,
581
                                     raw_ostream &out);
582
  SourceMgrDiagnosticVerifierHandler(llvm::SourceMgr &srcMgr, MLIRContext *ctx);
583
  ~SourceMgrDiagnosticVerifierHandler();
584
585
  /// Returns the status of the handler and verifies that all expected
586
  /// diagnostics were emitted. This return success if all diagnostics were
587
  /// verified correctly, failure otherwise.
588
  LogicalResult verify();
589
590
private:
591
  /// Process a single diagnostic.
592
  void process(Diagnostic &diag);
593
594
  /// Process a FileLineColLoc diagnostic.
595
  void process(FileLineColLoc loc, StringRef msg, DiagnosticSeverity kind);
596
597
  std::unique_ptr<detail::SourceMgrDiagnosticVerifierHandlerImpl> impl;
598
};
599
600
//===----------------------------------------------------------------------===//
601
// ParallelDiagnosticHandler
602
//===----------------------------------------------------------------------===//
603
604
namespace detail {
605
struct ParallelDiagnosticHandlerImpl;
606
} // end namespace detail
607
608
/// This class is a utility diagnostic handler for use when multi-threading some
609
/// part of the compiler where diagnostics may be emitted. This handler ensures
610
/// a deterministic ordering to the emitted diagnostics that mirrors that of a
611
/// single-threaded compilation.
612
class ParallelDiagnosticHandler {
613
public:
614
  ParallelDiagnosticHandler(MLIRContext *ctx);
615
  ~ParallelDiagnosticHandler();
616
617
  /// Set the order id for the current thread. This is required to be set by
618
  /// each thread that will be emitting diagnostics to this handler. The orderID
619
  /// corresponds to the order in which diagnostics would be emitted when
620
  /// executing synchronously. For example, if we were processing a list
621
  /// of operations [a, b, c] on a single-thread. Diagnostics emitted while
622
  /// processing operation 'a' would be emitted before those for 'b' or 'c'.
623
  /// This corresponds 1-1 with the 'orderID'. The thread that is processing 'a'
624
  /// should set the orderID to '0'; the thread processing 'b' should set it to
625
  /// '1'; and so on and so forth. This provides a way for the handler to
626
  /// deterministically order the diagnostics that it receives given the thread
627
  /// that it is receiving on.
628
  void setOrderIDForThread(size_t orderID);
629
630
  /// Remove the order id for the current thread. This removes the thread from
631
  /// diagnostics tracking.
632
  void eraseOrderIDForThread();
633
634
private:
635
  std::unique_ptr<detail::ParallelDiagnosticHandlerImpl> impl;
636
};
637
} // namespace mlir
638
639
#endif