File indexing completed on 2026-05-10 08:44:00
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_IR_DIAGNOSTICINFO_H
0015 #define LLVM_IR_DIAGNOSTICINFO_H
0016
0017 #include "llvm-c/Types.h"
0018 #include "llvm/ADT/ArrayRef.h"
0019 #include "llvm/ADT/SmallVector.h"
0020 #include "llvm/ADT/StringRef.h"
0021 #include "llvm/ADT/Twine.h"
0022 #include "llvm/IR/DebugLoc.h"
0023 #include "llvm/Support/CBindingWrapping.h"
0024 #include "llvm/Support/ErrorHandling.h"
0025 #include "llvm/Support/SourceMgr.h"
0026 #include "llvm/Support/TypeSize.h"
0027 #include <algorithm>
0028 #include <cstdint>
0029 #include <functional>
0030 #include <iterator>
0031 #include <optional>
0032 #include <string>
0033
0034 namespace llvm {
0035
0036
0037 class DiagnosticPrinter;
0038 class DIFile;
0039 class DISubprogram;
0040 class CallInst;
0041 class Function;
0042 class Instruction;
0043 class InstructionCost;
0044 class Module;
0045 class Type;
0046 class Value;
0047
0048
0049 enum DiagnosticSeverity : char {
0050 DS_Error,
0051 DS_Warning,
0052 DS_Remark,
0053
0054
0055 DS_Note
0056 };
0057
0058
0059
0060 enum DiagnosticKind {
0061 DK_Generic,
0062 DK_GenericWithLoc,
0063 DK_InlineAsm,
0064 DK_RegAllocFailure,
0065 DK_ResourceLimit,
0066 DK_StackSize,
0067 DK_Linker,
0068 DK_Lowering,
0069 DK_DebugMetadataVersion,
0070 DK_DebugMetadataInvalid,
0071 DK_Instrumentation,
0072 DK_ISelFallback,
0073 DK_SampleProfile,
0074 DK_OptimizationRemark,
0075 DK_OptimizationRemarkMissed,
0076 DK_OptimizationRemarkAnalysis,
0077 DK_OptimizationRemarkAnalysisFPCommute,
0078 DK_OptimizationRemarkAnalysisAliasing,
0079 DK_OptimizationFailure,
0080 DK_FirstRemark = DK_OptimizationRemark,
0081 DK_LastRemark = DK_OptimizationFailure,
0082 DK_MachineOptimizationRemark,
0083 DK_MachineOptimizationRemarkMissed,
0084 DK_MachineOptimizationRemarkAnalysis,
0085 DK_FirstMachineRemark = DK_MachineOptimizationRemark,
0086 DK_LastMachineRemark = DK_MachineOptimizationRemarkAnalysis,
0087 DK_MIRParser,
0088 DK_PGOProfile,
0089 DK_Unsupported,
0090 DK_SrcMgr,
0091 DK_DontCall,
0092 DK_MisExpect,
0093 DK_FirstPluginKind
0094
0095 };
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 int getNextAvailablePluginDiagnosticKind();
0106
0107
0108
0109
0110
0111
0112 class DiagnosticInfo {
0113 private:
0114
0115 const int Kind;
0116
0117 const DiagnosticSeverity Severity;
0118
0119 virtual void anchor();
0120 public:
0121 DiagnosticInfo( int Kind, DiagnosticSeverity Severity)
0122 : Kind(Kind), Severity(Severity) {}
0123
0124 virtual ~DiagnosticInfo() = default;
0125
0126 int getKind() const { return Kind; }
0127 DiagnosticSeverity getSeverity() const { return Severity; }
0128
0129
0130
0131
0132
0133
0134
0135 virtual void print(DiagnosticPrinter &DP) const = 0;
0136 };
0137
0138 using DiagnosticHandlerFunction = std::function<void(const DiagnosticInfo &)>;
0139
0140 class DiagnosticInfoGeneric : public DiagnosticInfo {
0141 const Twine &MsgStr;
0142 const Instruction *Inst = nullptr;
0143
0144 public:
0145
0146
0147
0148 DiagnosticInfoGeneric(const Twine &MsgStr,
0149 DiagnosticSeverity Severity = DS_Error)
0150 : DiagnosticInfo(DK_Generic, Severity), MsgStr(MsgStr) {}
0151
0152 DiagnosticInfoGeneric(const Instruction *I, const Twine &ErrMsg,
0153 DiagnosticSeverity Severity = DS_Error)
0154 : DiagnosticInfo(DK_Generic, Severity), MsgStr(ErrMsg), Inst(I) {}
0155
0156 const Twine &getMsgStr() const { return MsgStr; }
0157 const Instruction *getInstruction() const { return Inst; }
0158
0159
0160 void print(DiagnosticPrinter &DP) const override;
0161
0162 static bool classof(const DiagnosticInfo *DI) {
0163 return DI->getKind() == DK_Generic;
0164 }
0165 };
0166
0167
0168
0169 class DiagnosticInfoInlineAsm : public DiagnosticInfo {
0170 private:
0171
0172 uint64_t LocCookie = 0;
0173
0174 const Twine &MsgStr;
0175
0176 const Instruction *Instr = nullptr;
0177
0178 public:
0179
0180
0181
0182
0183 DiagnosticInfoInlineAsm(uint64_t LocCookie, const Twine &MsgStr,
0184 DiagnosticSeverity Severity = DS_Error);
0185
0186
0187
0188
0189
0190
0191 DiagnosticInfoInlineAsm(const Instruction &I, const Twine &MsgStr,
0192 DiagnosticSeverity Severity = DS_Error);
0193
0194 uint64_t getLocCookie() const { return LocCookie; }
0195 const Twine &getMsgStr() const { return MsgStr; }
0196 const Instruction *getInstruction() const { return Instr; }
0197
0198
0199 void print(DiagnosticPrinter &DP) const override;
0200
0201 static bool classof(const DiagnosticInfo *DI) {
0202 return DI->getKind() == DK_InlineAsm;
0203 }
0204 };
0205
0206
0207
0208 class DiagnosticInfoDebugMetadataVersion : public DiagnosticInfo {
0209 private:
0210
0211 const Module &M;
0212
0213 unsigned MetadataVersion;
0214
0215 public:
0216
0217
0218 DiagnosticInfoDebugMetadataVersion(const Module &M, unsigned MetadataVersion,
0219 DiagnosticSeverity Severity = DS_Warning)
0220 : DiagnosticInfo(DK_DebugMetadataVersion, Severity), M(M),
0221 MetadataVersion(MetadataVersion) {}
0222
0223 const Module &getModule() const { return M; }
0224 unsigned getMetadataVersion() const { return MetadataVersion; }
0225
0226
0227 void print(DiagnosticPrinter &DP) const override;
0228
0229 static bool classof(const DiagnosticInfo *DI) {
0230 return DI->getKind() == DK_DebugMetadataVersion;
0231 }
0232 };
0233
0234
0235 class DiagnosticInfoIgnoringInvalidDebugMetadata : public DiagnosticInfo {
0236 private:
0237
0238 const Module &M;
0239
0240 public:
0241
0242 DiagnosticInfoIgnoringInvalidDebugMetadata(
0243 const Module &M, DiagnosticSeverity Severity = DS_Warning)
0244 : DiagnosticInfo(DK_DebugMetadataVersion, Severity), M(M) {}
0245
0246 const Module &getModule() const { return M; }
0247
0248
0249 void print(DiagnosticPrinter &DP) const override;
0250
0251 static bool classof(const DiagnosticInfo *DI) {
0252 return DI->getKind() == DK_DebugMetadataInvalid;
0253 }
0254 };
0255
0256
0257 class DiagnosticInfoSampleProfile : public DiagnosticInfo {
0258 public:
0259 DiagnosticInfoSampleProfile(StringRef FileName, unsigned LineNum,
0260 const Twine &Msg,
0261 DiagnosticSeverity Severity = DS_Error)
0262 : DiagnosticInfo(DK_SampleProfile, Severity), FileName(FileName),
0263 LineNum(LineNum), Msg(Msg) {}
0264 DiagnosticInfoSampleProfile(StringRef FileName, const Twine &Msg,
0265 DiagnosticSeverity Severity = DS_Error)
0266 : DiagnosticInfo(DK_SampleProfile, Severity), FileName(FileName),
0267 Msg(Msg) {}
0268 DiagnosticInfoSampleProfile(const Twine &Msg,
0269 DiagnosticSeverity Severity = DS_Error)
0270 : DiagnosticInfo(DK_SampleProfile, Severity), Msg(Msg) {}
0271
0272
0273 void print(DiagnosticPrinter &DP) const override;
0274
0275 static bool classof(const DiagnosticInfo *DI) {
0276 return DI->getKind() == DK_SampleProfile;
0277 }
0278
0279 StringRef getFileName() const { return FileName; }
0280 unsigned getLineNum() const { return LineNum; }
0281 const Twine &getMsg() const { return Msg; }
0282
0283 private:
0284
0285 StringRef FileName;
0286
0287
0288
0289 unsigned LineNum = 0;
0290
0291
0292 const Twine &Msg;
0293 };
0294
0295
0296 class DiagnosticInfoPGOProfile : public DiagnosticInfo {
0297 public:
0298 DiagnosticInfoPGOProfile(const char *FileName, const Twine &Msg,
0299 DiagnosticSeverity Severity = DS_Error)
0300 : DiagnosticInfo(DK_PGOProfile, Severity), FileName(FileName), Msg(Msg) {}
0301
0302
0303 void print(DiagnosticPrinter &DP) const override;
0304
0305 static bool classof(const DiagnosticInfo *DI) {
0306 return DI->getKind() == DK_PGOProfile;
0307 }
0308
0309 const char *getFileName() const { return FileName; }
0310 const Twine &getMsg() const { return Msg; }
0311
0312 private:
0313
0314 const char *FileName;
0315
0316
0317 const Twine &Msg;
0318 };
0319
0320 class DiagnosticLocation {
0321 DIFile *File = nullptr;
0322 unsigned Line = 0;
0323 unsigned Column = 0;
0324
0325 public:
0326 DiagnosticLocation() = default;
0327 DiagnosticLocation(const DebugLoc &DL);
0328 DiagnosticLocation(const DISubprogram *SP);
0329
0330 bool isValid() const { return File; }
0331
0332 std::string getAbsolutePath() const;
0333
0334 StringRef getRelativePath() const;
0335 unsigned getLine() const { return Line; }
0336 unsigned getColumn() const { return Column; }
0337 };
0338
0339
0340 class DiagnosticInfoWithLocationBase : public DiagnosticInfo {
0341 void anchor() override;
0342 public:
0343
0344
0345 DiagnosticInfoWithLocationBase(enum DiagnosticKind Kind,
0346 enum DiagnosticSeverity Severity,
0347 const Function &Fn,
0348 const DiagnosticLocation &Loc)
0349 : DiagnosticInfo(Kind, Severity), Fn(Fn), Loc(Loc) {}
0350
0351
0352 bool isLocationAvailable() const { return Loc.isValid(); }
0353
0354
0355
0356
0357 std::string getLocationStr() const;
0358
0359
0360
0361 void getLocation(StringRef &RelativePath, unsigned &Line,
0362 unsigned &Column) const;
0363
0364
0365 std::string getAbsolutePath() const;
0366
0367 const Function &getFunction() const { return Fn; }
0368 DiagnosticLocation getLocation() const { return Loc; }
0369
0370 private:
0371
0372 const Function &Fn;
0373
0374
0375 DiagnosticLocation Loc;
0376 };
0377
0378 class DiagnosticInfoGenericWithLoc : public DiagnosticInfoWithLocationBase {
0379 private:
0380
0381 const Twine &MsgStr;
0382
0383 public:
0384
0385
0386
0387 DiagnosticInfoGenericWithLoc(const Twine &MsgStr, const Function &Fn,
0388 const DiagnosticLocation &Loc,
0389 DiagnosticSeverity Severity = DS_Error)
0390 : DiagnosticInfoWithLocationBase(DK_GenericWithLoc, Severity, Fn, Loc),
0391 MsgStr(MsgStr) {}
0392
0393 const Twine &getMsgStr() const { return MsgStr; }
0394
0395
0396 void print(DiagnosticPrinter &DP) const override;
0397
0398 static bool classof(const DiagnosticInfo *DI) {
0399 return DI->getKind() == DK_GenericWithLoc;
0400 }
0401 };
0402
0403 class DiagnosticInfoRegAllocFailure : public DiagnosticInfoWithLocationBase {
0404 private:
0405
0406 const Twine &MsgStr;
0407
0408 public:
0409
0410
0411
0412 DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn,
0413 const DiagnosticLocation &DL,
0414 DiagnosticSeverity Severity = DS_Error);
0415
0416 DiagnosticInfoRegAllocFailure(const Twine &MsgStr, const Function &Fn,
0417 DiagnosticSeverity Severity = DS_Error);
0418
0419 const Twine &getMsgStr() const { return MsgStr; }
0420
0421
0422 void print(DiagnosticPrinter &DP) const override;
0423
0424 static bool classof(const DiagnosticInfo *DI) {
0425 return DI->getKind() == DK_RegAllocFailure;
0426 }
0427 };
0428
0429
0430
0431 class DiagnosticInfoResourceLimit : public DiagnosticInfoWithLocationBase {
0432 private:
0433
0434 const Function &Fn;
0435
0436
0437 const char *ResourceName;
0438
0439
0440 uint64_t ResourceSize;
0441
0442
0443 uint64_t ResourceLimit;
0444
0445 public:
0446
0447
0448 DiagnosticInfoResourceLimit(const Function &Fn, const char *ResourceName,
0449 uint64_t ResourceSize, uint64_t ResourceLimit,
0450 DiagnosticSeverity Severity = DS_Warning,
0451 DiagnosticKind Kind = DK_ResourceLimit);
0452
0453 const Function &getFunction() const { return Fn; }
0454 const char *getResourceName() const { return ResourceName; }
0455 uint64_t getResourceSize() const { return ResourceSize; }
0456 uint64_t getResourceLimit() const { return ResourceLimit; }
0457
0458
0459 void print(DiagnosticPrinter &DP) const override;
0460
0461 static bool classof(const DiagnosticInfo *DI) {
0462 return DI->getKind() == DK_ResourceLimit || DI->getKind() == DK_StackSize;
0463 }
0464 };
0465
0466 class DiagnosticInfoStackSize : public DiagnosticInfoResourceLimit {
0467 void anchor() override;
0468
0469 public:
0470 DiagnosticInfoStackSize(const Function &Fn, uint64_t StackSize,
0471 uint64_t StackLimit,
0472 DiagnosticSeverity Severity = DS_Warning)
0473 : DiagnosticInfoResourceLimit(Fn, "stack frame size", StackSize,
0474 StackLimit, Severity, DK_StackSize) {}
0475
0476 uint64_t getStackSize() const { return getResourceSize(); }
0477 uint64_t getStackLimit() const { return getResourceLimit(); }
0478
0479 static bool classof(const DiagnosticInfo *DI) {
0480 return DI->getKind() == DK_StackSize;
0481 }
0482 };
0483
0484
0485
0486 class DiagnosticInfoOptimizationBase : public DiagnosticInfoWithLocationBase {
0487 public:
0488
0489 struct setIsVerbose {};
0490
0491
0492
0493
0494
0495 struct setExtraArgs {};
0496
0497
0498
0499 struct Argument {
0500 std::string Key;
0501 std::string Val;
0502
0503 DiagnosticLocation Loc;
0504
0505 explicit Argument(StringRef Str = "") : Key("String"), Val(Str) {}
0506 Argument(StringRef Key, const Value *V);
0507 Argument(StringRef Key, const Type *T);
0508 Argument(StringRef Key, StringRef S);
0509 Argument(StringRef Key, const char *S) : Argument(Key, StringRef(S)) {};
0510 Argument(StringRef Key, int N);
0511 Argument(StringRef Key, float N);
0512 Argument(StringRef Key, long N);
0513 Argument(StringRef Key, long long N);
0514 Argument(StringRef Key, unsigned N);
0515 Argument(StringRef Key, unsigned long N);
0516 Argument(StringRef Key, unsigned long long N);
0517 Argument(StringRef Key, ElementCount EC);
0518 Argument(StringRef Key, bool B) : Key(Key), Val(B ? "true" : "false") {}
0519 Argument(StringRef Key, DebugLoc dl);
0520 Argument(StringRef Key, InstructionCost C);
0521 };
0522
0523
0524
0525
0526
0527
0528
0529 DiagnosticInfoOptimizationBase(enum DiagnosticKind Kind,
0530 enum DiagnosticSeverity Severity,
0531 const char *PassName, StringRef RemarkName,
0532 const Function &Fn,
0533 const DiagnosticLocation &Loc)
0534 : DiagnosticInfoWithLocationBase(Kind, Severity, Fn, Loc),
0535 PassName(PassName), RemarkName(RemarkName) {}
0536
0537 void insert(StringRef S);
0538 void insert(Argument A);
0539 void insert(setIsVerbose V);
0540 void insert(setExtraArgs EA);
0541
0542
0543 void print(DiagnosticPrinter &DP) const override;
0544
0545
0546
0547
0548
0549
0550 virtual bool isEnabled() const = 0;
0551
0552 StringRef getPassName() const { return PassName; }
0553 StringRef getRemarkName() const { return RemarkName; }
0554 std::string getMsg() const;
0555 std::optional<uint64_t> getHotness() const { return Hotness; }
0556 void setHotness(std::optional<uint64_t> H) { Hotness = H; }
0557
0558 bool isVerbose() const { return IsVerbose; }
0559
0560 ArrayRef<Argument> getArgs() const { return Args; }
0561
0562 static bool classof(const DiagnosticInfo *DI) {
0563 return (DI->getKind() >= DK_FirstRemark &&
0564 DI->getKind() <= DK_LastRemark) ||
0565 (DI->getKind() >= DK_FirstMachineRemark &&
0566 DI->getKind() <= DK_LastMachineRemark);
0567 }
0568
0569 bool isPassed() const {
0570 return (getKind() == DK_OptimizationRemark ||
0571 getKind() == DK_MachineOptimizationRemark);
0572 }
0573
0574 bool isMissed() const {
0575 return (getKind() == DK_OptimizationRemarkMissed ||
0576 getKind() == DK_MachineOptimizationRemarkMissed);
0577 }
0578
0579 bool isAnalysis() const {
0580 return (getKind() == DK_OptimizationRemarkAnalysis ||
0581 getKind() == DK_MachineOptimizationRemarkAnalysis);
0582 }
0583
0584 protected:
0585
0586
0587
0588 const char *PassName;
0589
0590
0591
0592
0593 StringRef RemarkName;
0594
0595
0596
0597 std::optional<uint64_t> Hotness;
0598
0599
0600 SmallVector<Argument, 4> Args;
0601
0602
0603 bool IsVerbose = false;
0604
0605
0606
0607
0608 int FirstExtraArgIndex = -1;
0609 };
0610
0611
0612
0613
0614 template <class RemarkT>
0615 RemarkT &
0616 operator<<(RemarkT &R,
0617 std::enable_if_t<
0618 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0619 StringRef>
0620 S) {
0621 R.insert(S);
0622 return R;
0623 }
0624
0625
0626
0627 template <class RemarkT>
0628 RemarkT &
0629 operator<<(RemarkT &&R,
0630 std::enable_if_t<
0631 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0632 StringRef>
0633 S) {
0634 R.insert(S);
0635 return R;
0636 }
0637
0638 template <class RemarkT>
0639 RemarkT &
0640 operator<<(RemarkT &R,
0641 std::enable_if_t<
0642 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0643 DiagnosticInfoOptimizationBase::Argument>
0644 A) {
0645 R.insert(A);
0646 return R;
0647 }
0648
0649 template <class RemarkT>
0650 RemarkT &
0651 operator<<(RemarkT &&R,
0652 std::enable_if_t<
0653 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0654 DiagnosticInfoOptimizationBase::Argument>
0655 A) {
0656 R.insert(A);
0657 return R;
0658 }
0659
0660 template <class RemarkT>
0661 RemarkT &
0662 operator<<(RemarkT &R,
0663 std::enable_if_t<
0664 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0665 DiagnosticInfoOptimizationBase::setIsVerbose>
0666 V) {
0667 R.insert(V);
0668 return R;
0669 }
0670
0671 template <class RemarkT>
0672 RemarkT &
0673 operator<<(RemarkT &&R,
0674 std::enable_if_t<
0675 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0676 DiagnosticInfoOptimizationBase::setIsVerbose>
0677 V) {
0678 R.insert(V);
0679 return R;
0680 }
0681
0682 template <class RemarkT>
0683 RemarkT &
0684 operator<<(RemarkT &R,
0685 std::enable_if_t<
0686 std::is_base_of<DiagnosticInfoOptimizationBase, RemarkT>::value,
0687 DiagnosticInfoOptimizationBase::setExtraArgs>
0688 EA) {
0689 R.insert(EA);
0690 return R;
0691 }
0692
0693
0694
0695 class DiagnosticInfoIROptimization : public DiagnosticInfoOptimizationBase {
0696 void anchor() override;
0697 public:
0698
0699
0700
0701
0702
0703
0704
0705
0706 DiagnosticInfoIROptimization(enum DiagnosticKind Kind,
0707 enum DiagnosticSeverity Severity,
0708 const char *PassName, StringRef RemarkName,
0709 const Function &Fn,
0710 const DiagnosticLocation &Loc,
0711 const Value *CodeRegion = nullptr)
0712 : DiagnosticInfoOptimizationBase(Kind, Severity, PassName, RemarkName, Fn,
0713 Loc),
0714 CodeRegion(CodeRegion) {}
0715
0716
0717
0718
0719
0720
0721
0722
0723 DiagnosticInfoIROptimization(const char *PassName, StringRef Prepend,
0724 const DiagnosticInfoIROptimization &Orig)
0725 : DiagnosticInfoOptimizationBase(
0726 (DiagnosticKind)Orig.getKind(), Orig.getSeverity(), PassName,
0727 Orig.RemarkName, Orig.getFunction(), Orig.getLocation()),
0728 CodeRegion(Orig.getCodeRegion()) {
0729 *this << Prepend;
0730 std::copy(Orig.Args.begin(), Orig.Args.end(), std::back_inserter(Args));
0731 }
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741 DiagnosticInfoIROptimization(enum DiagnosticKind Kind,
0742 enum DiagnosticSeverity Severity,
0743 const char *PassName, const Function &Fn,
0744 const DiagnosticLocation &Loc, const Twine &Msg)
0745 : DiagnosticInfoOptimizationBase(Kind, Severity, PassName, "", Fn, Loc) {
0746 *this << Msg.str();
0747 }
0748
0749 const Value *getCodeRegion() const { return CodeRegion; }
0750
0751 static bool classof(const DiagnosticInfo *DI) {
0752 return DI->getKind() >= DK_FirstRemark && DI->getKind() <= DK_LastRemark;
0753 }
0754
0755 private:
0756
0757
0758 const Value *CodeRegion = nullptr;
0759 };
0760
0761
0762 class OptimizationRemark : public DiagnosticInfoIROptimization {
0763 public:
0764
0765
0766
0767
0768
0769
0770 OptimizationRemark(const char *PassName, StringRef RemarkName,
0771 const DiagnosticLocation &Loc, const Value *CodeRegion);
0772
0773
0774
0775 OptimizationRemark(const char *PassName, StringRef RemarkName,
0776 const Instruction *Inst);
0777
0778
0779
0780 OptimizationRemark(const char *PassName, StringRef RemarkName,
0781 const Function *Func);
0782
0783 static bool classof(const DiagnosticInfo *DI) {
0784 return DI->getKind() == DK_OptimizationRemark;
0785 }
0786
0787
0788 bool isEnabled() const override;
0789
0790 private:
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800 OptimizationRemark(const char *PassName, const Function &Fn,
0801 const DiagnosticLocation &Loc, const Twine &Msg)
0802 : DiagnosticInfoIROptimization(DK_OptimizationRemark, DS_Remark, PassName,
0803 Fn, Loc, Msg) {}
0804 };
0805
0806
0807 class OptimizationRemarkMissed : public DiagnosticInfoIROptimization {
0808 public:
0809
0810
0811
0812
0813
0814
0815 OptimizationRemarkMissed(const char *PassName, StringRef RemarkName,
0816 const DiagnosticLocation &Loc,
0817 const Value *CodeRegion);
0818
0819
0820
0821 OptimizationRemarkMissed(const char *PassName, StringRef RemarkName,
0822 const Instruction *Inst);
0823
0824
0825
0826 OptimizationRemarkMissed(const char *PassName, StringRef RemarkName,
0827 const Function *F);
0828
0829 static bool classof(const DiagnosticInfo *DI) {
0830 return DI->getKind() == DK_OptimizationRemarkMissed;
0831 }
0832
0833
0834 bool isEnabled() const override;
0835
0836 private:
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846 OptimizationRemarkMissed(const char *PassName, const Function &Fn,
0847 const DiagnosticLocation &Loc, const Twine &Msg)
0848 : DiagnosticInfoIROptimization(DK_OptimizationRemarkMissed, DS_Remark,
0849 PassName, Fn, Loc, Msg) {}
0850 };
0851
0852
0853 class OptimizationRemarkAnalysis : public DiagnosticInfoIROptimization {
0854 public:
0855
0856
0857
0858
0859
0860
0861 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
0862 const DiagnosticLocation &Loc,
0863 const Value *CodeRegion);
0864
0865
0866
0867
0868
0869
0870
0871
0872 OptimizationRemarkAnalysis(const char *PassName, StringRef Prepend,
0873 const OptimizationRemarkAnalysis &Orig)
0874 : DiagnosticInfoIROptimization(PassName, Prepend, Orig) {}
0875
0876
0877
0878 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
0879 const Instruction *Inst);
0880
0881
0882
0883 OptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
0884 const Function *F);
0885
0886 static bool classof(const DiagnosticInfo *DI) {
0887 return DI->getKind() == DK_OptimizationRemarkAnalysis;
0888 }
0889
0890
0891 bool isEnabled() const override;
0892
0893 static const char *AlwaysPrint;
0894
0895 bool shouldAlwaysPrint() const { return getPassName() == AlwaysPrint; }
0896
0897 protected:
0898 OptimizationRemarkAnalysis(enum DiagnosticKind Kind, const char *PassName,
0899 const Function &Fn, const DiagnosticLocation &Loc,
0900 const Twine &Msg)
0901 : DiagnosticInfoIROptimization(Kind, DS_Remark, PassName, Fn, Loc, Msg) {}
0902
0903 OptimizationRemarkAnalysis(enum DiagnosticKind Kind, const char *PassName,
0904 StringRef RemarkName,
0905 const DiagnosticLocation &Loc,
0906 const Value *CodeRegion);
0907
0908 private:
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918 OptimizationRemarkAnalysis(const char *PassName, const Function &Fn,
0919 const DiagnosticLocation &Loc, const Twine &Msg)
0920 : DiagnosticInfoIROptimization(DK_OptimizationRemarkAnalysis, DS_Remark,
0921 PassName, Fn, Loc, Msg) {}
0922 };
0923
0924
0925
0926 class OptimizationRemarkAnalysisFPCommute : public OptimizationRemarkAnalysis {
0927 void anchor() override;
0928 public:
0929
0930
0931
0932
0933
0934
0935
0936 OptimizationRemarkAnalysisFPCommute(const char *PassName,
0937 StringRef RemarkName,
0938 const DiagnosticLocation &Loc,
0939 const Value *CodeRegion)
0940 : OptimizationRemarkAnalysis(DK_OptimizationRemarkAnalysisFPCommute,
0941 PassName, RemarkName, Loc, CodeRegion) {}
0942
0943 static bool classof(const DiagnosticInfo *DI) {
0944 return DI->getKind() == DK_OptimizationRemarkAnalysisFPCommute;
0945 }
0946
0947 private:
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959 OptimizationRemarkAnalysisFPCommute(const char *PassName, const Function &Fn,
0960 const DiagnosticLocation &Loc,
0961 const Twine &Msg)
0962 : OptimizationRemarkAnalysis(DK_OptimizationRemarkAnalysisFPCommute,
0963 PassName, Fn, Loc, Msg) {}
0964 };
0965
0966
0967
0968 class OptimizationRemarkAnalysisAliasing : public OptimizationRemarkAnalysis {
0969 void anchor() override;
0970 public:
0971
0972
0973
0974
0975
0976
0977
0978 OptimizationRemarkAnalysisAliasing(const char *PassName, StringRef RemarkName,
0979 const DiagnosticLocation &Loc,
0980 const Value *CodeRegion)
0981 : OptimizationRemarkAnalysis(DK_OptimizationRemarkAnalysisAliasing,
0982 PassName, RemarkName, Loc, CodeRegion) {}
0983
0984 static bool classof(const DiagnosticInfo *DI) {
0985 return DI->getKind() == DK_OptimizationRemarkAnalysisAliasing;
0986 }
0987
0988 private:
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000 OptimizationRemarkAnalysisAliasing(const char *PassName, const Function &Fn,
1001 const DiagnosticLocation &Loc,
1002 const Twine &Msg)
1003 : OptimizationRemarkAnalysis(DK_OptimizationRemarkAnalysisAliasing,
1004 PassName, Fn, Loc, Msg) {}
1005 };
1006
1007
1008
1009 class DiagnosticInfoMIRParser : public DiagnosticInfo {
1010 const SMDiagnostic &Diagnostic;
1011
1012 public:
1013 DiagnosticInfoMIRParser(DiagnosticSeverity Severity,
1014 const SMDiagnostic &Diagnostic)
1015 : DiagnosticInfo(DK_MIRParser, Severity), Diagnostic(Diagnostic) {}
1016
1017 const SMDiagnostic &getDiagnostic() const { return Diagnostic; }
1018
1019 void print(DiagnosticPrinter &DP) const override;
1020
1021 static bool classof(const DiagnosticInfo *DI) {
1022 return DI->getKind() == DK_MIRParser;
1023 }
1024 };
1025
1026
1027 class DiagnosticInfoInstrumentation : public DiagnosticInfo {
1028 const Twine &Msg;
1029
1030 public:
1031 DiagnosticInfoInstrumentation(const Twine &DiagMsg,
1032 DiagnosticSeverity Severity = DS_Warning)
1033 : DiagnosticInfo(DK_Instrumentation, Severity), Msg(DiagMsg) {}
1034
1035 void print(DiagnosticPrinter &DP) const override;
1036
1037 static bool classof(const DiagnosticInfo *DI) {
1038 return DI->getKind() == DK_Instrumentation;
1039 }
1040 };
1041
1042
1043 class DiagnosticInfoISelFallback : public DiagnosticInfo {
1044
1045 const Function &Fn;
1046
1047 public:
1048 DiagnosticInfoISelFallback(const Function &Fn,
1049 DiagnosticSeverity Severity = DS_Warning)
1050 : DiagnosticInfo(DK_ISelFallback, Severity), Fn(Fn) {}
1051
1052 const Function &getFunction() const { return Fn; }
1053
1054 void print(DiagnosticPrinter &DP) const override;
1055
1056 static bool classof(const DiagnosticInfo *DI) {
1057 return DI->getKind() == DK_ISelFallback;
1058 }
1059 };
1060
1061
1062 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DiagnosticInfo, LLVMDiagnosticInfoRef)
1063
1064
1065 class DiagnosticInfoOptimizationFailure : public DiagnosticInfoIROptimization {
1066 public:
1067
1068
1069
1070
1071
1072
1073 DiagnosticInfoOptimizationFailure(const Function &Fn,
1074 const DiagnosticLocation &Loc,
1075 const Twine &Msg)
1076 : DiagnosticInfoIROptimization(DK_OptimizationFailure, DS_Warning,
1077 nullptr, Fn, Loc, Msg) {}
1078
1079
1080
1081
1082
1083
1084 DiagnosticInfoOptimizationFailure(const char *PassName, StringRef RemarkName,
1085 const DiagnosticLocation &Loc,
1086 const Value *CodeRegion);
1087
1088 static bool classof(const DiagnosticInfo *DI) {
1089 return DI->getKind() == DK_OptimizationFailure;
1090 }
1091
1092
1093 bool isEnabled() const override;
1094 };
1095
1096
1097 class DiagnosticInfoUnsupported : public DiagnosticInfoWithLocationBase {
1098 private:
1099 Twine Msg;
1100
1101 public:
1102
1103
1104
1105
1106
1107
1108 DiagnosticInfoUnsupported(
1109 const Function &Fn, const Twine &Msg,
1110 const DiagnosticLocation &Loc = DiagnosticLocation(),
1111 DiagnosticSeverity Severity = DS_Error)
1112 : DiagnosticInfoWithLocationBase(DK_Unsupported, Severity, Fn, Loc),
1113 Msg(Msg) {}
1114
1115 static bool classof(const DiagnosticInfo *DI) {
1116 return DI->getKind() == DK_Unsupported;
1117 }
1118
1119 const Twine &getMessage() const { return Msg; }
1120
1121 void print(DiagnosticPrinter &DP) const override;
1122 };
1123
1124
1125 class DiagnosticInfoMisExpect : public DiagnosticInfoWithLocationBase {
1126 public:
1127 DiagnosticInfoMisExpect(const Instruction *Inst, Twine &Msg);
1128
1129
1130 void print(DiagnosticPrinter &DP) const override;
1131
1132 static bool classof(const DiagnosticInfo *DI) {
1133 return DI->getKind() == DK_MisExpect;
1134 }
1135
1136 const Twine &getMsg() const { return Msg; }
1137
1138 private:
1139
1140 const Twine &Msg;
1141 };
1142
1143 static DiagnosticSeverity getDiagnosticSeverity(SourceMgr::DiagKind DK) {
1144 switch (DK) {
1145 case llvm::SourceMgr::DK_Error:
1146 return DS_Error;
1147 break;
1148 case llvm::SourceMgr::DK_Warning:
1149 return DS_Warning;
1150 break;
1151 case llvm::SourceMgr::DK_Note:
1152 return DS_Note;
1153 break;
1154 case llvm::SourceMgr::DK_Remark:
1155 return DS_Remark;
1156 break;
1157 }
1158 llvm_unreachable("unknown SourceMgr::DiagKind");
1159 }
1160
1161
1162 class DiagnosticInfoSrcMgr : public DiagnosticInfo {
1163 const SMDiagnostic &Diagnostic;
1164 StringRef ModName;
1165
1166
1167 bool InlineAsmDiag;
1168 uint64_t LocCookie;
1169
1170 public:
1171 DiagnosticInfoSrcMgr(const SMDiagnostic &Diagnostic, StringRef ModName,
1172 bool InlineAsmDiag = true, uint64_t LocCookie = 0)
1173 : DiagnosticInfo(DK_SrcMgr, getDiagnosticSeverity(Diagnostic.getKind())),
1174 Diagnostic(Diagnostic), ModName(ModName), InlineAsmDiag(InlineAsmDiag),
1175 LocCookie(LocCookie) {}
1176
1177 StringRef getModuleName() const { return ModName; }
1178 bool isInlineAsmDiag() const { return InlineAsmDiag; }
1179 const SMDiagnostic &getSMDiag() const { return Diagnostic; }
1180 uint64_t getLocCookie() const { return LocCookie; }
1181 void print(DiagnosticPrinter &DP) const override;
1182
1183 static bool classof(const DiagnosticInfo *DI) {
1184 return DI->getKind() == DK_SrcMgr;
1185 }
1186 };
1187
1188 void diagnoseDontCall(const CallInst &CI);
1189
1190 class DiagnosticInfoDontCall : public DiagnosticInfo {
1191 StringRef CalleeName;
1192 StringRef Note;
1193 uint64_t LocCookie;
1194
1195 public:
1196 DiagnosticInfoDontCall(StringRef CalleeName, StringRef Note,
1197 DiagnosticSeverity DS, uint64_t LocCookie)
1198 : DiagnosticInfo(DK_DontCall, DS), CalleeName(CalleeName), Note(Note),
1199 LocCookie(LocCookie) {}
1200 StringRef getFunctionName() const { return CalleeName; }
1201 StringRef getNote() const { return Note; }
1202 uint64_t getLocCookie() const { return LocCookie; }
1203 void print(DiagnosticPrinter &DP) const override;
1204 static bool classof(const DiagnosticInfo *DI) {
1205 return DI->getKind() == DK_DontCall;
1206 }
1207 };
1208
1209 }
1210
1211 #endif