1e5dd7070Spatrick //===- DiagnosticNames.cpp - Defines a table of all builtin diagnostics ----==//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick
9e5dd7070Spatrick #include "DiagnosticNames.h"
10e5dd7070Spatrick #include "clang/Basic/AllDiagnostics.h"
11e5dd7070Spatrick #include "llvm/ADT/STLExtras.h"
12e5dd7070Spatrick
13e5dd7070Spatrick using namespace clang;
14e5dd7070Spatrick using namespace diagtool;
15e5dd7070Spatrick
16e5dd7070Spatrick static const DiagnosticRecord BuiltinDiagnosticsByName[] = {
17e5dd7070Spatrick #define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
18e5dd7070Spatrick #include "clang/Basic/DiagnosticIndexName.inc"
19e5dd7070Spatrick #undef DIAG_NAME_INDEX
20e5dd7070Spatrick };
21e5dd7070Spatrick
getBuiltinDiagnosticsByName()22e5dd7070Spatrick llvm::ArrayRef<DiagnosticRecord> diagtool::getBuiltinDiagnosticsByName() {
23*12c85518Srobert return llvm::ArrayRef(BuiltinDiagnosticsByName);
24e5dd7070Spatrick }
25e5dd7070Spatrick
26e5dd7070Spatrick
27e5dd7070Spatrick // FIXME: Is it worth having two tables, especially when this one can get
28e5dd7070Spatrick // out of sync easily?
29e5dd7070Spatrick static const DiagnosticRecord BuiltinDiagnosticsByID[] = {
30*12c85518Srobert #define DIAG(ENUM, CLASS, DEFAULT_MAPPING, DESC, GROUP, SFINAE, NOWERROR, \
31*12c85518Srobert SHOWINSYSHEADER, SHOWINSYSMACRO, DEFER, CATEGORY) \
32e5dd7070Spatrick {#ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t)},
33e5dd7070Spatrick #include "clang/Basic/DiagnosticCommonKinds.inc"
34e5dd7070Spatrick #include "clang/Basic/DiagnosticCrossTUKinds.inc"
35e5dd7070Spatrick #include "clang/Basic/DiagnosticDriverKinds.inc"
36e5dd7070Spatrick #include "clang/Basic/DiagnosticFrontendKinds.inc"
37e5dd7070Spatrick #include "clang/Basic/DiagnosticSerializationKinds.inc"
38e5dd7070Spatrick #include "clang/Basic/DiagnosticLexKinds.inc"
39e5dd7070Spatrick #include "clang/Basic/DiagnosticParseKinds.inc"
40e5dd7070Spatrick #include "clang/Basic/DiagnosticASTKinds.inc"
41e5dd7070Spatrick #include "clang/Basic/DiagnosticCommentKinds.inc"
42e5dd7070Spatrick #include "clang/Basic/DiagnosticSemaKinds.inc"
43e5dd7070Spatrick #include "clang/Basic/DiagnosticAnalysisKinds.inc"
44e5dd7070Spatrick #include "clang/Basic/DiagnosticRefactoringKinds.inc"
45e5dd7070Spatrick #undef DIAG
46e5dd7070Spatrick };
47e5dd7070Spatrick
orderByID(const DiagnosticRecord & Left,const DiagnosticRecord & Right)48e5dd7070Spatrick static bool orderByID(const DiagnosticRecord &Left,
49e5dd7070Spatrick const DiagnosticRecord &Right) {
50e5dd7070Spatrick return Left.DiagID < Right.DiagID;
51e5dd7070Spatrick }
52e5dd7070Spatrick
getDiagnosticForID(short DiagID)53e5dd7070Spatrick const DiagnosticRecord &diagtool::getDiagnosticForID(short DiagID) {
54e5dd7070Spatrick DiagnosticRecord Key = {nullptr, DiagID, 0};
55e5dd7070Spatrick
56e5dd7070Spatrick const DiagnosticRecord *Result =
57e5dd7070Spatrick llvm::lower_bound(BuiltinDiagnosticsByID, Key, orderByID);
58e5dd7070Spatrick assert(Result && "diagnostic not found; table may be out of date");
59e5dd7070Spatrick return *Result;
60e5dd7070Spatrick }
61e5dd7070Spatrick
62e5dd7070Spatrick
63e5dd7070Spatrick #define GET_DIAG_ARRAYS
64e5dd7070Spatrick #include "clang/Basic/DiagnosticGroups.inc"
65e5dd7070Spatrick #undef GET_DIAG_ARRAYS
66e5dd7070Spatrick
67e5dd7070Spatrick // Second the table of options, sorted by name for fast binary lookup.
68e5dd7070Spatrick static const GroupRecord OptionTable[] = {
69*12c85518Srobert #define DIAG_ENTRY(GroupName, FlagNameOffset, Members, SubGroups, Docs) \
70*12c85518Srobert {FlagNameOffset, Members, SubGroups},
71e5dd7070Spatrick #include "clang/Basic/DiagnosticGroups.inc"
72*12c85518Srobert #undef DIAG_ENTRY
73e5dd7070Spatrick };
74e5dd7070Spatrick
getName() const75e5dd7070Spatrick llvm::StringRef GroupRecord::getName() const {
76e5dd7070Spatrick return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]);
77e5dd7070Spatrick }
78e5dd7070Spatrick
subgroup_begin() const79e5dd7070Spatrick GroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const {
80e5dd7070Spatrick return DiagSubGroups + SubGroups;
81e5dd7070Spatrick }
82e5dd7070Spatrick
subgroup_end() const83e5dd7070Spatrick GroupRecord::subgroup_iterator GroupRecord::subgroup_end() const {
84e5dd7070Spatrick return nullptr;
85e5dd7070Spatrick }
86e5dd7070Spatrick
87e5dd7070Spatrick llvm::iterator_range<diagtool::GroupRecord::subgroup_iterator>
subgroups() const88e5dd7070Spatrick GroupRecord::subgroups() const {
89e5dd7070Spatrick return llvm::make_range(subgroup_begin(), subgroup_end());
90e5dd7070Spatrick }
91e5dd7070Spatrick
diagnostics_begin() const92e5dd7070Spatrick GroupRecord::diagnostics_iterator GroupRecord::diagnostics_begin() const {
93e5dd7070Spatrick return DiagArrays + Members;
94e5dd7070Spatrick }
95e5dd7070Spatrick
diagnostics_end() const96e5dd7070Spatrick GroupRecord::diagnostics_iterator GroupRecord::diagnostics_end() const {
97e5dd7070Spatrick return nullptr;
98e5dd7070Spatrick }
99e5dd7070Spatrick
100e5dd7070Spatrick llvm::iterator_range<diagtool::GroupRecord::diagnostics_iterator>
diagnostics() const101e5dd7070Spatrick GroupRecord::diagnostics() const {
102e5dd7070Spatrick return llvm::make_range(diagnostics_begin(), diagnostics_end());
103e5dd7070Spatrick }
104e5dd7070Spatrick
getDiagnosticGroups()105e5dd7070Spatrick llvm::ArrayRef<GroupRecord> diagtool::getDiagnosticGroups() {
106*12c85518Srobert return llvm::ArrayRef(OptionTable);
107e5dd7070Spatrick }
108