hintonda updated this revision to Diff 106094. hintonda added a comment. - Only maintain enum names in debug builds. Current cost of maintaining enum names is 176k.
https://reviews.llvm.org/D35175 Files: include/clang/Basic/DiagnosticIDs.h include/clang/Basic/DiagnosticOptions.def include/clang/Driver/CC1Options.td lib/Basic/DiagnosticIDs.cpp lib/Frontend/CompilerInvocation.cpp lib/Frontend/TextDiagnosticPrinter.cpp test/Frontend/diagnostics-option-diag-ids.cpp
Index: test/Frontend/diagnostics-option-diag-ids.cpp =================================================================== --- /dev/null +++ test/Frontend/diagnostics-option-diag-ids.cpp @@ -0,0 +1,15 @@ +// RUN: not %clang_cc1 -fdiagnostics-show-option -fdiagnostics-show-diag-ids %s 2> %t +// RUN: FileCheck < %t %s + +class xx { + xx(){} +}; + +void foo(sss) { +// CHECK: [[@LINE-1]]:10: error: unknown type name 'sss' [err_unknown_typename:{{[0-9]+}}] + int; +// CHECK: [[@LINE-1]]:3: warning: declaration does not declare anything [-Wmissing-declarations,ext_no_declarators:{{[0-9]+}}] + xx x; +// CHECK: [[@LINE-1]]:6: error: calling a private constructor of class 'xx' [err_access_ctor:{{[0-9]+}}] +// CHECK: [[@LINE-9]]:3: note: implicitly declared private here [note_access_natural:{{[0-9]+}}] +} Index: lib/Frontend/TextDiagnosticPrinter.cpp =================================================================== --- lib/Frontend/TextDiagnosticPrinter.cpp +++ lib/Frontend/TextDiagnosticPrinter.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Signals.h" #include <algorithm> using namespace clang; @@ -103,6 +104,12 @@ } } } + // If the user wants to see diagnostic ids, include it too. + if (DiagOpts.ShowDiagIDs) { + OS << (Started ? "," : " ["); + Started = true; + OS << DiagnosticIDs::getNameFromID(Info.getID()) << ":" << Info.getID(); + } if (Started) OS << ']'; } Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1079,6 +1079,8 @@ << ShowCategory; } + Opts.ShowDiagIDs = Args.hasArg(OPT_fdiagnostics_show_diag_ids); + StringRef Format = Args.getLastArgValue(OPT_fdiagnostics_format, "clang"); if (Format == "clang") Index: lib/Basic/DiagnosticIDs.cpp =================================================================== --- lib/Basic/DiagnosticIDs.cpp +++ lib/Basic/DiagnosticIDs.cpp @@ -228,7 +228,31 @@ return CategoryNameTable[CategoryID].getName(); } +StringRef DiagnosticIDs::getNameFromID(unsigned DiagID) { +#ifndef NDEBUG + static const char *StaticDiagName[] = { + #define DIAG(ENUM, CLASS, DEFAULT_SEVERITY, DESC, GROUP, SFINAE, NOWERROR, \ + SHOWINSYSHEADER, CATEGORY) \ + #ENUM, +#include "clang/Basic/DiagnosticCommonKinds.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 + }; + if (const StaticDiagInfoRec *Info = GetDiagInfo(DiagID)) + return StringRef(StaticDiagName[Info - StaticDiagInfo]); +#endif + + return StringRef(); +} DiagnosticIDs::SFINAEResponse DiagnosticIDs::getDiagnosticSFINAEResponse(unsigned DiagID) { Index: include/clang/Driver/CC1Options.td =================================================================== --- include/clang/Driver/CC1Options.td +++ include/clang/Driver/CC1Options.td @@ -380,6 +380,8 @@ HelpText<"Ignore unexpected diagnostic messages">; def Wno_rewrite_macros : Flag<["-"], "Wno-rewrite-macros">, HelpText<"Silence ObjC rewriting warnings">; +def fdiagnostics_show_diag_ids : Flag<["-"], "fdiagnostics-show-diag-ids">, + HelpText<"Show Diagnostic enum name and index">; //===----------------------------------------------------------------------===// // Frontend Options Index: include/clang/Basic/DiagnosticOptions.def =================================================================== --- include/clang/Basic/DiagnosticOptions.def +++ include/clang/Basic/DiagnosticOptions.def @@ -61,6 +61,7 @@ DIAGOPT(ShowNoteIncludeStack, 1, 0) /// Show include stacks for notes. VALUE_DIAGOPT(ShowCategories, 2, 0) /// Show categories: 0 -> none, 1 -> Number, /// 2 -> Full Name. +DIAGOPT(ShowDiagIDs, 1, 0) /// Show Diagnostic ID ENUM_DIAGOPT(Format, TextDiagnosticFormat, 2, Clang) /// Format for diagnostics: Index: include/clang/Basic/DiagnosticIDs.h =================================================================== --- include/clang/Basic/DiagnosticIDs.h +++ include/clang/Basic/DiagnosticIDs.h @@ -223,6 +223,9 @@ /// \brief Given a category ID, return the name of the category. static StringRef getCategoryNameFromID(unsigned CategoryID); + /// \brief Given a DiagID, return the name. + static StringRef getNameFromID(unsigned DiagID); + /// \brief Return true if a given diagnostic falls into an ARC diagnostic /// category. static bool isARCDiagnostic(unsigned DiagID);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits