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