xref: /aosp_15_r20/external/clang/tools/diagtool/DiagnosticNames.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- DiagnosticNames.h - Defines a table of all builtin diagnostics ------==//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #ifndef LLVM_CLANG_TOOLS_DIAGTOOL_DIAGNOSTICNAMES_H
11*67e74705SXin Li #define LLVM_CLANG_TOOLS_DIAGTOOL_DIAGNOSTICNAMES_H
12*67e74705SXin Li 
13*67e74705SXin Li #include "llvm/ADT/ArrayRef.h"
14*67e74705SXin Li #include "llvm/ADT/StringRef.h"
15*67e74705SXin Li #include "llvm/Support/DataTypes.h"
16*67e74705SXin Li 
17*67e74705SXin Li namespace diagtool {
18*67e74705SXin Li 
19*67e74705SXin Li   struct DiagnosticRecord {
20*67e74705SXin Li     const char *NameStr;
21*67e74705SXin Li     short DiagID;
22*67e74705SXin Li     uint8_t NameLen;
23*67e74705SXin Li 
getNameDiagnosticRecord24*67e74705SXin Li     llvm::StringRef getName() const {
25*67e74705SXin Li       return llvm::StringRef(NameStr, NameLen);
26*67e74705SXin Li     }
27*67e74705SXin Li 
28*67e74705SXin Li     bool operator<(const DiagnosticRecord &Other) const {
29*67e74705SXin Li       return getName() < Other.getName();
30*67e74705SXin Li     }
31*67e74705SXin Li   };
32*67e74705SXin Li 
33*67e74705SXin Li   /// \brief Get every diagnostic in the system, sorted by name.
34*67e74705SXin Li   llvm::ArrayRef<DiagnosticRecord> getBuiltinDiagnosticsByName();
35*67e74705SXin Li 
36*67e74705SXin Li   /// \brief Get a diagnostic by its ID.
37*67e74705SXin Li   const DiagnosticRecord &getDiagnosticForID(short DiagID);
38*67e74705SXin Li 
39*67e74705SXin Li 
40*67e74705SXin Li   struct GroupRecord {
41*67e74705SXin Li     uint16_t NameOffset;
42*67e74705SXin Li     uint16_t Members;
43*67e74705SXin Li     uint16_t SubGroups;
44*67e74705SXin Li 
45*67e74705SXin Li     llvm::StringRef getName() const;
46*67e74705SXin Li 
47*67e74705SXin Li     template<typename RecordType>
48*67e74705SXin Li     class group_iterator {
49*67e74705SXin Li       const short *CurrentID;
50*67e74705SXin Li 
51*67e74705SXin Li       friend struct GroupRecord;
group_iteratorGroupRecord52*67e74705SXin Li       group_iterator(const short *Start) : CurrentID(Start) {
53*67e74705SXin Li         if (CurrentID && *CurrentID == -1)
54*67e74705SXin Li           CurrentID = nullptr;
55*67e74705SXin Li       }
56*67e74705SXin Li 
57*67e74705SXin Li     public:
58*67e74705SXin Li       typedef RecordType                 value_type;
59*67e74705SXin Li       typedef const value_type &         reference;
60*67e74705SXin Li       typedef const value_type *         pointer;
61*67e74705SXin Li       typedef std::forward_iterator_tag  iterator_category;
62*67e74705SXin Li       typedef std::ptrdiff_t             difference_type;
63*67e74705SXin Li 
64*67e74705SXin Li       inline reference operator*() const;
65*67e74705SXin Li       inline pointer operator->() const {
66*67e74705SXin Li         return &operator*();
67*67e74705SXin Li       }
68*67e74705SXin Li 
getIDGroupRecord69*67e74705SXin Li       inline short getID() const {
70*67e74705SXin Li         return *CurrentID;
71*67e74705SXin Li       }
72*67e74705SXin Li 
73*67e74705SXin Li       group_iterator &operator++() {
74*67e74705SXin Li         ++CurrentID;
75*67e74705SXin Li         if (*CurrentID == -1)
76*67e74705SXin Li           CurrentID = nullptr;
77*67e74705SXin Li         return *this;
78*67e74705SXin Li       }
79*67e74705SXin Li 
80*67e74705SXin Li       bool operator==(group_iterator &Other) const {
81*67e74705SXin Li         return CurrentID == Other.CurrentID;
82*67e74705SXin Li       }
83*67e74705SXin Li 
84*67e74705SXin Li       bool operator!=(group_iterator &Other) const {
85*67e74705SXin Li         return CurrentID != Other.CurrentID;
86*67e74705SXin Li       }
87*67e74705SXin Li     };
88*67e74705SXin Li 
89*67e74705SXin Li     typedef group_iterator<GroupRecord> subgroup_iterator;
90*67e74705SXin Li     subgroup_iterator subgroup_begin() const;
91*67e74705SXin Li     subgroup_iterator subgroup_end() const;
92*67e74705SXin Li 
93*67e74705SXin Li     typedef group_iterator<DiagnosticRecord> diagnostics_iterator;
94*67e74705SXin Li     diagnostics_iterator diagnostics_begin() const;
95*67e74705SXin Li     diagnostics_iterator diagnostics_end() const;
96*67e74705SXin Li 
97*67e74705SXin Li     bool operator<(llvm::StringRef Other) const {
98*67e74705SXin Li       return getName() < Other;
99*67e74705SXin Li     }
100*67e74705SXin Li   };
101*67e74705SXin Li 
102*67e74705SXin Li   /// \brief Get every diagnostic group in the system, sorted by name.
103*67e74705SXin Li   llvm::ArrayRef<GroupRecord> getDiagnosticGroups();
104*67e74705SXin Li 
105*67e74705SXin Li   template<>
106*67e74705SXin Li   inline GroupRecord::subgroup_iterator::reference
107*67e74705SXin Li   GroupRecord::subgroup_iterator::operator*() const {
108*67e74705SXin Li     return getDiagnosticGroups()[*CurrentID];
109*67e74705SXin Li   }
110*67e74705SXin Li 
111*67e74705SXin Li   template<>
112*67e74705SXin Li   inline GroupRecord::diagnostics_iterator::reference
113*67e74705SXin Li   GroupRecord::diagnostics_iterator::operator*() const {
114*67e74705SXin Li     return getDiagnosticForID(*CurrentID);
115*67e74705SXin Li   }
116*67e74705SXin Li } // end namespace diagtool
117*67e74705SXin Li 
118*67e74705SXin Li #endif
119