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 13using namespace clang; 14using namespace diagtool; 15 16static 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 22llvm::ArrayRef<DiagnosticRecord> diagtool::getBuiltinDiagnosticsByName() { 23 return llvm::makeArrayRef(BuiltinDiagnosticsByName); 24} 25 26 27// FIXME: Is it worth having two tables, especially when this one can get 28// out of sync easily? 29static const DiagnosticRecord BuiltinDiagnosticsByID[] = { 30#define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC,GROUP, \ 31 SFINAE,NOWERROR,SHOWINSYSHEADER,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#undef DIAG 46}; 47 48static bool orderByID(const DiagnosticRecord &Left, 49 const DiagnosticRecord &Right) { 50 return Left.DiagID < Right.DiagID; 51} 52 53const DiagnosticRecord &diagtool::getDiagnosticForID(short DiagID) { 54 DiagnosticRecord Key = {nullptr, DiagID, 0}; 55 56 const DiagnosticRecord *Result = 57 llvm::lower_bound(BuiltinDiagnosticsByID, Key, orderByID); 58 assert(Result && "diagnostic not found; table may be out of date"); 59 return *Result; 60} 61 62 63#define GET_DIAG_ARRAYS 64#include "clang/Basic/DiagnosticGroups.inc" 65#undef GET_DIAG_ARRAYS 66 67// Second the table of options, sorted by name for fast binary lookup. 68static const GroupRecord OptionTable[] = { 69#define GET_DIAG_TABLE 70#include "clang/Basic/DiagnosticGroups.inc" 71#undef GET_DIAG_TABLE 72}; 73 74llvm::StringRef GroupRecord::getName() const { 75 return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]); 76} 77 78GroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const { 79 return DiagSubGroups + SubGroups; 80} 81 82GroupRecord::subgroup_iterator GroupRecord::subgroup_end() const { 83 return nullptr; 84} 85 86llvm::iterator_range<diagtool::GroupRecord::subgroup_iterator> 87GroupRecord::subgroups() const { 88 return llvm::make_range(subgroup_begin(), subgroup_end()); 89} 90 91GroupRecord::diagnostics_iterator GroupRecord::diagnostics_begin() const { 92 return DiagArrays + Members; 93} 94 95GroupRecord::diagnostics_iterator GroupRecord::diagnostics_end() const { 96 return nullptr; 97} 98 99llvm::iterator_range<diagtool::GroupRecord::diagnostics_iterator> 100GroupRecord::diagnostics() const { 101 return llvm::make_range(diagnostics_begin(), diagnostics_end()); 102} 103 104llvm::ArrayRef<GroupRecord> diagtool::getDiagnosticGroups() { 105 return llvm::makeArrayRef(OptionTable); 106} 107