use tablgen-generated warning groups.

llvm-svn: 69221
This commit is contained in:
Chris Lattner 2009-04-15 20:58:49 +00:00
parent ddf228dc47
commit 680eb1b893
1 changed files with 13 additions and 49 deletions

View File

@ -43,54 +43,20 @@ static llvm::cl::opt<bool> OptPedantic("pedantic");
static llvm::cl::opt<bool> OptPedanticErrors("pedantic-errors");
static llvm::cl::opt<bool> OptNoWarnings("w");
namespace {
struct WarningOption {
const char *Name;
const diag::kind *Members;
unsigned NumMembers;
};
}
#define DIAGS(a) a, unsigned(sizeof(a) / sizeof(a[0]))
// These tables will be TableGenerated later.
// First the table sets describing the diagnostics controlled by each option.
static const diag::kind UnusedMacrosDiags[] = { diag::pp_macro_not_used };
static const diag::kind FloatEqualDiags[] = { diag::warn_floatingpoint_eq };
static const diag::kind ExtraTokens[] = { diag::ext_pp_extra_tokens_at_eol };
static const diag::kind ReadOnlySetterAttrsDiags[] = {
diag::warn_objc_property_attr_mutually_exclusive
};
static const diag::kind FormatNonLiteralDiags[] = {
diag::warn_printf_not_string_constant
};
static const diag::kind UndefDiags[] = { diag::warn_pp_undef_identifier };
static const diag::kind ImplicitFunctionDeclarationDiags[] = {
diag::ext_implicit_function_decl, diag::warn_implicit_function_decl
};
static const diag::kind PointerSignDiags[] = {
diag::ext_typecheck_convert_incompatible_pointer_sign
};
static const diag::kind DeprecatedDeclarations[] = { diag::warn_deprecated };
static const diag::kind MissingPrototypesDiags[] = {
diag::warn_missing_prototype
};
static const diag::kind TrigraphsDiags[] = {
diag::trigraph_ignored, diag::trigraph_ignored_block_comment,
diag::trigraph_ends_block_comment, diag::trigraph_converted
struct WarningOption {
const char *Name;
const short *Members;
};
// Second the table of options. MUST be sorted by name! Binary lookup is done.
#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 WarningOption OptionTable[] = {
{ "deprecated-declarations", DIAGS(DeprecatedDeclarations) },
{ "extra-tokens", DIAGS(ExtraTokens) },
{ "float-equal", DIAGS(FloatEqualDiags) },
{ "format-nonliteral", DIAGS(FormatNonLiteralDiags) },
{ "implicit-function-declaration", DIAGS(ImplicitFunctionDeclarationDiags) },
{ "missing-prototypes", DIAGS(MissingPrototypesDiags) },
{ "pointer-sign", DIAGS(PointerSignDiags) },
{ "readonly-setter-attrs", DIAGS(ReadOnlySetterAttrsDiags) },
{ "trigraphs", DIAGS(TrigraphsDiags) },
{ "undef", DIAGS(UndefDiags) },
{ "unused-macros", DIAGS(UnusedMacrosDiags) },
#define GET_DIAG_TABLE
#include "clang/Basic/DiagnosticGroups.inc"
#undef GET_DIAG_TABLE
};
static const size_t OptionTableSize =
sizeof(OptionTable) / sizeof(OptionTable[0]);
@ -158,7 +124,7 @@ bool clang::ProcessWarningOptions(Diagnostic &Diags) {
OptStart = Specifier;
}
WarningOption Key = { OptStart, 0, 0 };
WarningOption Key = { OptStart, 0 };
const WarningOption *Found =
std::lower_bound(OptionTable, OptionTable + OptionTableSize, Key,
WarningOptionCompare);
@ -169,10 +135,8 @@ bool clang::ProcessWarningOptions(Diagnostic &Diags) {
}
// Option exists, poke all the members of its diagnostic set.
for (const diag::kind *Member = Found->Members,
*E = Found->Members+Found->NumMembers; Member != E; ++Member) {
for (const short *Member = Found->Members; *Member != -1; ++Member) {
Diags.setDiagnosticMapping(*Member, Mapping);
assert(*Member < 65536 && "ControlledDiags element too small");
ControlledDiags.push_back(*Member);
}
}