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 <iterator>
32#include <optional>
33#include <string>
34#include <utility>
35
36namespace llvm {
37
38// Forward declarations.
40class DIFile;
41class DISubprogram;
42class CallInst;
43class Function;
44class Instruction;
45class InstructionCost;
46class Module;
47class Type;
48class Value;
49
50/// Defines the different supported severity of a diagnostic.
51enum DiagnosticSeverity : char {
55 // A note attaches additional information to one of the previous diagnostic
56 // types.
58};
59
60/// Defines the different supported kind of a diagnostic.
61/// This enum should be extended with a new ID for each added concrete subclass.
99
100/// Get the next available kind ID for a plugin diagnostic.
101/// Each time this function is called, it returns a different number.
102/// Therefore, a plugin that wants to "identify" its own classes
103/// with a dynamic identifier, just have to use this method to get a new ID
104/// and assign it to each of its classes.
105/// The returned ID will be greater than or equal to DK_FirstPluginKind.
106/// Thus, the plugin identifiers will not conflict with the
107/// DiagnosticKind values.
109
110/// This is the base abstract class for diagnostic reporting in
111/// the backend.
112/// The print method must be overloaded by the subclasses to print a
113/// user-friendly message in the client of the backend (let us call it a
114/// frontend).
116private:
117 /// Kind defines the kind of report this is about.
118 const /* DiagnosticKind */ int Kind;
119 /// Severity gives the severity of the diagnostic.
120 const DiagnosticSeverity Severity;
121
122 virtual void anchor();
123public:
124 DiagnosticInfo(/* DiagnosticKind */ int Kind, DiagnosticSeverity Severity)
125 : Kind(Kind), Severity(Severity) {}
126
127 virtual ~DiagnosticInfo() = default;
128
129 /* DiagnosticKind */ int getKind() const { return Kind; }
130 DiagnosticSeverity getSeverity() const { return Severity; }
131
132 /// Print using the given \p DP a user-friendly message.
133 /// This is the default message that will be printed to the user.
134 /// It is used when the frontend does not directly take advantage
135 /// of the information contained in fields of the subclasses.
136 /// The printed message must not end with '.' nor start with a severity
137 /// keyword.
138 virtual void print(DiagnosticPrinter &DP) const = 0;
139};
140
141using DiagnosticHandlerFunction = std::function<void(const DiagnosticInfo &)>;
142
144 const Twine &MsgStr;
145 const Instruction *Inst = nullptr;
146
147public:
148 /// \p MsgStr is the message to be reported to the frontend.
149 /// This class does not copy \p MsgStr, therefore the reference must be valid
150 /// for the whole life time of the Diagnostic.
152 DiagnosticSeverity Severity = DS_Error)
153 : DiagnosticInfo(DK_Generic, Severity), MsgStr(MsgStr) {}
154
156 const Twine &ErrMsg LLVM_LIFETIME_BOUND,
157 DiagnosticSeverity Severity = DS_Error)
158 : DiagnosticInfo(DK_Generic, Severity), MsgStr(ErrMsg), Inst(I) {}
159
160 const Twine &getMsgStr() const { return MsgStr; }
161 const Instruction *getInstruction() const { return Inst; }
162
163 /// \see DiagnosticInfo::print.
164 void print(DiagnosticPrinter &DP) const override;
165
166 static bool classof(const DiagnosticInfo *DI) {
167 return DI->getKind() == DK_Generic;
168 }
169};
170
171/// Diagnostic information for inline asm reporting.
172/// This is basically a message and an optional location.
174private:
175 /// Optional line information. 0 if not set.
176 uint64_t LocCookie = 0;
177 /// Message to be reported.
178 const Twine &MsgStr;
179 /// Optional origin of the problem.
180 const Instruction *Instr = nullptr;
181
182public:
183 /// \p LocCookie if non-zero gives the line number for this report.
184 /// \p MsgStr gives the message.
185 /// This class does not copy \p MsgStr, therefore the reference must be valid
186 /// for the whole life time of the Diagnostic.
188 const Twine &MsgStr LLVM_LIFETIME_BOUND,
189 DiagnosticSeverity Severity = DS_Error);
190
191 /// \p Instr gives the original instruction that triggered the diagnostic.
192 /// \p MsgStr gives the message.
193 /// This class does not copy \p MsgStr, therefore the reference must be valid
194 /// for the whole life time of the Diagnostic.
195 /// Same for \p I.
197 const Twine &MsgStr LLVM_LIFETIME_BOUND,
198 DiagnosticSeverity Severity = DS_Error);
199
200 uint64_t getLocCookie() const { return LocCookie; }
201 const Twine &getMsgStr() const { return MsgStr; }
202 const Instruction *getInstruction() const { return Instr; }
203
204 /// \see DiagnosticInfo::print.
205 void print(DiagnosticPrinter &DP) const override;
206
207 static bool classof(const DiagnosticInfo *DI) {
208 return DI->getKind() == DK_InlineAsm;
209 }
210};
211
212/// Diagnostic information for debug metadata version reporting.
213/// This is basically a module and a version.
215private:
216 /// The module that is concerned by this debug metadata version diagnostic.
217 const Module &M;
218 /// The actual metadata version.
219 unsigned MetadataVersion;
220
221public:
222 /// \p The module that is concerned by this debug metadata version diagnostic.
223 /// \p The actual metadata version.
224 DiagnosticInfoDebugMetadataVersion(const Module &M, unsigned MetadataVersion,
226 : DiagnosticInfo(DK_DebugMetadataVersion, Severity), M(M),
227 MetadataVersion(MetadataVersion) {}
228
229 const Module &getModule() const { return M; }
230 unsigned getMetadataVersion() const { return MetadataVersion; }
231
232 /// \see DiagnosticInfo::print.
233 void print(DiagnosticPrinter &DP) const override;
234
235 static bool classof(const DiagnosticInfo *DI) {
236 return DI->getKind() == DK_DebugMetadataVersion;
237 }
238};
239
240/// Diagnostic information for stripping invalid debug metadata.
242 : public DiagnosticInfo {
243private:
244 /// The module that is concerned by this debug metadata version diagnostic.
245 const Module &M;
246
247public:
248 /// \p The module that is concerned by this debug metadata version diagnostic.
252
253 const Module &getModule() const { return M; }
254
255 /// \see DiagnosticInfo::print.
256 void print(DiagnosticPrinter &DP) const override;
257
258 static bool classof(const DiagnosticInfo *DI) {
259 return DI->getKind() == DK_DebugMetadataInvalid;
260 }
261};
262
263/// Diagnostic information for the sample profiler.
265public:
266 DiagnosticInfoSampleProfile(StringRef FileName, unsigned LineNum,
267 const Twine &Msg LLVM_LIFETIME_BOUND,
268 DiagnosticSeverity Severity = DS_Error)
269 : DiagnosticInfo(DK_SampleProfile, Severity), FileName(FileName),
270 LineNum(LineNum), Msg(Msg) {}
272 const Twine &Msg LLVM_LIFETIME_BOUND,
273 DiagnosticSeverity Severity = DS_Error)
274 : DiagnosticInfo(DK_SampleProfile, Severity), FileName(FileName),
275 Msg(Msg) {}
279
280 /// \see DiagnosticInfo::print.
281 void print(DiagnosticPrinter &DP) const override;
282
283 static bool classof(const DiagnosticInfo *DI) {
284 return DI->getKind() == DK_SampleProfile;
285 }
286
287 StringRef getFileName() const { return FileName; }
288 unsigned getLineNum() const { return LineNum; }
289 const Twine &getMsg() const { return Msg; }
290
291private:
292 /// Name of the input file associated with this diagnostic.
293 StringRef FileName;
294
295 /// Line number where the diagnostic occurred. If 0, no line number will
296 /// be emitted in the message.
297 unsigned LineNum = 0;
298
299 /// Message to report.
300 const Twine &Msg;
301};
302
303/// Diagnostic information for the PGO profiler.
305public:
306 DiagnosticInfoPGOProfile(const char *FileName,
307 const Twine &Msg LLVM_LIFETIME_BOUND,
308 DiagnosticSeverity Severity = DS_Error)
309 : DiagnosticInfo(DK_PGOProfile, Severity), FileName(FileName), Msg(Msg) {}
310
311 /// \see DiagnosticInfo::print.
312 void print(DiagnosticPrinter &DP) const override;
313
314 static bool classof(const DiagnosticInfo *DI) {
315 return DI->getKind() == DK_PGOProfile;
316 }
317
318 const char *getFileName() const { return FileName; }
319 const Twine &getMsg() const { return Msg; }
320
321private:
322 /// Name of the input file associated with this diagnostic.
323 const char *FileName;
324
325 /// Message to report.
326 const Twine &Msg;
327};
328
330 DIFile *File = nullptr;
331 unsigned Line = 0;
332 unsigned Column = 0;
333
334public:
338
339 bool isValid() const { return File; }
340 /// Return the full path to the file.
341 LLVM_ABI std::string getAbsolutePath() const;
342 /// Return the file name relative to the compilation directory.
344 unsigned getLine() const { return Line; }
345 unsigned getColumn() const { return Column; }
346};
347
348/// Common features for diagnostics with an associated location.
350 void anchor() override;
351public:
352 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
353 /// the location information to use in the diagnostic.
355 enum DiagnosticSeverity Severity,
356 const Function &Fn,
357 const DiagnosticLocation &Loc)
358 : DiagnosticInfo(Kind, Severity), Fn(Fn), Loc(Loc) {}
359
360 /// Return true if location information is available for this diagnostic.
361 bool isLocationAvailable() const { return Loc.isValid(); }
362
363 /// Return a string with the location information for this diagnostic
364 /// in the format "file:line:col". If location information is not available,
365 /// it returns "<unknown>:0:0".
366 std::string getLocationStr() const;
367
368 /// Return location information for this diagnostic in three parts:
369 /// the relative source file path, line number and column.
370 void getLocation(StringRef &RelativePath, unsigned &Line,
371 unsigned &Column) const;
372
373 /// Return the absolute path tot the file.
374 std::string getAbsolutePath() const;
375
376 const Function &getFunction() const { return Fn; }
377 DiagnosticLocation getLocation() const { return Loc; }
378
379private:
380 /// Function where this diagnostic is triggered.
381 const Function &Fn;
382
383 /// Debug location where this diagnostic is triggered.
385};
386
389private:
390 /// Message to be reported.
391 const Twine &MsgStr;
392
393public:
395 const Function &Fn,
396 const DiagnosticLocation &Loc,
397 DiagnosticSeverity Severity = DS_Error)
399 Loc),
400 MsgStr(MsgStr) {}
401
402 const Twine &getMsgStr() const { return MsgStr; }
403
404 void print(DiagnosticPrinter &DP) const override;
405
406 static bool classof(const DiagnosticInfo *DI) {
407 return DI->getKind() == DK_LegalizationFailure;
408 }
409};
410
413private:
414 /// Message to be reported.
415 const Twine &MsgStr;
416
417public:
418 /// \p MsgStr is the message to be reported to the frontend.
419 /// This class does not copy \p MsgStr, therefore the reference must be valid
420 /// for the whole life time of the Diagnostic.
422 const DiagnosticLocation &Loc,
423 DiagnosticSeverity Severity = DS_Error)
425 MsgStr(MsgStr) {}
426
427 const Twine &getMsgStr() const { return MsgStr; }
428
429 /// \see DiagnosticInfo::print.
430 void print(DiagnosticPrinter &DP) const override;
431
432 static bool classof(const DiagnosticInfo *DI) {
433 return DI->getKind() == DK_GenericWithLoc;
434 }
435};
436
439private:
440 /// Message to be reported.
441 const Twine &MsgStr;
442
443public:
444 /// \p MsgStr is the message to be reported to the frontend.
445 /// This class does not copy \p MsgStr, therefore the reference must be valid
446 /// for the whole life time of the Diagnostic.
447 DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn,
448 const DiagnosticLocation &DL,
449 DiagnosticSeverity Severity = DS_Error);
450
451 DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn,
452 DiagnosticSeverity Severity = DS_Error);
453
454 const Twine &getMsgStr() const { return MsgStr; }
455
456 /// \see DiagnosticInfo::print.
457 void print(DiagnosticPrinter &DP) const override;
458
459 static bool classof(const DiagnosticInfo *DI) {
460 return DI->getKind() == DK_RegAllocFailure;
461 }
462};
463
464/// Diagnostic information for stack size etc. reporting.
465/// This is basically a function and a size.
468private:
469 /// The function that is concerned by this resource limit diagnostic.
470 const Function &Fn;
471
472 /// Description of the resource type (e.g. stack size)
473 const char *ResourceName;
474
475 /// The computed size usage
476 uint64_t ResourceSize;
477
478 // Threshould passed
479 uint64_t ResourceLimit;
480
481public:
482 /// \p The function that is concerned by this stack size diagnostic.
483 /// \p The computed stack size.
484 DiagnosticInfoResourceLimit(const Function &Fn, const char *ResourceName,
485 uint64_t ResourceSize, uint64_t ResourceLimit,
488
489 const Function &getFunction() const { return Fn; }
490 const char *getResourceName() const { return ResourceName; }
491 uint64_t getResourceSize() const { return ResourceSize; }
492 uint64_t getResourceLimit() const { return ResourceLimit; }
493
494 /// \see DiagnosticInfo::print.
495 void print(DiagnosticPrinter &DP) const override;
496
497 static bool classof(const DiagnosticInfo *DI) {
498 return DI->getKind() == DK_ResourceLimit || DI->getKind() == DK_StackSize;
499 }
500};
501
503 void anchor() override;
504
505public:
507 uint64_t StackLimit,
509 : DiagnosticInfoResourceLimit(Fn, "stack frame size", StackSize,
510 StackLimit, Severity, DK_StackSize) {}
511
514
515 static bool classof(const DiagnosticInfo *DI) {
516 return DI->getKind() == DK_StackSize;
517 }
518};
519
520/// Common features for diagnostics dealing with optimization remarks
521/// that are used by both IR and MIR passes.
524public:
525 /// Used to set IsVerbose via the stream interface.
526 struct setIsVerbose {};
527
528 /// When an instance of this is inserted into the stream, the arguments
529 /// following will not appear in the remark printed in the compiler output
530 /// (-Rpass) but only in the optimization record file
531 /// (-fsave-optimization-record).
532 struct setExtraArgs {};
533
534 /// Used in the streaming interface as the general argument type. It
535 /// internally converts everything into a key-value pair.
536 struct Argument {
537 std::string Key;
538 std::string Val;
539 // If set, the debug location corresponding to the value.
541
542 explicit Argument(StringRef Str = "") : Key("String"), Val(Str) {}
546 Argument(StringRef Key, const char *S) : Argument(Key, StringRef(S)) {};
550 LLVM_ABI Argument(StringRef Key, long long N);
551 LLVM_ABI Argument(StringRef Key, unsigned N);
552 LLVM_ABI Argument(StringRef Key, unsigned long N);
553 LLVM_ABI Argument(StringRef Key, unsigned long long N);
555 Argument(StringRef Key, bool B) : Key(Key), Val(B ? "true" : "false") {}
559 };
560
561 /// \p PassName is the name of the pass emitting this diagnostic. \p
562 /// RemarkName is a textual identifier for the remark (single-word,
563 /// CamelCase). \p Fn is the function where the diagnostic is being emitted.
564 /// \p Loc is the location information to use in the diagnostic. If line table
565 /// information is available, the diagnostic will include the source code
566 /// location.
568 enum DiagnosticSeverity Severity,
569 const char *PassName, StringRef RemarkName,
570 const Function &Fn,
571 const DiagnosticLocation &Loc)
572 : DiagnosticInfoWithLocationBase(Kind, Severity, Fn, Loc),
574
575 void insert(StringRef S);
576 void insert(Argument A);
577 void insert(setIsVerbose V);
578 void insert(setExtraArgs EA);
579
580 /// \see DiagnosticInfo::print.
581 void print(DiagnosticPrinter &DP) const override;
582
583 /// Return true if this optimization remark is enabled by one of
584 /// of the LLVM command line flags (-pass-remarks, -pass-remarks-missed,
585 /// or -pass-remarks-analysis). Note that this only handles the LLVM
586 /// flags. We cannot access Clang flags from here (they are handled
587 /// in BackendConsumer::OptimizationRemarkHandler).
588 virtual bool isEnabled() const = 0;
589
590 StringRef getPassName() const { return PassName; }
592 std::string getMsg() const;
593 std::optional<uint64_t> getHotness() const { return Hotness; }
594 void setHotness(std::optional<uint64_t> H) { Hotness = H; }
595
596 bool isVerbose() const { return IsVerbose; }
597
598 ArrayRef<Argument> getArgs() const { return Args; }
599
600 static bool classof(const DiagnosticInfo *DI) {
601 return (DI->getKind() >= DK_FirstRemark &&
602 DI->getKind() <= DK_LastRemark) ||
603 (DI->getKind() >= DK_FirstMachineRemark &&
605 }
606
607 bool isPassed() const {
608 return (getKind() == DK_OptimizationRemark ||
610 }
611
612 bool isMissed() const {
615 }
616
621
622protected:
623 /// Name of the pass that triggers this report. If this matches the
624 /// regular expression given in -Rpass=regexp, then the remark will
625 /// be emitted.
626 const char *PassName;
627
628 /// Textual identifier for the remark (single-word, CamelCase). Can be used
629 /// by external tools reading the output file for optimization remarks to
630 /// identify the remark.
632
633 /// If profile information is available, this is the number of times the
634 /// corresponding code was executed in a profile instrumentation run.
635 std::optional<uint64_t> Hotness;
636
637 /// Arguments collected via the streaming interface.
639
640 /// The remark is expected to be noisy.
641 bool IsVerbose = false;
642
643 /// If positive, the index of the first argument that only appear in
644 /// the optimization records and not in the remark printed in the compiler
645 /// output.
647};
648
649/// Allow the insertion operator to return the actual remark type rather than a
650/// common base class. This allows returning the result of the insertion
651/// directly by value, e.g. return OptimizationRemarkAnalysis(...) << "blah".
652template <class RemarkT>
653decltype(auto)
654operator<<(RemarkT &&R,
655 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
656 std::remove_reference_t<RemarkT>>,
657 StringRef>
658 S) {
659 R.insert(S);
660 return std::forward<RemarkT>(R);
661}
662
663template <class RemarkT>
664decltype(auto)
665operator<<(RemarkT &&R,
666 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
667 std::remove_reference_t<RemarkT>>,
669 A) {
670 R.insert(A);
671 return std::forward<RemarkT>(R);
672}
673
674template <class RemarkT>
675decltype(auto)
676operator<<(RemarkT &&R,
677 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
678 std::remove_reference_t<RemarkT>>,
680 V) {
681 R.insert(V);
682 return std::forward<RemarkT>(R);
683}
684
685template <class RemarkT>
686decltype(auto)
687operator<<(RemarkT &&R,
688 std::enable_if_t<std::is_base_of_v<DiagnosticInfoOptimizationBase,
689 std::remove_reference_t<RemarkT>>,
691 EA) {
692 R.insert(EA);
693 return std::forward<RemarkT>(R);
694}
695
696/// Common features for diagnostics dealing with optimization remarks
697/// that are used by IR passes.
700 void anchor() override;
701public:
702 /// \p PassName is the name of the pass emitting this diagnostic. \p
703 /// RemarkName is a textual identifier for the remark (single-word,
704 /// CamelCase). \p Fn is the function where the diagnostic is being emitted.
705 /// \p Loc is the location information to use in the diagnostic. If line table
706 /// information is available, the diagnostic will include the source code
707 /// location. \p CodeRegion is IR value that the optimization operates on.
708 /// This is currently used to provide run-time hotness information with PGO.
710 enum DiagnosticSeverity Severity,
711 const char *PassName, StringRef RemarkName,
712 const Function &Fn,
713 const DiagnosticLocation &Loc,
714 const BasicBlock *CodeRegion = nullptr)
716 Loc),
717 CodeRegion(CodeRegion) {}
718
719 /// This is ctor variant allows a pass to build an optimization remark
720 /// from an existing remark.
721 ///
722 /// This is useful when a transformation pass (e.g LV) wants to emit a remark
723 /// (\p Orig) generated by one of its analyses (e.g. LAA) as its own analysis
724 /// remark. The string \p Prepend will be emitted before the original
725 /// message.
730 Orig.RemarkName, Orig.getFunction(), Orig.getLocation()),
731 CodeRegion(Orig.getCodeRegion()) {
732 *this << Prepend;
734 }
735
736 /// Legacy interface.
737 /// \p PassName is the name of the pass emitting this diagnostic.
738 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
739 /// the location information to use in the diagnostic. If line table
740 /// information is available, the diagnostic will include the source code
741 /// location. \p Msg is the message to show. Note that this class does not
742 /// copy this message, so this reference must be valid for the whole life time
743 /// of the diagnostic.
745 enum DiagnosticSeverity Severity,
746 const char *PassName, const Function &Fn,
747 const DiagnosticLocation &Loc, const Twine &Msg)
748 : DiagnosticInfoOptimizationBase(Kind, Severity, PassName, "", Fn, Loc) {
749 *this << Msg.str();
750 }
751
752 const BasicBlock *getCodeRegion() const { return CodeRegion; }
753
754 static bool classof(const DiagnosticInfo *DI) {
755 return DI->getKind() >= DK_FirstRemark && DI->getKind() <= DK_LastRemark;
756 }
757
758private:
759 /// The IR region (currently basic block) that the optimization operates on.
760 /// This is currently used to provide run-time hotness information with PGO.
761 const BasicBlock *CodeRegion = nullptr;
762};
763
764/// Diagnostic information for applied optimization remarks.
766public:
767 /// \p PassName is the name of the pass emitting this diagnostic. If this name
768 /// matches the regular expression given in -Rpass=, then the diagnostic will
769 /// be emitted. \p RemarkName is a textual identifier for the remark (single-
770 /// word, CamelCase). \p Loc is the debug location and \p CodeRegion is the
771 /// region that the optimization operates on.
773 const DiagnosticLocation &Loc,
774 const BasicBlock *CodeRegion);
775
776 /// Same as above, but the debug location and code region are derived from \p
777 /// Instr.
779 const Instruction *Inst);
780
781 /// Same as above, but the debug location and code region are derived from \p
782 /// Func.
784 const Function *Func);
785
786 static bool classof(const DiagnosticInfo *DI) {
787 return DI->getKind() == DK_OptimizationRemark;
788 }
789
790 /// \see DiagnosticInfoOptimizationBase::isEnabled.
791 bool isEnabled() const override;
792
793private:
794 /// This is deprecated now and only used by the function API below.
795 /// \p PassName is the name of the pass emitting this diagnostic. If
796 /// this name matches the regular expression given in -Rpass=, then the
797 /// diagnostic will be emitted. \p Fn is the function where the diagnostic
798 /// is being emitted. \p Loc is the location information to use in the
799 /// diagnostic. If line table information is available, the diagnostic
800 /// will include the source code location. \p Msg is the message to show.
801 /// Note that this class does not copy this message, so this reference
802 /// must be valid for the whole life time of the diagnostic.
803 OptimizationRemark(const char *PassName, const Function &Fn,
804 const DiagnosticLocation &Loc, const Twine &Msg)
806 Fn, Loc, Msg) {}
807};
808
809/// Diagnostic information for missed-optimization remarks.
811public:
812 /// \p PassName is the name of the pass emitting this diagnostic. If this name
813 /// matches the regular expression given in -Rpass-missed=, then the
814 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
815 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
816 /// CodeRegion is the region that the optimization operates on.
818 const DiagnosticLocation &Loc,
819 const BasicBlock *CodeRegion);
820
821 /// Same as above but \p Inst is used to derive code region and debug
822 /// location.
824 const Instruction *Inst);
825
826 /// Same as above but \p F is used to derive code region and debug
827 /// location.
829 const Function *F);
830
831 static bool classof(const DiagnosticInfo *DI) {
832 return DI->getKind() == DK_OptimizationRemarkMissed;
833 }
834
835 /// \see DiagnosticInfoOptimizationBase::isEnabled.
836 bool isEnabled() const override;
837
838private:
839 /// This is deprecated now and only used by the function API below.
840 /// \p PassName is the name of the pass emitting this diagnostic. If
841 /// this name matches the regular expression given in -Rpass-missed=, then the
842 /// diagnostic will be emitted. \p Fn is the function where the diagnostic
843 /// is being emitted. \p Loc is the location information to use in the
844 /// diagnostic. If line table information is available, the diagnostic
845 /// will include the source code location. \p Msg is the message to show.
846 /// Note that this class does not copy this message, so this reference
847 /// must be valid for the whole life time of the diagnostic.
848 OptimizationRemarkMissed(const char *PassName, const Function &Fn,
849 const DiagnosticLocation &Loc, const Twine &Msg)
851 PassName, Fn, Loc, Msg) {}
852};
853
854/// Diagnostic information for optimization analysis remarks.
857public:
858 /// \p PassName is the name of the pass emitting this diagnostic. If this name
859 /// matches the regular expression given in -Rpass-analysis=, then the
860 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
861 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
862 /// CodeRegion is the region that the optimization operates on.
864 const DiagnosticLocation &Loc,
865 const BasicBlock *CodeRegion);
866
867 /// This is ctor variant allows a pass to build an optimization remark
868 /// from an existing remark.
869 ///
870 /// This is useful when a transformation pass (e.g LV) wants to emit a remark
871 /// (\p Orig) generated by one of its analyses (e.g. LAA) as its own analysis
872 /// remark. The string \p Prepend will be emitted before the original
873 /// message.
877
878 /// Same as above but \p Inst is used to derive code region and debug
879 /// location.
880 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
881 const Instruction *Inst);
882
883 /// Same as above but \p F is used to derive code region and debug
884 /// location.
885 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
886 const Function *F);
887
888 static bool classof(const DiagnosticInfo *DI) {
890 }
891
892 /// \see DiagnosticInfoOptimizationBase::isEnabled.
893 bool isEnabled() const override;
894
895 static const char *AlwaysPrint;
896
897 bool shouldAlwaysPrint() const { return getPassName() == AlwaysPrint; }
898
899protected:
901 const Function &Fn, const DiagnosticLocation &Loc,
902 const Twine &Msg)
904
906 StringRef RemarkName,
907 const DiagnosticLocation &Loc,
908 const BasicBlock *CodeRegion);
909
910private:
911 /// This is deprecated now and only used by the function API below.
912 /// \p PassName is the name of the pass emitting this diagnostic. If
913 /// this name matches the regular expression given in -Rpass-analysis=, then
914 /// the diagnostic will be emitted. \p Fn is the function where the diagnostic
915 /// is being emitted. \p Loc is the location information to use in the
916 /// diagnostic. If line table information is available, the diagnostic will
917 /// include the source code location. \p Msg is the message to show. Note that
918 /// this class does not copy this message, so this reference must be valid for
919 /// the whole life time of the diagnostic.
920 OptimizationRemarkAnalysis(const char *PassName, const Function &Fn,
921 const DiagnosticLocation &Loc, const Twine &Msg)
923 PassName, Fn, Loc, Msg) {}
924};
925
926/// Diagnostic information for optimization analysis remarks related to
927/// floating-point non-commutativity.
930 void anchor() override;
931public:
932 /// \p PassName is the name of the pass emitting this diagnostic. If this name
933 /// matches the regular expression given in -Rpass-analysis=, then the
934 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
935 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
936 /// CodeRegion is the region that the optimization operates on. The front-end
937 /// will append its own message related to options that address floating-point
938 /// non-commutativity.
945
946 static bool classof(const DiagnosticInfo *DI) {
948 }
949
950private:
951 /// This is deprecated now and only used by the function API below.
952 /// \p PassName is the name of the pass emitting this diagnostic. If
953 /// this name matches the regular expression given in -Rpass-analysis=, then
954 /// the diagnostic will be emitted. \p Fn is the function where the diagnostic
955 /// is being emitted. \p Loc is the location information to use in the
956 /// diagnostic. If line table information is available, the diagnostic will
957 /// include the source code location. \p Msg is the message to show. The
958 /// front-end will append its own message related to options that address
959 /// floating-point non-commutativity. Note that this class does not copy this
960 /// message, so this reference must be valid for the whole life time of the
961 /// diagnostic.
963 const DiagnosticLocation &Loc,
964 const Twine &Msg)
966 PassName, Fn, Loc, Msg) {}
967};
968
969/// Diagnostic information for optimization analysis remarks related to
970/// pointer aliasing.
973 void anchor() override;
974public:
975 /// \p PassName is the name of the pass emitting this diagnostic. If this name
976 /// matches the regular expression given in -Rpass-analysis=, then the
977 /// diagnostic will be emitted. \p RemarkName is a textual identifier for the
978 /// remark (single-word, CamelCase). \p Loc is the debug location and \p
979 /// CodeRegion is the region that the optimization operates on. The front-end
980 /// will append its own message related to options that address pointer
981 /// aliasing legality.
987
988 static bool classof(const DiagnosticInfo *DI) {
990 }
991
992private:
993 /// This is deprecated now and only used by the function API below.
994 /// \p PassName is the name of the pass emitting this diagnostic. If
995 /// this name matches the regular expression given in -Rpass-analysis=, then
996 /// the diagnostic will be emitted. \p Fn is the function where the diagnostic
997 /// is being emitted. \p Loc is the location information to use in the
998 /// diagnostic. If line table information is available, the diagnostic will
999 /// include the source code location. \p Msg is the message to show. The
1000 /// front-end will append its own message related to options that address
1001 /// pointer aliasing legality. Note that this class does not copy this
1002 /// message, so this reference must be valid for the whole life time of the
1003 /// diagnostic.
1005 const DiagnosticLocation &Loc,
1006 const Twine &Msg)
1008 PassName, Fn, Loc, Msg) {}
1009};
1010
1011/// Diagnostic information for machine IR parser.
1012// FIXME: Remove this, use DiagnosticInfoSrcMgr instead.
1014 const SMDiagnostic &Diagnostic;
1015
1016public:
1018 const SMDiagnostic &Diagnostic)
1019 : DiagnosticInfo(DK_MIRParser, Severity), Diagnostic(Diagnostic) {}
1020
1021 const SMDiagnostic &getDiagnostic() const { return Diagnostic; }
1022
1023 void print(DiagnosticPrinter &DP) const override;
1024
1025 static bool classof(const DiagnosticInfo *DI) {
1026 return DI->getKind() == DK_MIRParser;
1027 }
1028};
1029
1030/// Diagnostic information for IR instrumentation reporting.
1032 const Twine &Msg;
1033
1034public:
1036 DiagnosticSeverity Severity = DS_Warning)
1037 : DiagnosticInfo(DK_Instrumentation, Severity), Msg(DiagMsg) {}
1038
1039 void print(DiagnosticPrinter &DP) const override;
1040
1041 static bool classof(const DiagnosticInfo *DI) {
1042 return DI->getKind() == DK_Instrumentation;
1043 }
1044};
1045
1046/// Diagnostic information for ISel fallback path.
1048 /// The function that is concerned by this diagnostic.
1049 const Function &Fn;
1050
1051public:
1053 DiagnosticSeverity Severity = DS_Warning)
1054 : DiagnosticInfo(DK_ISelFallback, Severity), Fn(Fn) {}
1055
1056 const Function &getFunction() const { return Fn; }
1057
1058 void print(DiagnosticPrinter &DP) const override;
1059
1060 static bool classof(const DiagnosticInfo *DI) {
1061 return DI->getKind() == DK_ISelFallback;
1062 }
1063};
1064
1065// Create wrappers for C Binding types (see CBindingWrapping.h).
1067
1068/// Diagnostic information for optimization failures.
1071public:
1072 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
1073 /// the location information to use in the diagnostic. If line table
1074 /// information is available, the diagnostic will include the source code
1075 /// location. \p Msg is the message to show. Note that this class does not
1076 /// copy this message, so this reference must be valid for the whole life time
1077 /// of the diagnostic.
1083
1084 /// \p PassName is the name of the pass emitting this diagnostic. \p
1085 /// RemarkName is a textual identifier for the remark (single-word,
1086 /// CamelCase). \p Loc is the debug location and \p CodeRegion is the
1087 /// region that the optimization operates on.
1089 const DiagnosticLocation &Loc,
1090 const BasicBlock *CodeRegion);
1091
1092 static bool classof(const DiagnosticInfo *DI) {
1093 return DI->getKind() == DK_OptimizationFailure;
1094 }
1095
1096 /// \see DiagnosticInfoOptimizationBase::isEnabled.
1097 bool isEnabled() const override;
1098};
1099
1100/// Diagnostic information for unsupported feature in backend.
1103private:
1104 const Twine &Msg;
1105
1106public:
1107 /// \p Fn is the function where the diagnostic is being emitted. \p Loc is
1108 /// the location information to use in the diagnostic. If line table
1109 /// information is available, the diagnostic will include the source code
1110 /// location. \p Msg is the message to show. Note that this class does not
1111 /// copy this message, so this reference must be valid for the whole life time
1112 /// of the diagnostic.
1114 const Function &Fn, const Twine &Msg LLVM_LIFETIME_BOUND,
1116 DiagnosticSeverity Severity = DS_Error)
1117 : DiagnosticInfoWithLocationBase(DK_Unsupported, Severity, Fn, Loc),
1118 Msg(Msg) {}
1119
1120 static bool classof(const DiagnosticInfo *DI) {
1121 return DI->getKind() == DK_Unsupported;
1122 }
1123
1124 const Twine &getMessage() const { return Msg; }
1125
1126 void print(DiagnosticPrinter &DP) const override;
1127};
1128
1129/// Diagnostic information for MisExpect analysis.
1131public:
1133 const Twine &Msg LLVM_LIFETIME_BOUND);
1134
1135 /// \see DiagnosticInfo::print.
1136 void print(DiagnosticPrinter &DP) const override;
1137
1138 static bool classof(const DiagnosticInfo *DI) {
1139 return DI->getKind() == DK_MisExpect;
1140 }
1141
1142 const Twine &getMsg() const { return Msg; }
1143
1144private:
1145 /// Message to report.
1146 const Twine &Msg;
1147};
1148
1150 switch (DK) {
1152 return DS_Error;
1153 break;
1155 return DS_Warning;
1156 break;
1158 return DS_Note;
1159 break;
1161 return DS_Remark;
1162 break;
1163 }
1164 llvm_unreachable("unknown SourceMgr::DiagKind");
1165}
1166
1167/// Diagnostic information for SMDiagnostic reporting.
1169 const SMDiagnostic &Diagnostic;
1170 StringRef ModName;
1171
1172 // For inlineasm !srcloc translation.
1173 bool InlineAsmDiag;
1174 uint64_t LocCookie;
1175
1176public:
1177 DiagnosticInfoSrcMgr(const SMDiagnostic &Diagnostic, StringRef ModName,
1178 bool InlineAsmDiag = true, uint64_t LocCookie = 0)
1180 Diagnostic(Diagnostic), ModName(ModName), InlineAsmDiag(InlineAsmDiag),
1181 LocCookie(LocCookie) {}
1182
1183 StringRef getModuleName() const { return ModName; }
1184 bool isInlineAsmDiag() const { return InlineAsmDiag; }
1185 const SMDiagnostic &getSMDiag() const { return Diagnostic; }
1186 uint64_t getLocCookie() const { return LocCookie; }
1187 void print(DiagnosticPrinter &DP) const override;
1188
1189 static bool classof(const DiagnosticInfo *DI) {
1190 return DI->getKind() == DK_SrcMgr;
1191 }
1192};
1193
1194LLVM_ABI void diagnoseDontCall(const CallInst &CI);
1195
1197 StringRef CalleeName;
1198 StringRef Note;
1199 uint64_t LocCookie;
1200
1201public:
1203 DiagnosticSeverity DS, uint64_t LocCookie)
1204 : DiagnosticInfo(DK_DontCall, DS), CalleeName(CalleeName), Note(Note),
1205 LocCookie(LocCookie) {}
1206 StringRef getFunctionName() const { return CalleeName; }
1207 StringRef getNote() const { return Note; }
1208 uint64_t getLocCookie() const { return LocCookie; }
1209 void print(DiagnosticPrinter &DP) const override;
1210 static bool classof(const DiagnosticInfo *DI) {
1211 return DI->getKind() == DK_DontCall;
1212 }
1213};
1214
1215} // end namespace llvm
1216
1217#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.