LLVM 22.0.0git
DiagnosticInfo.h
Go to the documentation of this file.
1//===- llvm/IR/DiagnosticInfo.h - Diagnostic Declaration --------*- 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 declares the different classes involved in low level diagnostics.
10//
11// Diagnostics reporting is still done as part of the LLVMContext.
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_IR_DIAGNOSTICINFO_H
15#define LLVM_IR_DIAGNOSTICINFO_H
16
17#include "llvm-c/Types.h"
18#include "llvm/ADT/ArrayRef.h"
20#include "llvm/ADT/StringRef.h"
21#include "llvm/ADT/Twine.h"
22#include "llvm/IR/DebugLoc.h"
29#include <cstdint>
30#include <functional>
31#include <optional>
32#include <string>
33#include <utility>
34
35namespace llvm {
36
37// Forward declarations.
39class DIFile;
40class DISubprogram;
41class CallInst;
42class Function;
43class Instruction;
44class InstructionCost;
45class Module;
46class Type;
47class Value;
48
49/// Defines the different supported severity of a diagnostic.
50enum DiagnosticSeverity : char {
54 // A note attaches additional information to one of the previous diagnostic
55 // types.
57};
58
59/// Defines the different supported kind of a diagnostic.
60/// This enum should be extended with a new ID for each added concrete subclass.
98
99/// Get the next available kind ID for a plugin diagnostic.
100/// Each time this function is called, it returns a different number.
101/// Therefore, a plugin that wants to "identify" its own classes
102/// with a dynamic identifier, just have to use this method to get a new ID
103/// and assign it to each of its classes.
104/// The returned ID will be greater than or equal to DK_FirstPluginKind.
105/// Thus, the plugin identifiers will not conflict with the
106/// DiagnosticKind values.
108
109/// This is the base abstract class for diagnostic reporting in
110/// the backend.
111/// The print method must be overloaded by the subclasses to print a
112/// user-friendly message in the client of the backend (let us call it a
113/// frontend).
115private:
116 /// Kind defines the kind of report this is about.
117 const /* DiagnosticKind */ int Kind;
118 /// Severity gives the severity of the diagnostic.
119 const DiagnosticSeverity Severity;
120
121 virtual void anchor();
122public:
123 DiagnosticInfo(/* DiagnosticKind */ int Kind, DiagnosticSeverity Severity)
124 : Kind(Kind), Severity(Severity) {}
125
126 virtual ~DiagnosticInfo() = default;
127
128 /* DiagnosticKind */ int getKind() const { return Kind; }
129 DiagnosticSeverity getSeverity() const { return Severity; }
130
131 /// Print using the given \p DP a user-friendly message.
132 /// This is the default message that will be printed to the user.
133 /// It is used when the frontend does not directly take advantage
134 /// of the information contained in fields of the subclasses.
135 /// The printed message must not end with '.' nor start with a severity
136 /// keyword.
137 virtual void print(DiagnosticPrinter &DP) const = 0;
138};
139
140using DiagnosticHandlerFunction = std::function<void(const DiagnosticInfo &)>;
141
143 const Twine &MsgStr;
144 const Instruction *Inst = nullptr;
145
146public:
147 /// \p MsgStr is the message to be reported to the frontend.
148 /// This class does not copy \p MsgStr, therefore the reference must be valid
149 /// for the whole life time of the Diagnostic.
151 DiagnosticSeverity Severity = DS_Error)
152 : DiagnosticInfo(DK_Generic, Severity), MsgStr(MsgStr) {}
153
155 const Twine &ErrMsg LLVM_LIFETIME_BOUND,
156 DiagnosticSeverity Severity = DS_Error)
157 : DiagnosticInfo(DK_Generic, Severity), MsgStr(ErrMsg), Inst(I) {}
158
159 const Twine &getMsgStr() const { return MsgStr; }
160 const Instruction *getInstruction() const { return Inst; }
161
162 /// \see DiagnosticInfo::print.
163 void print(DiagnosticPrinter &DP) const override;
164
165 static bool classof(const DiagnosticInfo *DI) {
166 return DI->getKind() == DK_Generic;
167 }
168};
169
170/// Diagnostic information for inline asm reporting.
171/// This is basically a message and an optional location.
173private:
174 /// Optional line information. 0 if not set.
175 uint64_t LocCookie = 0;
176 /// Message to be reported.
177 const Twine &MsgStr;
178 /// Optional origin of the problem.
179 const Instruction *Instr = nullptr;
180
181public:
182 /// \p LocCookie if non-zero gives the line number for this report.
183 /// \p MsgStr gives the message.
184 /// This class does not copy \p MsgStr, therefore the reference must be valid
185 /// for the whole life time of the Diagnostic.
187 const Twine &MsgStr LLVM_LIFETIME_BOUND,
188 DiagnosticSeverity Severity = DS_Error);
189
190 /// \p Instr gives the original instruction that triggered the diagnostic.
191 /// \p MsgStr gives the message.
192 /// This class does not copy \p MsgStr, therefore the reference must be valid
193 /// for the whole life time of the Diagnostic.
194 /// Same for \p I.
196 const Twine &MsgStr LLVM_LIFETIME_BOUND,
197 DiagnosticSeverity Severity = DS_Error);
198
199 uint64_t getLocCookie() const { return LocCookie; }
200 const Twine &getMsgStr() const { return MsgStr; }
201 const Instruction *getInstruction() const { return Instr; }
202
203 /// \see DiagnosticInfo::print.
204 void print(DiagnosticPrinter &DP) const override;
205
206 static bool classof(const DiagnosticInfo *DI) {
207 return DI->getKind() == DK_InlineAsm;
208 }
209};
210
211/// Diagnostic information for debug metadata version reporting.
212/// This is basically a module and a version.
214private:
215 /// The module that is concerned by this debug metadata version diagnostic.
216 const Module &M;
217 /// The actual metadata version.
218 unsigned MetadataVersion;
219
220public:
221 /// \p The module that is concerned by this debug metadata version diagnostic.
222 /// \p The actual metadata version.
223 DiagnosticInfoDebugMetadataVersion(const Module &M, unsigned MetadataVersion,
225 : DiagnosticInfo(DK_DebugMetadataVersion, Severity), M(M),
226 MetadataVersion(MetadataVersion) {}
227
228 const Module &getModule() const { return M; }
229 unsigned getMetadataVersion() const { return MetadataVersion; }
230
231 /// \see DiagnosticInfo::print.
232 void print(DiagnosticPrinter &DP) const override;
233
234 static bool classof(const DiagnosticInfo *DI) {
235 return DI->getKind() == DK_DebugMetadataVersion;
236 }
237};
238
239/// Diagnostic information for stripping invalid debug metadata.
241 : public DiagnosticInfo {
242private:
243 /// The module that is concerned by this debug metadata version diagnostic.
244 const Module &M;
245
246public:
247 /// \p The module that is concerned by this debug metadata version diagnostic.
251
252 const Module &getModule() const { return M; }
253
254 /// \see DiagnosticInfo::print.
255 void print(DiagnosticPrinter &DP) const override;
256
257 static bool classof(const DiagnosticInfo *DI) {
258 return DI->getKind() == DK_DebugMetadataInvalid;
259 }
260};
261
262/// Diagnostic information for the sample profiler.
264public:
265 DiagnosticInfoSampleProfile(StringRef FileName, unsigned LineNum,
266 const Twine &Msg LLVM_LIFETIME_BOUND,
267 DiagnosticSeverity Severity = DS_Error)
268 : DiagnosticInfo(DK_SampleProfile, Severity), FileName(FileName),
269 LineNum(LineNum), Msg(Msg) {}
271 const Twine &Msg LLVM_LIFETIME_BOUND,
272 DiagnosticSeverity Severity = DS_Error)
273 : DiagnosticInfo(DK_SampleProfile, Severity), FileName(FileName),
274 Msg(Msg) {}
278
279 /// \see DiagnosticInfo::print.
280 void print(DiagnosticPrinter &DP) const override;
281
282 static bool classof(const DiagnosticInfo *DI) {
283 return DI->getKind() == DK_SampleProfile;
284 }
285
286 StringRef getFileName() const { return FileName; }
287 unsigned getLineNum() const { return LineNum; }
288 const Twine &getMsg() const { return Msg; }
289
290private:
291 /// Name of the input file associated with this diagnostic.
292 StringRef FileName;
293
294 /// Line number where the diagnostic occurred. If 0, no line number will
295 /// be emitted in the message.
296 unsigned LineNum = 0;
297
298 /// Message to report.
299 const Twine &Msg;
300};
301
302/// Diagnostic information for the PGO profiler.
304public:
305 DiagnosticInfoPGOProfile(const char *FileName,
306 const Twine &Msg LLVM_LIFETIME_BOUND,
307 DiagnosticSeverity Severity = DS_Error)
308 : DiagnosticInfo(DK_PGOProfile, Severity), FileName(FileName), Msg(Msg) {}
309
310 /// \see DiagnosticInfo::print.
311 void print(DiagnosticPrinter &DP) const override;
312
313 static bool classof(const DiagnosticInfo *DI) {
314 return DI->getKind() == DK_PGOProfile;
315 }
316
317 const char *getFileName() const { return FileName; }
318 const Twine &getMsg() const { return Msg; }
319
320private:
321 /// Name of the input file associated with this diagnostic.
322 const char *FileName;
323
324 /// Message to report.
325 const Twine &Msg;
326};
327
329 DIFile *File = nullptr;
330 unsigned Line = 0;
331 unsigned Column = 0;
332
333public:
337
338 bool isValid() const { return File; }
339 /// Return the full path to the file.
340 LLVM_ABI std::string getAbsolutePath() const;
341 /// Return the file name relative to the compilation directory.
343 unsigned getLine() const { return Line; }
344 unsigned getColumn() const { return Column; }
345};
346
347/// Common features for diagnostics with an associated location.
349 void anchor() override;
350public:
351 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
352 /// the location information to use in the diagnostic.
354 enum DiagnosticSeverity Severity,
355 const Function &Fn,
356 const DiagnosticLocation &Loc)
357 : DiagnosticInfo(Kind, Severity), Fn(Fn), Loc(Loc) {}
358
359 /// Return true if location information is available for this diagnostic.
360 bool isLocationAvailable() const { return Loc.isValid(); }
361
362 /// Return a string with the location information for this diagnostic
363 /// in the format "file:line:col". If location information is not available,
364 /// it returns "<unknown>:0:0".
365 std::string getLocationStr() const;
366
367 /// Return location information for this diagnostic in three parts:
368 /// the relative source file path, line number and column.
369 void getLocation(StringRef &RelativePath, unsigned &Line,
370 unsigned &Column) const;
371
372 /// Return the absolute path tot the file.
373 std::string getAbsolutePath() const;
374
375 const Function &getFunction() const { return Fn; }
376 DiagnosticLocation getLocation() const { return Loc; }
377
378private:
379 /// Function where this diagnostic is triggered.
380 const Function &Fn;
381
382 /// Debug location where this diagnostic is triggered.
384};
385
388private:
389 /// Message to be reported.
390 const Twine &MsgStr;
391
392public:
394 const Function &Fn,
395 const DiagnosticLocation &Loc,
396 DiagnosticSeverity Severity = DS_Error)
398 Loc),
399 MsgStr(MsgStr) {}
400
401 const Twine &getMsgStr() const { return MsgStr; }
402
403 void print(DiagnosticPrinter &DP) const override;
404
405 static bool classof(const DiagnosticInfo *DI) {
406 return DI->getKind() == DK_LegalizationFailure;
407 }
408};
409
412private:
413 /// Message to be reported.
414 const Twine &MsgStr;
415
416public:
417 /// \p MsgStr is the message to be reported to the frontend.
418 /// This class does not copy \p MsgStr, therefore the reference must be valid
419 /// for the whole life time of the Diagnostic.
421 const DiagnosticLocation &Loc,
422 DiagnosticSeverity Severity = DS_Error)
424 MsgStr(MsgStr) {}
425
426 const Twine &getMsgStr() const { return MsgStr; }
427
428 /// \see DiagnosticInfo::print.
429 void print(DiagnosticPrinter &DP) const override;
430
431 static bool classof(const DiagnosticInfo *DI) {
432 return DI->getKind() == DK_GenericWithLoc;
433 }
434};
435
438private:
439 /// Message to be reported.
440 const Twine &MsgStr;
441
442public:
443 /// \p MsgStr is the message to be reported to the frontend.
444 /// This class does not copy \p MsgStr, therefore the reference must be valid
445 /// for the whole life time of the Diagnostic.
446 DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn,
447 const DiagnosticLocation &DL,
448 DiagnosticSeverity Severity = DS_Error);
449
450 DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn,
451 DiagnosticSeverity Severity = DS_Error);
452
453 const Twine &getMsgStr() const { return MsgStr; }
454
455 /// \see DiagnosticInfo::print.
456 void print(DiagnosticPrinter &DP) const override;
457
458 static bool classof(const DiagnosticInfo *DI) {
459 return DI->getKind() == DK_RegAllocFailure;
460 }
461};
462
463/// Diagnostic information for stack size etc. reporting.
464/// This is basically a function and a size.
467private:
468 /// The function that is concerned by this resource limit diagnostic.
469 const Function &Fn;
470
471 /// Description of the resource type (e.g. stack size)
472 const char *ResourceName;
473
474 /// The computed size usage
475 uint64_t ResourceSize;
476
477 // Threshould passed
478 uint64_t ResourceLimit;
479
480public:
481 /// \p The function that is concerned by this stack size diagnostic.
482 /// \p The computed stack size.
483 DiagnosticInfoResourceLimit(const Function &Fn, const char *ResourceName,
484 uint64_t ResourceSize, uint64_t ResourceLimit,
487
488 const Function &getFunction() const { return Fn; }
489 const char *getResourceName() const { return ResourceName; }
490 uint64_t getResourceSize() const { return ResourceSize; }
491 uint64_t getResourceLimit() const { return ResourceLimit; }
492
493 /// \see DiagnosticInfo::print.
494 void print(DiagnosticPrinter &DP) const override;
495
496 static bool classof(const DiagnosticInfo *DI) {
497 return DI->getKind() == DK_ResourceLimit || DI->getKind() == DK_StackSize;
498 }
499};
500
502 void anchor() override;
503
504public:
506 uint64_t StackLimit,
508 : DiagnosticInfoResourceLimit(Fn, "stack frame size", StackSize,
509 StackLimit, Severity, DK_StackSize) {}
510
513
514 static bool classof(const DiagnosticInfo *DI) {
515 return DI->getKind() == DK_StackSize;
516 }
517};
518
519/// Common features for diagnostics dealing with optimization remarks
520/// that are used by both IR and MIR passes.
523public:
524 /// Used to set IsVerbose via the stream interface.
525 struct setIsVerbose {};
526
527 /// When an instance of this is inserted into the stream, the arguments
528 /// following will not appear in the remark printed in the compiler output
529 /// (-Rpass) but only in the optimization record file
530 /// (-fsave-optimization-record).
531 struct setExtraArgs {};
532
533 /// Used in the streaming interface as the general argument type. It
534 /// internally converts everything into a key-value pair.
535 struct Argument {
536 std::string Key;
537 std::string Val;
538 // If set, the debug location corresponding to the value.
540
541 explicit Argument(StringRef Str = "") : Key("String"), Val(Str) {}
545 Argument(StringRef Key, const char *S) : Argument(Key, StringRef(S)) {};
549 LLVM_ABI Argument(StringRef Key, long long N);
550 LLVM_ABI Argument(StringRef Key, unsigned N);
551 LLVM_ABI Argument(StringRef Key, unsigned long N);
552 LLVM_ABI Argument(StringRef Key, unsigned long long N);
554 Argument(StringRef Key, bool B) : Key(Key), Val(B ? "true" : "false") {}
558 };
559
560 /// \p PassName is the name of the pass emitting this diagnostic. \p
561 /// RemarkName is a textual identifier for the remark (single-word,
562 /// CamelCase). \p Fn is the function where the diagnostic is being emitted.
563 /// \p Loc is the location information to use in the diagnostic. If line table
564 /// information is available, the diagnostic will include the source code
565 /// location.
567 enum DiagnosticSeverity Severity,
568 const char *PassName, StringRef RemarkName,
569 const Function &Fn,
570 const DiagnosticLocation &Loc)
571 : DiagnosticInfoWithLocationBase(Kind, Severity, Fn, Loc),
573
574 void insert(StringRef S);
575 void insert(Argument A);
576 void insert(setIsVerbose V);
577 void insert(setExtraArgs EA);
578
579 /// \see DiagnosticInfo::print.
580 void print(DiagnosticPrinter &DP) const override;
581
582 /// Return true if this optimization remark is enabled by one of
583 /// of the LLVM command line flags (-pass-remarks, -pass-remarks-missed,
584 /// or -pass-remarks-analysis). Note that this only handles the LLVM
585 /// flags. We cannot access Clang flags from here (they are handled
586 /// in BackendConsumer::OptimizationRemarkHandler).
587 virtual bool isEnabled() const = 0;
588
589 StringRef getPassName() const { return PassName; }
591 std::string getMsg() const;
592 std::optional<uint64_t> getHotness() const { return Hotness; }
593 void setHotness(std::optional<uint64_t> H) { Hotness = H; }
594
595 bool isVerbose() const { return IsVerbose; }
596
597 ArrayRef<Argument> getArgs() const { return Args; }
598
599 static bool classof(const DiagnosticInfo *DI) {
600 return (DI->getKind() >= DK_FirstRemark &&
601 DI->getKind() <= DK_LastRemark) ||
602 (DI->getKind() >= DK_FirstMachineRemark &&
604 }
605
606 bool isPassed() const {
607 return (getKind() == DK_OptimizationRemark ||
609 }
610
611 bool isMissed() const {
614 }
615
620
621protected:
622 /// Name of the pass that triggers this report. If this matches the
623 /// regular expression given in -Rpass=regexp, then the remark will
624 /// be emitted.
625 const char *PassName;
626
627 /// Textual identifier for the remark (single-word, CamelCase). Can be used
628 /// by external tools reading the output file for optimization remarks to
629 /// identify the remark.
631
632 /// If profile information is available, this is the number of times the
633 /// corresponding code was executed in a profile instrumentation run.
634 std::optional<uint64_t> Hotness;
635
636 /// Arguments collected via the streaming interface.
638
639 /// The remark is expected to be noisy.
640 bool IsVerbose = false;
641
642 /// If positive, the index of the first argument that only appear in
643 /// the optimization records and not in the remark printed in the compiler
644 /// output.
646};
647
648/// Allow the insertion operator to return the actual remark type rather than a
649/// common base class. This allows returning the result of the insertion
650/// directly by value, e.g. return OptimizationRemarkAnalysis(...) << "blah".
651template <class RemarkT>
652decltype(auto)
653operator<<(RemarkT &&R,
654 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
655 std::remove_reference_t<RemarkT>>,
656 StringRef>
657 S) {
658 R.insert(S);
659 return std::forward<RemarkT>(R);
660}
661
662template <class RemarkT>
663decltype(auto)
664operator<<(RemarkT &&R,
665 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
666 std::remove_reference_t<RemarkT>>,
668 A) {
669 R.insert(A);
670 return std::forward<RemarkT>(R);
671}
672
673template <class RemarkT>
674decltype(auto)
675operator<<(RemarkT &&R,
676 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
677 std::remove_reference_t<RemarkT>>,
679 V) {
680 R.insert(V);
681 return std::forward<RemarkT>(R);
682}
683
684template <class RemarkT>
685decltype(auto)
686operator<<(RemarkT &&R,
687 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
688 std::remove_reference_t<RemarkT>>,
690 EA) {
691 R.insert(EA);
692 return std::forward<RemarkT>(R);
693}
694
695/// Common features for diagnostics dealing with optimization remarks
696/// that are used by IR passes.
699 void anchor() override;
700public:
701 /// \p PassName is the name of the pass emitting this diagnostic. \p
702 /// RemarkName is a textual identifier for the remark (single-word,
703 /// CamelCase). \p Fn is the function where the diagnostic is being emitted.
704 /// \p Loc is the location information to use in the diagnostic. If line table
705 /// information is available, the diagnostic will include the source code
706 /// location. \p CodeRegion is IR value that the optimization operates on.
707 /// This is currently used to provide run-time hotness information with PGO.
709 enum DiagnosticSeverity Severity,
710 const char *PassName, StringRef RemarkName,
711 const Function &Fn,
712 const DiagnosticLocation &Loc,
713 const BasicBlock *CodeRegion = nullptr)
715 Loc),
716 CodeRegion(CodeRegion) {}
717
718 /// This is ctor variant allows a pass to build an optimization remark
719 /// from an existing remark.
720 ///
721 /// This is useful when a transformation pass (e.g LV) wants to emit a remark
722 /// (\p Orig) generated by one of its analyses (e.g. LAA) as its own analysis
723 /// remark. The string \p Prepend will be emitted before the original
724 /// message.
729 Orig.RemarkName, Orig.getFunction(), Orig.getLocation()),
730 CodeRegion(Orig.getCodeRegion()) {
731 *this << Prepend;
733 }
734
735 /// Legacy interface.
736 /// \p PassName is the name of the pass emitting this diagnostic.
737 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
738 /// the location information to use in the diagnostic. If line table
739 /// information is available, the diagnostic will include the source code
740 /// location. \p Msg is the message to show. Note that this class does not
741 /// copy this message, so this reference must be valid for the whole life time
742 /// of the diagnostic.
744 enum DiagnosticSeverity Severity,
745 const char *PassName, const Function &Fn,
746 const DiagnosticLocation &Loc, const Twine &Msg)
747 : DiagnosticInfoOptimizationBase(Kind, Severity, PassName, "", Fn, Loc) {
748 *this << Msg.str();
749 }
750
751 const BasicBlock *getCodeRegion() const { return CodeRegion; }
752
753 static bool classof(const DiagnosticInfo *DI) {
754 return DI->getKind() >= DK_FirstRemark && DI->getKind() <= DK_LastRemark;
755 }
756
757private:
758 /// The IR region (currently basic block) that the optimization operates on.
759 /// This is currently used to provide run-time hotness information with PGO.
760 const BasicBlock *CodeRegion = nullptr;
761};
762
763/// Diagnostic information for applied optimization remarks.
765public:
766 /// \p PassName is the name of the pass emitting this diagnostic. If this name
767 /// matches the regular expression given in -Rpass=, then the diagnostic will
768 /// be emitted. \p RemarkName is a textual identifier for the remark (single-
769 /// word, CamelCase). \p Loc is the debug location and \p CodeRegion is the
770 /// region that the optimization operates on.
772 const DiagnosticLocation &Loc,
773 const BasicBlock *CodeRegion);
774
775 /// Same as above, but the debug location and code region are derived from \p
776 /// Instr.
778 const Instruction *Inst);
779
780 /// Same as above, but the debug location and code region are derived from \p
781 /// Func.
783 const Function *Func);
784
785 static bool classof(const DiagnosticInfo *DI) {
786 return DI->getKind() == DK_OptimizationRemark;
787 }
788
789 /// \see DiagnosticInfoOptimizationBase::isEnabled.
790 bool isEnabled() const override;
791
792private:
793 /// This is deprecated now and only used by the function API below.
794 /// \p PassName is the name of the pass emitting this diagnostic. If
795 /// this name matches the regular expression given in -Rpass=, then the
796 /// diagnostic will be emitted. \p Fn is the function where the diagnostic
797 /// is being emitted. \p Loc is the location information to use in the
798 /// diagnostic. If line table information is available, the diagnostic
799 /// will include the source code location. \p Msg is the message to show.
800 /// Note that this class does not copy this message, so this reference
801 /// must be valid for the whole life time of the diagnostic.
802 OptimizationRemark(const char *PassName, const Function &Fn,
803 const DiagnosticLocation &Loc, const Twine &Msg)
805 Fn, Loc, Msg) {}
806};
807
808/// Diagnostic information for missed-optimization remarks.
810public:
811 /// \p PassName is the name of the pass emitting this diagnostic. If this name
812 /// matches the regular expression given in -Rpass-missed=, then the
813 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
814 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
815 /// CodeRegion is the region that the optimization operates on.
817 const DiagnosticLocation &Loc,
818 const BasicBlock *CodeRegion);
819
820 /// Same as above but \p Inst is used to derive code region and debug
821 /// location.
823 const Instruction *Inst);
824
825 /// Same as above but \p F is used to derive code region and debug
826 /// location.
828 const Function *F);
829
830 static bool classof(const DiagnosticInfo *DI) {
831 return DI->getKind() == DK_OptimizationRemarkMissed;
832 }
833
834 /// \see DiagnosticInfoOptimizationBase::isEnabled.
835 bool isEnabled() const override;
836
837private:
838 /// This is deprecated now and only used by the function API below.
839 /// \p PassName is the name of the pass emitting this diagnostic. If
840 /// this name matches the regular expression given in -Rpass-missed=, then the
841 /// diagnostic will be emitted. \p Fn is the function where the diagnostic
842 /// is being emitted. \p Loc is the location information to use in the
843 /// diagnostic. If line table information is available, the diagnostic
844 /// will include the source code location. \p Msg is the message to show.
845 /// Note that this class does not copy this message, so this reference
846 /// must be valid for the whole life time of the diagnostic.
847 OptimizationRemarkMissed(const char *PassName, const Function &Fn,
848 const DiagnosticLocation &Loc, const Twine &Msg)
850 PassName, Fn, Loc, Msg) {}
851};
852
853/// Diagnostic information for optimization analysis remarks.
856public:
857 /// \p PassName is the name of the pass emitting this diagnostic. If this name
858 /// matches the regular expression given in -Rpass-analysis=, then the
859 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
860 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
861 /// CodeRegion is the region that the optimization operates on.
863 const DiagnosticLocation &Loc,
864 const BasicBlock *CodeRegion);
865
866 /// This is ctor variant allows a pass to build an optimization remark
867 /// from an existing remark.
868 ///
869 /// This is useful when a transformation pass (e.g LV) wants to emit a remark
870 /// (\p Orig) generated by one of its analyses (e.g. LAA) as its own analysis
871 /// remark. The string \p Prepend will be emitted before the original
872 /// message.
876
877 /// Same as above but \p Inst is used to derive code region and debug
878 /// location.
879 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
880 const Instruction *Inst);
881
882 /// Same as above but \p F is used to derive code region and debug
883 /// location.
884 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
885 const Function *F);
886
887 static bool classof(const DiagnosticInfo *DI) {
889 }
890
891 /// \see DiagnosticInfoOptimizationBase::isEnabled.
892 bool isEnabled() const override;
893
894 static const char *AlwaysPrint;
895
896 bool shouldAlwaysPrint() const { return getPassName() == AlwaysPrint; }
897
898protected:
900 const Function &Fn, const DiagnosticLocation &Loc,
901 const Twine &Msg)
903
905 StringRef RemarkName,
906 const DiagnosticLocation &Loc,
907 const BasicBlock *CodeRegion);
908
909private:
910 /// This is deprecated now and only used by the function API below.
911 /// \p PassName is the name of the pass emitting this diagnostic. If
912 /// this name matches the regular expression given in -Rpass-analysis=, then
913 /// the diagnostic will be emitted. \p Fn is the function where the diagnostic
914 /// is being emitted. \p Loc is the location information to use in the
915 /// diagnostic. If line table information is available, the diagnostic will
916 /// include the source code location. \p Msg is the message to show. Note that
917 /// this class does not copy this message, so this reference must be valid for
918 /// the whole life time of the diagnostic.
919 OptimizationRemarkAnalysis(const char *PassName, const Function &Fn,
920 const DiagnosticLocation &Loc, const Twine &Msg)
922 PassName, Fn, Loc, Msg) {}
923};
924
925/// Diagnostic information for optimization analysis remarks related to
926/// floating-point non-commutativity.
929 void anchor() override;
930public:
931 /// \p PassName is the name of the pass emitting this diagnostic. If this name
932 /// matches the regular expression given in -Rpass-analysis=, then the
933 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
934 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
935 /// CodeRegion is the region that the optimization operates on. The front-end
936 /// will append its own message related to options that address floating-point
937 /// non-commutativity.
944
945 static bool classof(const DiagnosticInfo *DI) {
947 }
948
949private:
950 /// This is deprecated now and only used by the function API below.
951 /// \p PassName is the name of the pass emitting this diagnostic. If
952 /// this name matches the regular expression given in -Rpass-analysis=, then
953 /// the diagnostic will be emitted. \p Fn is the function where the diagnostic
954 /// is being emitted. \p Loc is the location information to use in the
955 /// diagnostic. If line table information is available, the diagnostic will
956 /// include the source code location. \p Msg is the message to show. The
957 /// front-end will append its own message related to options that address
958 /// floating-point non-commutativity. Note that this class does not copy this
959 /// message, so this reference must be valid for the whole life time of the
960 /// diagnostic.
962 const DiagnosticLocation &Loc,
963 const Twine &Msg)
965 PassName, Fn, Loc, Msg) {}
966};
967
968/// Diagnostic information for optimization analysis remarks related to
969/// pointer aliasing.
972 void anchor() override;
973public:
974 /// \p PassName is the name of the pass emitting this diagnostic. If this name
975 /// matches the regular expression given in -Rpass-analysis=, then the
976 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
977 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
978 /// CodeRegion is the region that the optimization operates on. The front-end
979 /// will append its own message related to options that address pointer
980 /// aliasing legality.
986
987 static bool classof(const DiagnosticInfo *DI) {
989 }
990
991private:
992 /// This is deprecated now and only used by the function API below.
993 /// \p PassName is the name of the pass emitting this diagnostic. If
994 /// this name matches the regular expression given in -Rpass-analysis=, then
995 /// the diagnostic will be emitted. \p Fn is the function where the diagnostic
996 /// is being emitted. \p Loc is the location information to use in the
997 /// diagnostic. If line table information is available, the diagnostic will
998 /// include the source code location. \p Msg is the message to show. The
999 /// front-end will append its own message related to options that address
1000 /// pointer aliasing legality. Note that this class does not copy this
1001 /// message, so this reference must be valid for the whole life time of the
1002 /// diagnostic.
1004 const DiagnosticLocation &Loc,
1005 const Twine &Msg)
1007 PassName, Fn, Loc, Msg) {}
1008};
1009
1010/// Diagnostic information for machine IR parser.
1011// FIXME: Remove this, use DiagnosticInfoSrcMgr instead.
1013 const SMDiagnostic &Diagnostic;
1014
1015public:
1017 const SMDiagnostic &Diagnostic)
1018 : DiagnosticInfo(DK_MIRParser, Severity), Diagnostic(Diagnostic) {}
1019
1020 const SMDiagnostic &getDiagnostic() const { return Diagnostic; }
1021
1022 void print(DiagnosticPrinter &DP) const override;
1023
1024 static bool classof(const DiagnosticInfo *DI) {
1025 return DI->getKind() == DK_MIRParser;
1026 }
1027};
1028
1029/// Diagnostic information for IR instrumentation reporting.
1031 const Twine &Msg;
1032
1033public:
1035 DiagnosticSeverity Severity = DS_Warning)
1036 : DiagnosticInfo(DK_Instrumentation, Severity), Msg(DiagMsg) {}
1037
1038 void print(DiagnosticPrinter &DP) const override;
1039
1040 static bool classof(const DiagnosticInfo *DI) {
1041 return DI->getKind() == DK_Instrumentation;
1042 }
1043};
1044
1045/// Diagnostic information for ISel fallback path.
1047 /// The function that is concerned by this diagnostic.
1048 const Function &Fn;
1049
1050public:
1052 DiagnosticSeverity Severity = DS_Warning)
1053 : DiagnosticInfo(DK_ISelFallback, Severity), Fn(Fn) {}
1054
1055 const Function &getFunction() const { return Fn; }
1056
1057 void print(DiagnosticPrinter &DP) const override;
1058
1059 static bool classof(const DiagnosticInfo *DI) {
1060 return DI->getKind() == DK_ISelFallback;
1061 }
1062};
1063
1064// Create wrappers for C Binding types (see CBindingWrapping.h).
1066
1067/// Diagnostic information for optimization failures.
1070public:
1071 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
1072 /// the location information to use in the diagnostic. If line table
1073 /// information is available, the diagnostic will include the source code
1074 /// location. \p Msg is the message to show. Note that this class does not
1075 /// copy this message, so this reference must be valid for the whole life time
1076 /// of the diagnostic.
1082
1083 /// \p PassName is the name of the pass emitting this diagnostic. \p
1084 /// RemarkName is a textual identifier for the remark (single-word,
1085 /// CamelCase). \p Loc is the debug location and \p CodeRegion is the
1086 /// region that the optimization operates on.
1088 const DiagnosticLocation &Loc,
1089 const BasicBlock *CodeRegion);
1090
1091 static bool classof(const DiagnosticInfo *DI) {
1092 return DI->getKind() == DK_OptimizationFailure;
1093 }
1094
1095 /// \see DiagnosticInfoOptimizationBase::isEnabled.
1096 bool isEnabled() const override;
1097};
1098
1099/// Diagnostic information for unsupported feature in backend.
1102private:
1103 const Twine &Msg;
1104
1105public:
1106 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
1107 /// the location information to use in the diagnostic. If line table
1108 /// information is available, the diagnostic will include the source code
1109 /// location. \p Msg is the message to show. Note that this class does not
1110 /// copy this message, so this reference must be valid for the whole life time
1111 /// of the diagnostic.
1113 const Function &Fn, const Twine &Msg LLVM_LIFETIME_BOUND,
1115 DiagnosticSeverity Severity = DS_Error)
1116 : DiagnosticInfoWithLocationBase(DK_Unsupported, Severity, Fn, Loc),
1117 Msg(Msg) {}
1118
1119 static bool classof(const DiagnosticInfo *DI) {
1120 return DI->getKind() == DK_Unsupported;
1121 }
1122
1123 const Twine &getMessage() const { return Msg; }
1124
1125 void print(DiagnosticPrinter &DP) const override;
1126};
1127
1128/// Diagnostic information for MisExpect analysis.
1130public:
1132 const Twine &Msg LLVM_LIFETIME_BOUND);
1133
1134 /// \see DiagnosticInfo::print.
1135 void print(DiagnosticPrinter &DP) const override;
1136
1137 static bool classof(const DiagnosticInfo *DI) {
1138 return DI->getKind() == DK_MisExpect;
1139 }
1140
1141 const Twine &getMsg() const { return Msg; }
1142
1143private:
1144 /// Message to report.
1145 const Twine &Msg;
1146};
1147
1149 switch (DK) {
1151 return DS_Error;
1152 break;
1154 return DS_Warning;
1155 break;
1157 return DS_Note;
1158 break;
1160 return DS_Remark;
1161 break;
1162 }
1163 llvm_unreachable("unknown SourceMgr::DiagKind");
1164}
1165
1166/// Diagnostic information for SMDiagnostic reporting.
1168 const SMDiagnostic &Diagnostic;
1169 StringRef ModName;
1170
1171 // For inlineasm !srcloc translation.
1172 bool InlineAsmDiag;
1173 uint64_t LocCookie;
1174
1175public:
1176 DiagnosticInfoSrcMgr(const SMDiagnostic &Diagnostic, StringRef ModName,
1177 bool InlineAsmDiag = true, uint64_t LocCookie = 0)
1179 Diagnostic(Diagnostic), ModName(ModName), InlineAsmDiag(InlineAsmDiag),
1180 LocCookie(LocCookie) {}
1181
1182 StringRef getModuleName() const { return ModName; }
1183 bool isInlineAsmDiag() const { return InlineAsmDiag; }
1184 const SMDiagnostic &getSMDiag() const { return Diagnostic; }
1185 uint64_t getLocCookie() const { return LocCookie; }
1186 void print(DiagnosticPrinter &DP) const override;
1187
1188 static bool classof(const DiagnosticInfo *DI) {
1189 return DI->getKind() == DK_SrcMgr;
1190 }
1191};
1192
1193LLVM_ABI void diagnoseDontCall(const CallInst &CI);
1194
1196 StringRef CalleeName;
1197 StringRef Note;
1198 uint64_t LocCookie;
1199
1200public:
1202 DiagnosticSeverity DS, uint64_t LocCookie)
1203 : DiagnosticInfo(DK_DontCall, DS), CalleeName(CalleeName), Note(Note),
1204 LocCookie(LocCookie) {}
1205 StringRef getFunctionName() const { return CalleeName; }
1206 StringRef getNote() const { return Note; }
1207 uint64_t getLocCookie() const { return LocCookie; }
1208 void print(DiagnosticPrinter &DP) const override;
1209 static bool classof(const DiagnosticInfo *DI) {
1210 return DI->getKind() == DK_DontCall;
1211 }
1212};
1213
1214} // end namespace llvm
1215
1216#endif // LLVM_IR_DIAGNOSTICINFO_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)
#define LLVM_ABI
Definition Compiler.h:213
#define LLVM_LIFETIME_BOUND
Definition Compiler.h:435
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define H(x, y, z)
Definition MD5.cpp:56
#define T
#define P(N)
static llvm::Expected< std::string > getAbsolutePath(StringRef Authority, StringRef Body)
Definition Protocol.cpp:158
static MemoryLocation getLocation(Instruction *I)
This file defines the SmallVector class.
static const char PassName[]
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
LLVM Basic Block Representation.
Definition BasicBlock.h:62
This class represents a function call, abstracting a target machine's calling convention.
Subprogram description. Uses SubclassData1.
A debug info location.
Definition DebugLoc.h:124
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoDebugMetadataVersion(const Module &M, unsigned MetadataVersion, DiagnosticSeverity Severity=DS_Warning)
The module that is concerned by this debug metadata version diagnostic.
DiagnosticInfoDontCall(StringRef CalleeName, StringRef Note, DiagnosticSeverity DS, uint64_t LocCookie)
static bool classof(const DiagnosticInfo *DI)
StringRef getFunctionName() const
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoGenericWithLoc(const Twine &MsgStr, const Function &Fn, const DiagnosticLocation &Loc, DiagnosticSeverity Severity=DS_Error)
MsgStr is the message to be reported to the frontend.
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoGeneric(const Instruction *I, const Twine &ErrMsg LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
DiagnosticInfoGeneric(const Twine &MsgStr LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
MsgStr is the message to be reported to the frontend.
const Twine & getMsgStr() const
const Instruction * getInstruction() const
Common features for diagnostics dealing with optimization remarks that are used by IR passes.
DiagnosticInfoIROptimization(const char *PassName, StringRef Prepend, const DiagnosticInfoIROptimization &Orig)
This is ctor variant allows a pass to build an optimization remark from an existing remark.
DiagnosticInfoIROptimization(enum DiagnosticKind Kind, enum DiagnosticSeverity Severity, const char *PassName, StringRef RemarkName, const Function &Fn, const DiagnosticLocation &Loc, const BasicBlock *CodeRegion=nullptr)
PassName is the name of the pass emitting this diagnostic.
DiagnosticInfoIROptimization(enum DiagnosticKind Kind, enum DiagnosticSeverity Severity, const char *PassName, const Function &Fn, const DiagnosticLocation &Loc, const Twine &Msg)
Legacy interface.
const BasicBlock * getCodeRegion() const
static bool classof(const DiagnosticInfo *DI)
static bool classof(const DiagnosticInfo *DI)
const Function & getFunction() const
DiagnosticInfoISelFallback(const Function &Fn, DiagnosticSeverity Severity=DS_Warning)
DiagnosticInfoIgnoringInvalidDebugMetadata(const Module &M, DiagnosticSeverity Severity=DS_Warning)
The module that is concerned by this debug metadata version diagnostic.
static bool classof(const DiagnosticInfo *DI)
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoInlineAsm(const Instruction &I, const Twine &MsgStr LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
Instr gives the original instruction that triggered the diagnostic.
const Instruction * getInstruction() const
DiagnosticInfoInlineAsm(uint64_t LocCookie, const Twine &MsgStr LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
LocCookie if non-zero gives the line number for this report.
const Twine & getMsgStr() const
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoInstrumentation(const Twine &DiagMsg, DiagnosticSeverity Severity=DS_Warning)
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoLegalizationFailure(const Twine &MsgStr LLVM_LIFETIME_BOUND, const Function &Fn, const DiagnosticLocation &Loc, DiagnosticSeverity Severity=DS_Error)
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoMIRParser(DiagnosticSeverity Severity, const SMDiagnostic &Diagnostic)
const SMDiagnostic & getDiagnostic() const
const Twine & getMsg() const
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoMisExpect(const Instruction *Inst, const Twine &Msg LLVM_LIFETIME_BOUND)
Common features for diagnostics dealing with optimization remarks that are used by both IR and MIR pa...
ArrayRef< Argument > getArgs() const
int FirstExtraArgIndex
If positive, the index of the first argument that only appear in the optimization records and not in ...
const char * PassName
Name of the pass that triggers this report.
StringRef RemarkName
Textual identifier for the remark (single-word, CamelCase).
bool IsVerbose
The remark is expected to be noisy.
std::optional< uint64_t > Hotness
If profile information is available, this is the number of times the corresponding code was executed ...
SmallVector< Argument, 4 > Args
Arguments collected via the streaming interface.
void setHotness(std::optional< uint64_t > H)
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoOptimizationBase(enum DiagnosticKind Kind, enum DiagnosticSeverity Severity, const char *PassName, StringRef RemarkName, const Function &Fn, const DiagnosticLocation &Loc)
PassName is the name of the pass emitting this diagnostic.
virtual bool isEnabled() const =0
Return true if this optimization remark is enabled by one of of the LLVM command line flags (-pass-re...
std::optional< uint64_t > getHotness() const
Diagnostic information for optimization failures.
DiagnosticInfoOptimizationFailure(const Function &Fn, const DiagnosticLocation &Loc, const Twine &Msg)
Fn is the function where the diagnostic is being emitted.
static bool classof(const DiagnosticInfo *DI)
const char * getFileName() const
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoPGOProfile(const char *FileName, const Twine &Msg LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
const Twine & getMsg() const
DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn, const DiagnosticLocation &DL, DiagnosticSeverity Severity=DS_Error)
MsgStr is the message to be reported to the frontend.
static bool classof(const DiagnosticInfo *DI)
const Function & getFunction() const
const char * getResourceName() const
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoResourceLimit(const Function &Fn, const char *ResourceName, uint64_t ResourceSize, uint64_t ResourceLimit, DiagnosticSeverity Severity=DS_Warning, DiagnosticKind Kind=DK_ResourceLimit)
The function that is concerned by this stack size diagnostic.
DiagnosticInfoSampleProfile(StringRef FileName, const Twine &Msg LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoSampleProfile(const Twine &Msg LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
DiagnosticInfoSampleProfile(StringRef FileName, unsigned LineNum, const Twine &Msg LLVM_LIFETIME_BOUND, DiagnosticSeverity Severity=DS_Error)
static bool classof(const DiagnosticInfo *DI)
const SMDiagnostic & getSMDiag() const
DiagnosticInfoSrcMgr(const SMDiagnostic &Diagnostic, StringRef ModName, bool InlineAsmDiag=true, uint64_t LocCookie=0)
StringRef getModuleName() const
static bool classof(const DiagnosticInfo *DI)
DiagnosticInfoStackSize(const Function &Fn, uint64_t StackSize, uint64_t StackLimit, DiagnosticSeverity Severity=DS_Warning)
const Twine & getMessage() const
DiagnosticInfoUnsupported(const Function &Fn, const Twine &Msg LLVM_LIFETIME_BOUND, const DiagnosticLocation &Loc=DiagnosticLocation(), DiagnosticSeverity Severity=DS_Error)
Fn is the function where the diagnostic is being emitted.
static bool classof(const DiagnosticInfo *DI)
bool isLocationAvailable() const
Return true if location information is available for this diagnostic.
const Function & getFunction() const
DiagnosticLocation getLocation() const
DiagnosticInfoWithLocationBase(enum DiagnosticKind Kind, enum DiagnosticSeverity Severity, const Function &Fn, const DiagnosticLocation &Loc)
Fn is the function where the diagnostic is being emitted.
void getLocation(StringRef &RelativePath, unsigned &Line, unsigned &Column) const
Return location information for this diagnostic in three parts: the relative source file path,...
This is the base abstract class for diagnostic reporting in the backend.
DiagnosticSeverity getSeverity() const
DiagnosticInfo(int Kind, DiagnosticSeverity Severity)
virtual ~DiagnosticInfo()=default
virtual void print(DiagnosticPrinter &DP) const =0
Print using the given DP a user-friendly message.
LLVM_ABI std::string getAbsolutePath() const
Return the full path to the file.
LLVM_ABI StringRef getRelativePath() const
Return the file name relative to the compilation directory.
unsigned getColumn() const
Interface for custom diagnostic printing.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Diagnostic information for optimization analysis remarks related to pointer aliasing.
OptimizationRemarkAnalysisAliasing(const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc, const BasicBlock *CodeRegion)
PassName is the name of the pass emitting this diagnostic.
static bool classof(const DiagnosticInfo *DI)
Diagnostic information for optimization analysis remarks related to floating-point non-commutativity.
OptimizationRemarkAnalysisFPCommute(const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc, const BasicBlock *CodeRegion)
PassName is the name of the pass emitting this diagnostic.
static bool classof(const DiagnosticInfo *DI)
Diagnostic information for optimization analysis remarks.
OptimizationRemarkAnalysis(const char *PassName, StringRef Prepend, const OptimizationRemarkAnalysis &Orig)
This is ctor variant allows a pass to build an optimization remark from an existing remark.
OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc, const BasicBlock *CodeRegion)
PassName is the name of the pass emitting this diagnostic.
OptimizationRemarkAnalysis(enum DiagnosticKind Kind, const char *PassName, const Function &Fn, const DiagnosticLocation &Loc, const Twine &Msg)
static bool classof(const DiagnosticInfo *DI)
Diagnostic information for missed-optimization remarks.
static bool classof(const DiagnosticInfo *DI)
OptimizationRemarkMissed(const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc, const BasicBlock *CodeRegion)
PassName is the name of the pass emitting this diagnostic.
Diagnostic information for applied optimization remarks.
static bool classof(const DiagnosticInfo *DI)
OptimizationRemark(const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc, const BasicBlock *CodeRegion)
PassName is the name of the pass emitting this diagnostic.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:297
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
Definition Twine.cpp:17
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
struct LLVMOpaqueDiagnosticInfo * LLVMDiagnosticInfoRef
Definition Types.h:150
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
std::function< void(const DiagnosticInfo &)> DiagnosticHandlerFunction
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2136
DiagnosticKind
Defines the different supported kind of a diagnostic.
@ DK_DebugMetadataInvalid
@ DK_Instrumentation
@ DK_OptimizationRemarkAnalysis
@ DK_LastMachineRemark
@ DK_OptimizationRemarkAnalysisAliasing
@ DK_StackSize
@ DK_SampleProfile
@ DK_MachineOptimizationRemark
@ DK_Unsupported
@ DK_LastRemark
@ DK_OptimizationRemarkMissed
@ DK_MIRParser
@ DK_GenericWithLoc
@ DK_ResourceLimit
@ DK_MachineOptimizationRemarkAnalysis
@ DK_ISelFallback
@ DK_Lowering
@ DK_OptimizationRemark
@ DK_FirstMachineRemark
@ DK_DontCall
@ DK_MachineOptimizationRemarkMissed
@ DK_PGOProfile
@ DK_InlineAsm
@ DK_DebugMetadataVersion
@ DK_OptimizationFailure
@ DK_FirstRemark
@ DK_MisExpect
@ DK_LegalizationFailure
@ DK_OptimizationRemarkAnalysisFPCommute
@ DK_FirstPluginKind
@ DK_RegAllocFailure
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI int getNextAvailablePluginDiagnosticKind()
Get the next available kind ID for a plugin diagnostic.
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
static DiagnosticSeverity getDiagnosticSeverity(SourceMgr::DiagKind DK)
#define N
Used in the streaming interface as the general argument type.
When an instance of this is inserted into the stream, the arguments following will not appear in the ...
Used to set IsVerbose via the stream interface.