10832f82f763185767d63ae4bf05021c5630c155fJordan Rose//===- DiagnosticNames.h - Defines a table of all builtin diagnostics ------==//
20832f82f763185767d63ae4bf05021c5630c155fJordan Rose//
30832f82f763185767d63ae4bf05021c5630c155fJordan Rose//                     The LLVM Compiler Infrastructure
40832f82f763185767d63ae4bf05021c5630c155fJordan Rose//
50832f82f763185767d63ae4bf05021c5630c155fJordan Rose// This file is distributed under the University of Illinois Open Source
60832f82f763185767d63ae4bf05021c5630c155fJordan Rose// License. See LICENSE.TXT for details.
70832f82f763185767d63ae4bf05021c5630c155fJordan Rose//
80832f82f763185767d63ae4bf05021c5630c155fJordan Rose//===----------------------------------------------------------------------===//
90832f82f763185767d63ae4bf05021c5630c155fJordan Rose
10e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "llvm/ADT/ArrayRef.h"
110832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "llvm/ADT/StringRef.h"
120832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "llvm/Support/DataTypes.h"
130832f82f763185767d63ae4bf05021c5630c155fJordan Rose
140832f82f763185767d63ae4bf05021c5630c155fJordan Rosenamespace diagtool {
15e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
160832f82f763185767d63ae4bf05021c5630c155fJordan Rose  struct DiagnosticRecord {
170832f82f763185767d63ae4bf05021c5630c155fJordan Rose    const char *NameStr;
18e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    short DiagID;
190832f82f763185767d63ae4bf05021c5630c155fJordan Rose    uint8_t NameLen;
200832f82f763185767d63ae4bf05021c5630c155fJordan Rose
210832f82f763185767d63ae4bf05021c5630c155fJordan Rose    llvm::StringRef getName() const {
220832f82f763185767d63ae4bf05021c5630c155fJordan Rose      return llvm::StringRef(NameStr, NameLen);
230832f82f763185767d63ae4bf05021c5630c155fJordan Rose    }
24e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
25e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    bool operator<(const DiagnosticRecord &Other) const {
26e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      return getName() < Other.getName();
27e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    }
280832f82f763185767d63ae4bf05021c5630c155fJordan Rose  };
290832f82f763185767d63ae4bf05021c5630c155fJordan Rose
30e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  /// \brief Get every diagnostic in the system, sorted by name.
31e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  llvm::ArrayRef<DiagnosticRecord> getBuiltinDiagnosticsByName();
32e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
33e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  /// \brief Get a diagnostic by its ID.
34e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  const DiagnosticRecord &getDiagnosticForID(short DiagID);
35e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
36e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
37e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  struct GroupRecord {
38354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper    uint16_t NameOffset;
39b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper    uint16_t Members;
40b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper    uint16_t SubGroups;
41b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper
42354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper    llvm::StringRef getName() const;
43e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
44e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    template<typename RecordType>
45e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    class group_iterator {
46e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      const short *CurrentID;
47e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
48e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      friend struct GroupRecord;
49e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      group_iterator(const short *Start) : CurrentID(Start) {
50e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        if (CurrentID && *CurrentID == -1)
51ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          CurrentID = nullptr;
52e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      }
53e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
54e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    public:
55e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      typedef RecordType                 value_type;
56e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      typedef const value_type &         reference;
57e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      typedef const value_type *         pointer;
58e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      typedef std::forward_iterator_tag  iterator_category;
59e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      typedef std::ptrdiff_t             difference_type;
60e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
61e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      inline reference operator*() const;
62e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      inline pointer operator->() const {
63e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        return &operator*();
64e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      }
65e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
66e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      inline short getID() const {
67e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        return *CurrentID;
68e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      }
69e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
70e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      group_iterator &operator++() {
71e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        ++CurrentID;
72e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        if (*CurrentID == -1)
73ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          CurrentID = nullptr;
74e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        return *this;
75e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      }
76e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
77e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      bool operator==(group_iterator &Other) const {
78e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        return CurrentID == Other.CurrentID;
79e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      }
80e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
81e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      bool operator!=(group_iterator &Other) const {
82e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose        return CurrentID != Other.CurrentID;
83e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose      }
84e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    };
85e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
86e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    typedef group_iterator<GroupRecord> subgroup_iterator;
87b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper    subgroup_iterator subgroup_begin() const;
88b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper    subgroup_iterator subgroup_end() const;
89e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
90e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    typedef group_iterator<DiagnosticRecord> diagnostics_iterator;
91b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper    diagnostics_iterator diagnostics_begin() const;
92b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper    diagnostics_iterator diagnostics_end() const;
93e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
94354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper    bool operator<(llvm::StringRef Other) const {
95354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper      return getName() < Other;
96e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    }
97e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  };
98e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
99e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  /// \brief Get every diagnostic group in the system, sorted by name.
100e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  llvm::ArrayRef<GroupRecord> getDiagnosticGroups();
101e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
102e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  template<>
103e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  inline GroupRecord::subgroup_iterator::reference
104e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  GroupRecord::subgroup_iterator::operator*() const {
105e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    return getDiagnosticGroups()[*CurrentID];
106e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  }
1070832f82f763185767d63ae4bf05021c5630c155fJordan Rose
108e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  template<>
109e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  inline GroupRecord::diagnostics_iterator::reference
110e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  GroupRecord::diagnostics_iterator::operator*() const {
111e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose    return getDiagnosticForID(*CurrentID);
112e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  }
1130832f82f763185767d63ae4bf05021c5630c155fJordan Rose} // end namespace diagtool
1140832f82f763185767d63ae4bf05021c5630c155fJordan Rose
115