10832f82f763185767d63ae4bf05021c5630c155fJordan Rose//===- DiagnosticNames.cpp - 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
100832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "DiagnosticNames.h"
110832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "clang/Basic/AllDiagnostics.h"
12e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "llvm/ADT/STLExtras.h"
130832f82f763185767d63ae4bf05021c5630c155fJordan Rose
140832f82f763185767d63ae4bf05021c5630c155fJordan Roseusing namespace clang;
15e7427636767501903cfa51ccecafa7a4795a23c2Jordan Roseusing namespace diagtool;
160832f82f763185767d63ae4bf05021c5630c155fJordan Rose
17e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosestatic const DiagnosticRecord BuiltinDiagnosticsByName[] = {
180832f82f763185767d63ae4bf05021c5630c155fJordan Rose#define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
190832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "clang/Basic/DiagnosticIndexName.inc"
200832f82f763185767d63ae4bf05021c5630c155fJordan Rose#undef DIAG_NAME_INDEX
210832f82f763185767d63ae4bf05021c5630c155fJordan Rose};
220832f82f763185767d63ae4bf05021c5630c155fJordan Rose
23e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosellvm::ArrayRef<DiagnosticRecord> diagtool::getBuiltinDiagnosticsByName() {
2419bf662a7c5df007f2809ad3b6eb0a3985003e73Jordan Rose  return llvm::makeArrayRef(BuiltinDiagnosticsByName);
25e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose}
260832f82f763185767d63ae4bf05021c5630c155fJordan Rose
27e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
28e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose// FIXME: Is it worth having two tables, especially when this one can get
29e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose// out of sync easily?
30e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosestatic const DiagnosticRecord BuiltinDiagnosticsByID[] = {
31e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC,GROUP,               \
323347b497157d36cf280d1d9f52956faa6e702f34Richard Smith             SFINAE,NOWERROR,SHOWINSYSHEADER,CATEGORY)            \
33e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
34e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticCommonKinds.inc"
35e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticDriverKinds.inc"
36e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticFrontendKinds.inc"
37e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticSerializationKinds.inc"
38e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticLexKinds.inc"
39e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticParseKinds.inc"
40e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticASTKinds.inc"
41a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko#include "clang/Basic/DiagnosticCommentKinds.inc"
42e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticSemaKinds.inc"
43e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticAnalysisKinds.inc"
44e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#undef DIAG
45e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose};
46e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
47e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosestatic bool orderByID(const DiagnosticRecord &Left,
48e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose                      const DiagnosticRecord &Right) {
49e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  return Left.DiagID < Right.DiagID;
50e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose}
51e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
52e7427636767501903cfa51ccecafa7a4795a23c2Jordan Roseconst DiagnosticRecord &diagtool::getDiagnosticForID(short DiagID) {
53ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  DiagnosticRecord Key = {nullptr, DiagID, 0};
54e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
55e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  const DiagnosticRecord *Result =
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    std::lower_bound(std::begin(BuiltinDiagnosticsByID),
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     std::end(BuiltinDiagnosticsByID),
58e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose                     Key, orderByID);
59e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  assert(Result && "diagnostic not found; table may be out of date");
60e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose  return *Result;
61e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose}
62e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
63e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
64e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#define GET_DIAG_ARRAYS
65e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticGroups.inc"
66e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#undef GET_DIAG_ARRAYS
67e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
68e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose// Second the table of options, sorted by name for fast binary lookup.
69e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosestatic const GroupRecord OptionTable[] = {
70e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#define GET_DIAG_TABLE
71e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#include "clang/Basic/DiagnosticGroups.inc"
72e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose#undef GET_DIAG_TABLE
73e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose};
74e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose
75354f20a8720732aa1745d1ff9595382cee324ee2Craig Topperllvm::StringRef GroupRecord::getName() const {
76354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper  return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]);
77354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper}
78354f20a8720732aa1745d1ff9595382cee324ee2Craig Topper
79b1aa16a18563ebb6824fbe7267420942c802a8caCraig TopperGroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const {
80b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper  return DiagSubGroups + SubGroups;
81b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper}
82b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper
83b1aa16a18563ebb6824fbe7267420942c802a8caCraig TopperGroupRecord::subgroup_iterator GroupRecord::subgroup_end() const {
84ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return nullptr;
85b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper}
86b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper
87b1aa16a18563ebb6824fbe7267420942c802a8caCraig TopperGroupRecord::diagnostics_iterator GroupRecord::diagnostics_begin() const {
88b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper  return DiagArrays + Members;
89b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper}
90b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper
91b1aa16a18563ebb6824fbe7267420942c802a8caCraig TopperGroupRecord::diagnostics_iterator GroupRecord::diagnostics_end() const {
92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return nullptr;
93b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper}
94b1aa16a18563ebb6824fbe7267420942c802a8caCraig Topper
95e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosellvm::ArrayRef<GroupRecord> diagtool::getDiagnosticGroups() {
9619bf662a7c5df007f2809ad3b6eb0a3985003e73Jordan Rose  return llvm::makeArrayRef(OptionTable);
97e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose}
98