1*67e74705SXin Li //===- DiagnosticNames.cpp - 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 #include "DiagnosticNames.h"
11*67e74705SXin Li #include "clang/Basic/AllDiagnostics.h"
12*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
13*67e74705SXin Li
14*67e74705SXin Li using namespace clang;
15*67e74705SXin Li using namespace diagtool;
16*67e74705SXin Li
17*67e74705SXin Li static const DiagnosticRecord BuiltinDiagnosticsByName[] = {
18*67e74705SXin Li #define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
19*67e74705SXin Li #include "clang/Basic/DiagnosticIndexName.inc"
20*67e74705SXin Li #undef DIAG_NAME_INDEX
21*67e74705SXin Li };
22*67e74705SXin Li
getBuiltinDiagnosticsByName()23*67e74705SXin Li llvm::ArrayRef<DiagnosticRecord> diagtool::getBuiltinDiagnosticsByName() {
24*67e74705SXin Li return llvm::makeArrayRef(BuiltinDiagnosticsByName);
25*67e74705SXin Li }
26*67e74705SXin Li
27*67e74705SXin Li
28*67e74705SXin Li // FIXME: Is it worth having two tables, especially when this one can get
29*67e74705SXin Li // out of sync easily?
30*67e74705SXin Li static const DiagnosticRecord BuiltinDiagnosticsByID[] = {
31*67e74705SXin Li #define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC,GROUP, \
32*67e74705SXin Li SFINAE,NOWERROR,SHOWINSYSHEADER,CATEGORY) \
33*67e74705SXin Li { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
34*67e74705SXin Li #include "clang/Basic/DiagnosticCommonKinds.inc"
35*67e74705SXin Li #include "clang/Basic/DiagnosticDriverKinds.inc"
36*67e74705SXin Li #include "clang/Basic/DiagnosticFrontendKinds.inc"
37*67e74705SXin Li #include "clang/Basic/DiagnosticSerializationKinds.inc"
38*67e74705SXin Li #include "clang/Basic/DiagnosticLexKinds.inc"
39*67e74705SXin Li #include "clang/Basic/DiagnosticParseKinds.inc"
40*67e74705SXin Li #include "clang/Basic/DiagnosticASTKinds.inc"
41*67e74705SXin Li #include "clang/Basic/DiagnosticCommentKinds.inc"
42*67e74705SXin Li #include "clang/Basic/DiagnosticSemaKinds.inc"
43*67e74705SXin Li #include "clang/Basic/DiagnosticAnalysisKinds.inc"
44*67e74705SXin Li #undef DIAG
45*67e74705SXin Li };
46*67e74705SXin Li
orderByID(const DiagnosticRecord & Left,const DiagnosticRecord & Right)47*67e74705SXin Li static bool orderByID(const DiagnosticRecord &Left,
48*67e74705SXin Li const DiagnosticRecord &Right) {
49*67e74705SXin Li return Left.DiagID < Right.DiagID;
50*67e74705SXin Li }
51*67e74705SXin Li
getDiagnosticForID(short DiagID)52*67e74705SXin Li const DiagnosticRecord &diagtool::getDiagnosticForID(short DiagID) {
53*67e74705SXin Li DiagnosticRecord Key = {nullptr, DiagID, 0};
54*67e74705SXin Li
55*67e74705SXin Li const DiagnosticRecord *Result =
56*67e74705SXin Li std::lower_bound(std::begin(BuiltinDiagnosticsByID),
57*67e74705SXin Li std::end(BuiltinDiagnosticsByID),
58*67e74705SXin Li Key, orderByID);
59*67e74705SXin Li assert(Result && "diagnostic not found; table may be out of date");
60*67e74705SXin Li return *Result;
61*67e74705SXin Li }
62*67e74705SXin Li
63*67e74705SXin Li
64*67e74705SXin Li #define GET_DIAG_ARRAYS
65*67e74705SXin Li #include "clang/Basic/DiagnosticGroups.inc"
66*67e74705SXin Li #undef GET_DIAG_ARRAYS
67*67e74705SXin Li
68*67e74705SXin Li // Second the table of options, sorted by name for fast binary lookup.
69*67e74705SXin Li static const GroupRecord OptionTable[] = {
70*67e74705SXin Li #define GET_DIAG_TABLE
71*67e74705SXin Li #include "clang/Basic/DiagnosticGroups.inc"
72*67e74705SXin Li #undef GET_DIAG_TABLE
73*67e74705SXin Li };
74*67e74705SXin Li
getName() const75*67e74705SXin Li llvm::StringRef GroupRecord::getName() const {
76*67e74705SXin Li return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]);
77*67e74705SXin Li }
78*67e74705SXin Li
subgroup_begin() const79*67e74705SXin Li GroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const {
80*67e74705SXin Li return DiagSubGroups + SubGroups;
81*67e74705SXin Li }
82*67e74705SXin Li
subgroup_end() const83*67e74705SXin Li GroupRecord::subgroup_iterator GroupRecord::subgroup_end() const {
84*67e74705SXin Li return nullptr;
85*67e74705SXin Li }
86*67e74705SXin Li
diagnostics_begin() const87*67e74705SXin Li GroupRecord::diagnostics_iterator GroupRecord::diagnostics_begin() const {
88*67e74705SXin Li return DiagArrays + Members;
89*67e74705SXin Li }
90*67e74705SXin Li
diagnostics_end() const91*67e74705SXin Li GroupRecord::diagnostics_iterator GroupRecord::diagnostics_end() const {
92*67e74705SXin Li return nullptr;
93*67e74705SXin Li }
94*67e74705SXin Li
getDiagnosticGroups()95*67e74705SXin Li llvm::ArrayRef<GroupRecord> diagtool::getDiagnosticGroups() {
96*67e74705SXin Li return llvm::makeArrayRef(OptionTable);
97*67e74705SXin Li }
98