From c6fafed04c516a9ab3495e54050169125c116353 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 19 Apr 2009 22:34:23 +0000 Subject: [PATCH] move group twiddling options into Diagnostic.cpp instead of Warnings.cpp. Warnings.cpp now doesn't need to #include tblgen produced output directly. llvm-svn: 69559 --- clang/include/clang/Basic/Diagnostic.h | 5 +++ clang/lib/Basic/Diagnostic.cpp | 58 ++++++++++++++++++++++++++ clang/tools/clang-cc/Warnings.cpp | 50 +--------------------- 3 files changed, 64 insertions(+), 49 deletions(-) diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index 9c0a02ca878c..22e7fb3f85ea 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -252,6 +252,11 @@ public: "Cannot map errors!"); setDiagnosticMappingInternal(Diag, Map, true); } + + /// setDiagnosticGroupMapping - Change an entire diagnostic group (e.g. + /// "unknown-pragmas" to have the specified mapping. This returns true and + /// ignores the request if "Group" was unknown, false otherwise. + bool setDiagnosticGroupMapping(const char *Group, diag::Mapping Map); bool hasErrorOccurred() const { return ErrorOccurred; } bool hasFatalErrorOccurred() const { return FatalErrorOccurred; } diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index bf11a13dc2bb..9986fc5a41bd 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -344,6 +344,64 @@ Diagnostic::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass) const { return Result; } +struct WarningOption { + const char *Name; + const short *Members; + const char *SubGroups; +}; + +#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[] = { +#define GET_DIAG_TABLE +#include "clang/Basic/DiagnosticGroups.inc" +#undef GET_DIAG_TABLE +}; +static const size_t OptionTableSize = +sizeof(OptionTable) / sizeof(OptionTable[0]); + +static bool WarningOptionCompare(const WarningOption &LHS, + const WarningOption &RHS) { + return strcmp(LHS.Name, RHS.Name) < 0; +} + +static void MapGroupMembers(const WarningOption *Group, diag::Mapping Mapping, + Diagnostic &Diags) { + // Option exists, poke all the members of its diagnostic set. + if (const short *Member = Group->Members) { + for (; *Member != -1; ++Member) + Diags.setDiagnosticMapping(*Member, Mapping); + } + + // Enable/disable all subgroups along with this one. + if (const char *SubGroups = Group->SubGroups) { + for (; *SubGroups != (char)-1; ++SubGroups) + MapGroupMembers(&OptionTable[(unsigned char)*SubGroups], Mapping, Diags); + } +} + +/// setDiagnosticGroupMapping - Change an entire diagnostic group (e.g. +/// "unknown-pragmas" to have the specified mapping. This returns true and +/// ignores the request if "Group" was unknown, false otherwise. +bool Diagnostic::setDiagnosticGroupMapping(const char *Group, + diag::Mapping Map) { + + WarningOption Key = { Group, 0, 0 }; + const WarningOption *Found = + std::lower_bound(OptionTable, OptionTable + OptionTableSize, Key, + WarningOptionCompare); + if (Found == OptionTable + OptionTableSize || + strcmp(Found->Name, Group) != 0) + return true; // Option not found. + + MapGroupMembers(Found, Map, *this); + return false; +} + + /// ProcessDiag - This is the method used to report a diagnostic that is /// finally fully formed. void Diagnostic::ProcessDiag() { diff --git a/clang/tools/clang-cc/Warnings.cpp b/clang/tools/clang-cc/Warnings.cpp index 1ae122dc7a36..c3a6b2132a69 100644 --- a/clang/tools/clang-cc/Warnings.cpp +++ b/clang/tools/clang-cc/Warnings.cpp @@ -40,45 +40,6 @@ static llvm::cl::opt OptPedantic("pedantic"); static llvm::cl::opt OptPedanticErrors("pedantic-errors"); static llvm::cl::opt OptNoWarnings("w"); -struct WarningOption { - const char *Name; - const short *Members; - const char *SubGroups; -}; - -#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[] = { -#define GET_DIAG_TABLE -#include "clang/Basic/DiagnosticGroups.inc" -#undef GET_DIAG_TABLE -}; -static const size_t OptionTableSize = - sizeof(OptionTable) / sizeof(OptionTable[0]); - -static bool WarningOptionCompare(const WarningOption &LHS, - const WarningOption &RHS) { - return strcmp(LHS.Name, RHS.Name) < 0; -} - -static void MapGroupMembers(const WarningOption *Group, diag::Mapping Mapping, - Diagnostic &Diags) { - // Option exists, poke all the members of its diagnostic set. - if (const short *Member = Group->Members) { - for (; *Member != -1; ++Member) - Diags.setDiagnosticMapping(*Member, Mapping); - } - - // Enable/disable all subgroups along with this one. - if (const char *SubGroups = Group->SubGroups) { - for (; *SubGroups != (char)-1; ++SubGroups) - MapGroupMembers(&OptionTable[(unsigned char)*SubGroups], Mapping, Diags); - } -} - bool clang::ProcessWarningOptions(Diagnostic &Diags) { Diags.setSuppressSystemWarnings(true); // Default to -Wno-system-headers Diags.setIgnoreAllWarnings(OptNoWarnings); @@ -144,17 +105,8 @@ bool clang::ProcessWarningOptions(Diagnostic &Diags) { OptStart = Specifier; } - WarningOption Key = { OptStart, 0, 0 }; - const WarningOption *Found = - std::lower_bound(OptionTable, OptionTable + OptionTableSize, Key, - WarningOptionCompare); - if (Found == OptionTable + OptionTableSize || - strcmp(Found->Name, OptStart) != 0) { + if (Diags.setDiagnosticGroupMapping(OptStart, Mapping)) fprintf(stderr, "warning: unknown warning option: -W%s\n", Opt.c_str()); - continue; - } - - MapGroupMembers(Found, Mapping, Diags); } return false;