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