diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-06-04 16:57:50 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-06-04 16:57:50 +0000 |
commit | 0832f82f763185767d63ae4bf05021c5630c155f (patch) | |
tree | 20e3970cb2e7d660bb11d886c7ec201d8c4a542a /tools/diagtool | |
parent | 837386287f1527c3a1e7ac2ea330c714519ae33a (diff) | |
download | clang-0832f82f763185767d63ae4bf05021c5630c155f.tar.gz clang-0832f82f763185767d63ae4bf05021c5630c155f.tar.bz2 clang-0832f82f763185767d63ae4bf05021c5630c155f.tar.xz |
[diagtool] Re-add show-enabled, minimizing the code pulled in from Frontend.
Now correctly builds with both GNU make and CMake.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157932 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/diagtool')
-rw-r--r-- | tools/diagtool/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tools/diagtool/DiagnosticNames.cpp | 25 | ||||
-rw-r--r-- | tools/diagtool/DiagnosticNames.h | 28 | ||||
-rw-r--r-- | tools/diagtool/ListWarnings.cpp | 27 | ||||
-rw-r--r-- | tools/diagtool/Makefile | 8 | ||||
-rw-r--r-- | tools/diagtool/ShowEnabledWarnings.cpp | 147 |
6 files changed, 211 insertions, 27 deletions
diff --git a/tools/diagtool/CMakeLists.txt b/tools/diagtool/CMakeLists.txt index f1fd9de03b..c8c8bf7a8e 100644 --- a/tools/diagtool/CMakeLists.txt +++ b/tools/diagtool/CMakeLists.txt @@ -6,12 +6,15 @@ set( LLVM_USED_LIBS clangBasic clangLex clangSema + clangFrontend ) add_clang_executable(diagtool diagtool_main.cpp DiagTool.cpp + DiagnosticNames.cpp ListWarnings.cpp + ShowEnabledWarnings.cpp ) if(UNIX) diff --git a/tools/diagtool/DiagnosticNames.cpp b/tools/diagtool/DiagnosticNames.cpp new file mode 100644 index 0000000000..dd86c287ac --- /dev/null +++ b/tools/diagtool/DiagnosticNames.cpp @@ -0,0 +1,25 @@ +//===- 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" + +using namespace clang; + +const diagtool::DiagnosticRecord diagtool::BuiltinDiagnostics[] = { +#define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) }, +#include "clang/Basic/DiagnosticIndexName.inc" +#undef DIAG_NAME_INDEX + { 0, 0, 0 } +}; + +const size_t diagtool::BuiltinDiagnosticsCount = + sizeof(diagtool::BuiltinDiagnostics) / + sizeof(diagtool::BuiltinDiagnostics[0]) - 1; + diff --git a/tools/diagtool/DiagnosticNames.h b/tools/diagtool/DiagnosticNames.h new file mode 100644 index 0000000000..ac1934aac1 --- /dev/null +++ b/tools/diagtool/DiagnosticNames.h @@ -0,0 +1,28 @@ +//===- DiagnosticNames.h - 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 "llvm/ADT/StringRef.h" +#include "llvm/Support/DataTypes.h" + +namespace diagtool { + struct DiagnosticRecord { + const char *NameStr; + unsigned short DiagID; + uint8_t NameLen; + + llvm::StringRef getName() const { + return llvm::StringRef(NameStr, NameLen); + } + }; + + extern const DiagnosticRecord BuiltinDiagnostics[]; + extern const size_t BuiltinDiagnosticsCount; + +} // end namespace diagtool + diff --git a/tools/diagtool/ListWarnings.cpp b/tools/diagtool/ListWarnings.cpp index 2bbeca8024..6c59338eef 100644 --- a/tools/diagtool/ListWarnings.cpp +++ b/tools/diagtool/ListWarnings.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "DiagTool.h" +#include "DiagnosticNames.h" #include "clang/Basic/Diagnostic.h" #include "llvm/Support/Format.h" #include "llvm/ADT/StringMap.h" @@ -26,28 +27,6 @@ DEF_DIAGTOOL("list-warnings", using namespace clang; namespace { -struct StaticDiagNameIndexRec { - const char *NameStr; - unsigned short DiagID; - uint8_t NameLen; - - StringRef getName() const { - return StringRef(NameStr, NameLen); - } -}; -} - -static const StaticDiagNameIndexRec StaticDiagNameIndex[] = { -#define DIAG_NAME_INDEX(ENUM) { #ENUM, diag::ENUM, STR_SIZE(#ENUM, uint8_t) }, -#include "clang/Basic/DiagnosticIndexName.inc" -#undef DIAG_NAME_INDEX - { 0, 0, 0 } -}; - -static const unsigned StaticDiagNameIndexSize = - sizeof(StaticDiagNameIndex)/sizeof(StaticDiagNameIndex[0])-1; - -namespace { struct Entry { llvm::StringRef DiagName; llvm::StringRef Flag; @@ -73,8 +52,8 @@ int ListWarnings::run(unsigned int argc, char **argv, llvm::raw_ostream &out) { std::vector<Entry> Flagged, Unflagged; llvm::StringMap<std::vector<unsigned> > flagHistogram; - for (const StaticDiagNameIndexRec *di = StaticDiagNameIndex, *de = StaticDiagNameIndex + StaticDiagNameIndexSize; - di != de; ++di) { + for (const diagtool::DiagnosticRecord *di = diagtool::BuiltinDiagnostics, + *de = di + diagtool::BuiltinDiagnosticsCount; di != de; ++di) { unsigned diagID = di->DiagID; diff --git a/tools/diagtool/Makefile b/tools/diagtool/Makefile index 6e3bcfc292..3c1d9f643f 100644 --- a/tools/diagtool/Makefile +++ b/tools/diagtool/Makefile @@ -1,4 +1,4 @@ -##===- tools/driver/Makefile -------------------------------*- Makefile -*-===## +##===- tools/diagtool/Makefile -----------------------------*- Makefile -*-===## # # The LLVM Compiler Infrastructure # @@ -16,9 +16,11 @@ TOOL_NO_EXPORTS := 1 # Don't install this. NO_INSTALL = 1 -LINK_COMPONENTS := support +LINK_COMPONENTS := support mc -USEDLIBS = clangBasic.a +USEDLIBS = clangAnalysis.a clangAST.a clangBasic.a clangDriver.a clangEdit.a \ + clangFrontend.a clangLex.a clangParse.a clangSema.a \ + clangSerialization.a include $(CLANG_LEVEL)/Makefile diff --git a/tools/diagtool/ShowEnabledWarnings.cpp b/tools/diagtool/ShowEnabledWarnings.cpp new file mode 100644 index 0000000000..2bc5124e61 --- /dev/null +++ b/tools/diagtool/ShowEnabledWarnings.cpp @@ -0,0 +1,147 @@ +//===- ShowEnabledWarnings - diagtool tool for printing enabled flags -----===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "DiagTool.h" +#include "DiagnosticNames.h" +#include "clang/Basic/LLVM.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Frontend/TextDiagnosticBuffer.h" +#include "clang/Frontend/TextDiagnosticPrinter.h" +#include "clang/Frontend/Utils.h" +#include "llvm/Support/TargetSelect.h" + +DEF_DIAGTOOL("show-enabled", + "Show which warnings are enabled for a given command line", + ShowEnabledWarnings) + +using namespace clang; + +namespace { + struct PrettyDiag { + StringRef Name; + StringRef Flag; + DiagnosticsEngine::Level Level; + + PrettyDiag(StringRef name, StringRef flag, DiagnosticsEngine::Level level) + : Name(name), Flag(flag), Level(level) {} + + bool operator<(const PrettyDiag &x) const { return Name < x.Name; } + }; +} + +static void printUsage() { + llvm::errs() << "Usage: diagtool show-enabled [<flags>] <single-input.c>\n"; +} + +static char getCharForLevel(DiagnosticsEngine::Level Level) { + switch (Level) { + case DiagnosticsEngine::Ignored: return ' '; + case DiagnosticsEngine::Note: return '-'; + case DiagnosticsEngine::Warning: return 'W'; + case DiagnosticsEngine::Error: return 'E'; + case DiagnosticsEngine::Fatal: return 'F'; + } + + llvm_unreachable("Unknown diagnostic level"); +} + +static IntrusiveRefCntPtr<DiagnosticsEngine> +createDiagnostics(unsigned int argc, char **argv) { + IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs()); + + // Buffer diagnostics from argument parsing so that we can output them using a + // well formed diagnostic object. + TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer; + IntrusiveRefCntPtr<DiagnosticsEngine> InterimDiags( + new DiagnosticsEngine(DiagIDs, DiagsBuffer)); + + // Try to build a CompilerInvocation. + OwningPtr<CompilerInvocation> Invocation( + createInvocationFromCommandLine(ArrayRef<const char *>(argv, argc), + InterimDiags)); + if (!Invocation) + return NULL; + + // Build the diagnostics parser + IntrusiveRefCntPtr<DiagnosticsEngine> FinalDiags = + CompilerInstance::createDiagnostics(Invocation->getDiagnosticOpts(), + argc, argv); + if (!FinalDiags) + return NULL; + + // Flush any errors created when initializing everything. This could happen + // for invalid command lines, which will probably give non-sensical results. + DiagsBuffer->FlushDiagnostics(*FinalDiags); + + return FinalDiags; +} + +int ShowEnabledWarnings::run(unsigned int argc, char **argv, raw_ostream &Out) { + // First check our one flag (--levels). + bool ShouldShowLevels = true; + if (argc > 0) { + StringRef FirstArg(*argv); + if (FirstArg.equals("--no-levels")) { + ShouldShowLevels = false; + --argc; + ++argv; + } else if (FirstArg.equals("--levels")) { + ShouldShowLevels = true; + --argc; + ++argv; + } + } + + // Create the diagnostic engine. + IntrusiveRefCntPtr<DiagnosticsEngine> Diags = createDiagnostics(argc, argv); + if (!Diags) { + printUsage(); + return EXIT_FAILURE; + } + + // Now we have our diagnostics. Iterate through EVERY diagnostic and see + // which ones are turned on. + // FIXME: It would be very nice to print which flags are turning on which + // diagnostics, but this can be done with a diff. + std::vector<PrettyDiag> Active; + + for (const diagtool::DiagnosticRecord *I = diagtool::BuiltinDiagnostics, + *E = I + diagtool::BuiltinDiagnosticsCount; I != E; ++I) { + unsigned DiagID = I->DiagID; + + if (DiagnosticIDs::isBuiltinNote(DiagID)) + continue; + + if (!DiagnosticIDs::isBuiltinWarningOrExtension(DiagID)) + continue; + + DiagnosticsEngine::Level DiagLevel = + Diags->getDiagnosticLevel(DiagID, SourceLocation()); + if (DiagLevel == DiagnosticsEngine::Ignored) + continue; + + StringRef WarningOpt = DiagnosticIDs::getWarningOptionForDiag(DiagID); + Active.push_back(PrettyDiag(I->getName(), WarningOpt, DiagLevel)); + } + + std::sort(Active.begin(), Active.end()); + + // Print them all out. + for (std::vector<PrettyDiag>::const_iterator I = Active.begin(), + E = Active.end(); I != E; ++I) { + if (ShouldShowLevels) + Out << getCharForLevel(I->Level) << " "; + Out << I->Name; + if (!I->Flag.empty()) + Out << " [-W" << I->Flag << "]"; + Out << '\n'; + } + + return EXIT_SUCCESS; +} |