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::makeArrayRef(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, \ 31 SFINAE,NOWERROR,SHOWINSYSHEADER,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 48 static bool orderByID(const DiagnosticRecord &Left, 49 const DiagnosticRecord &Right) { 50 return Left.DiagID < Right.DiagID; 51 } 52 53 const 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. 68 static const GroupRecord OptionTable[] = { 69 #define GET_DIAG_TABLE 70 #include "clang/Basic/DiagnosticGroups.inc" 71 #undef GET_DIAG_TABLE 72 }; 73 74 llvm::StringRef GroupRecord::getName() const { 75 return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]); 76 } 77 78 GroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const { 79 return DiagSubGroups + SubGroups; 80 } 81 82 GroupRecord::subgroup_iterator GroupRecord::subgroup_end() const { 83 return nullptr; 84 } 85 86 llvm::iterator_range<diagtool::GroupRecord::subgroup_iterator> 87 GroupRecord::subgroups() const { 88 return llvm::make_range(subgroup_begin(), subgroup_end()); 89 } 90 91 GroupRecord::diagnostics_iterator GroupRecord::diagnostics_begin() const { 92 return DiagArrays + Members; 93 } 94 95 GroupRecord::diagnostics_iterator GroupRecord::diagnostics_end() const { 96 return nullptr; 97 } 98 99 llvm::iterator_range<diagtool::GroupRecord::diagnostics_iterator> 100 GroupRecord::diagnostics() const { 101 return llvm::make_range(diagnostics_begin(), diagnostics_end()); 102 } 103 104 llvm::ArrayRef<GroupRecord> diagtool::getDiagnosticGroups() { 105 return llvm::makeArrayRef(OptionTable); 106 } 107