mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-13 05:40:59 +00:00
![Gabor Horvath](/assets/img/avatar_default.png)
This patch introduces a class that can help to build tools that require cross translation unit facilities. This class allows function definitions to be loaded from external AST files based on an index. In order to use this functionality an index is required. The index format is a flat text file but it might be replaced with a different solution in the near future. USRs are used as names to look up the functions definitions. This class also does caching to avoid redundant loading of AST files. Right now only function defnitions can be loaded using this API because this is what the in progress cross translation unit feature of the Static Analyzer requires. In to future this might be extended to classes, types etc. Differential Revision: https://reviews.llvm.org/D34512 llvm-svn: 313975
109 lines
3.5 KiB
C++
109 lines
3.5 KiB
C++
//===- DiagnosticNames.cpp - Defines a table of all builtin diagnostics ----==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "DiagnosticNames.h"
|
|
#include "clang/Basic/AllDiagnostics.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
|
|
using namespace clang;
|
|
using namespace diagtool;
|
|
|
|
static const DiagnosticRecord BuiltinDiagnosticsByName[] = {
|
|
#define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
|
|
#include "clang/Basic/DiagnosticIndexName.inc"
|
|
#undef DIAG_NAME_INDEX
|
|
};
|
|
|
|
llvm::ArrayRef<DiagnosticRecord> diagtool::getBuiltinDiagnosticsByName() {
|
|
return llvm::makeArrayRef(BuiltinDiagnosticsByName);
|
|
}
|
|
|
|
|
|
// FIXME: Is it worth having two tables, especially when this one can get
|
|
// out of sync easily?
|
|
static const DiagnosticRecord BuiltinDiagnosticsByID[] = {
|
|
#define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC,GROUP, \
|
|
SFINAE,NOWERROR,SHOWINSYSHEADER,CATEGORY) \
|
|
{ #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) },
|
|
#include "clang/Basic/DiagnosticCommonKinds.inc"
|
|
#include "clang/Basic/DiagnosticCrossTUKinds.inc"
|
|
#include "clang/Basic/DiagnosticDriverKinds.inc"
|
|
#include "clang/Basic/DiagnosticFrontendKinds.inc"
|
|
#include "clang/Basic/DiagnosticSerializationKinds.inc"
|
|
#include "clang/Basic/DiagnosticLexKinds.inc"
|
|
#include "clang/Basic/DiagnosticParseKinds.inc"
|
|
#include "clang/Basic/DiagnosticASTKinds.inc"
|
|
#include "clang/Basic/DiagnosticCommentKinds.inc"
|
|
#include "clang/Basic/DiagnosticSemaKinds.inc"
|
|
#include "clang/Basic/DiagnosticAnalysisKinds.inc"
|
|
#undef DIAG
|
|
};
|
|
|
|
static bool orderByID(const DiagnosticRecord &Left,
|
|
const DiagnosticRecord &Right) {
|
|
return Left.DiagID < Right.DiagID;
|
|
}
|
|
|
|
const DiagnosticRecord &diagtool::getDiagnosticForID(short DiagID) {
|
|
DiagnosticRecord Key = {nullptr, DiagID, 0};
|
|
|
|
const DiagnosticRecord *Result =
|
|
std::lower_bound(std::begin(BuiltinDiagnosticsByID),
|
|
std::end(BuiltinDiagnosticsByID),
|
|
Key, orderByID);
|
|
assert(Result && "diagnostic not found; table may be out of date");
|
|
return *Result;
|
|
}
|
|
|
|
|
|
#define GET_DIAG_ARRAYS
|
|
#include "clang/Basic/DiagnosticGroups.inc"
|
|
#undef GET_DIAG_ARRAYS
|
|
|
|
// Second the table of options, sorted by name for fast binary lookup.
|
|
static const GroupRecord OptionTable[] = {
|
|
#define GET_DIAG_TABLE
|
|
#include "clang/Basic/DiagnosticGroups.inc"
|
|
#undef GET_DIAG_TABLE
|
|
};
|
|
|
|
llvm::StringRef GroupRecord::getName() const {
|
|
return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]);
|
|
}
|
|
|
|
GroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const {
|
|
return DiagSubGroups + SubGroups;
|
|
}
|
|
|
|
GroupRecord::subgroup_iterator GroupRecord::subgroup_end() const {
|
|
return nullptr;
|
|
}
|
|
|
|
llvm::iterator_range<diagtool::GroupRecord::subgroup_iterator>
|
|
GroupRecord::subgroups() const {
|
|
return llvm::make_range(subgroup_begin(), subgroup_end());
|
|
}
|
|
|
|
GroupRecord::diagnostics_iterator GroupRecord::diagnostics_begin() const {
|
|
return DiagArrays + Members;
|
|
}
|
|
|
|
GroupRecord::diagnostics_iterator GroupRecord::diagnostics_end() const {
|
|
return nullptr;
|
|
}
|
|
|
|
llvm::iterator_range<diagtool::GroupRecord::diagnostics_iterator>
|
|
GroupRecord::diagnostics() const {
|
|
return llvm::make_range(diagnostics_begin(), diagnostics_end());
|
|
}
|
|
|
|
llvm::ArrayRef<GroupRecord> diagtool::getDiagnosticGroups() {
|
|
return llvm::makeArrayRef(OptionTable);
|
|
}
|