зеркало из https://github.com/microsoft/clang-1.git
[diagtool] Pull show-enabled back out for now.
Need to figure out how to get Frontend's warning parsing without bringing in all of Frontend. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157847 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b705489e8e
Коммит
0a5ca3588d
|
@ -1,27 +0,0 @@
|
|||
// RUN: diagtool show-enabled 2>&1 | FileCheck %s
|
||||
//
|
||||
// This shows warnings which are on by default.
|
||||
// We just check a few to make sure it's doing something sensible.
|
||||
//
|
||||
// CHECK: warn_condition_is_assignment
|
||||
// CHECK: warn_null_arg
|
||||
// CHECK: warn_unterminated_string
|
||||
|
||||
|
||||
// RUN: diagtool show-enabled -Wno-everything 2>&1 | count 0
|
||||
|
||||
|
||||
// RUN: diagtool show-enabled -Wno-everything -Wobjc-root-class 2>&1 | FileCheck -check-prefix CHECK-WARN %s
|
||||
// RUN: diagtool show-enabled -Wno-everything -Werror=objc-root-class 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
|
||||
// RUN: diagtool show-enabled -Wno-everything -Wfatal-errors=objc-root-class 2>&1 | FileCheck -check-prefix CHECK-FATAL %s
|
||||
//
|
||||
// CHECK-WARN: W warn_objc_root_class_missing [-Wobjc-root-class]
|
||||
// CHECK-ERROR: E warn_objc_root_class_missing [-Wobjc-root-class]
|
||||
// CHECK-FATAL: F warn_objc_root_class_missing [-Wobjc-root-class]
|
||||
|
||||
// RUN: diagtool show-enabled --no-flags -Wno-everything -Wobjc-root-class 2>&1 | FileCheck -check-prefix CHECK-NO-FLAGS %s
|
||||
//
|
||||
// CHECK-NO-FLAGS-NOT: W
|
||||
// CHECK-NO-FLAGS-NOT: E
|
||||
// CHECK-NO-FLAGS-NOT: F
|
||||
// CHECK-NO-FLAGS: warn_objc_root_class_missing [-Wobjc-root-class]
|
|
@ -1,21 +1,17 @@
|
|||
set( LLVM_LINK_COMPONENTS
|
||||
support
|
||||
${LLVM_TARGETS_TO_BUILD}
|
||||
)
|
||||
|
||||
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)
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
//===- 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;
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
//===- 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
|
||||
|
|
@ -13,7 +13,6 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "DiagTool.h"
|
||||
#include "DiagnosticNames.h"
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
|
@ -26,6 +25,28 @@ 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;
|
||||
|
@ -52,8 +73,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 diagtool::DiagnosticRecord *di = diagtool::BuiltinDiagnostics,
|
||||
*de = di + diagtool::BuiltinDiagnosticsCount; di != de; ++di) {
|
||||
for (const StaticDiagNameIndexRec *di = StaticDiagNameIndex, *de = StaticDiagNameIndex + StaticDiagNameIndexSize;
|
||||
di != de; ++di) {
|
||||
|
||||
unsigned diagID = di->DiagID;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
##===- tools/diagtool/Makefile -----------------------------*- Makefile -*-===##
|
||||
##===- tools/driver/Makefile -------------------------------*- Makefile -*-===##
|
||||
#
|
||||
# The LLVM Compiler Infrastructure
|
||||
#
|
||||
|
@ -16,16 +16,9 @@ TOOL_NO_EXPORTS := 1
|
|||
# Don't install this.
|
||||
NO_INSTALL = 1
|
||||
|
||||
# Include this here so we can get the configuration of the targets that have
|
||||
# been configured for construction. We have to do this early so we can set up
|
||||
# LINK_COMPONENTS before including Makefile.rules
|
||||
include $(CLANG_LEVEL)/../../Makefile.config
|
||||
LINK_COMPONENTS := support
|
||||
|
||||
LINK_COMPONENTS := support $(TARGETS_TO_BUILD)
|
||||
|
||||
# FIXME: diagtool should be much lighter than this.
|
||||
USEDLIBS = clangAST.a clangBasic.a clangDriver.a clangEdit.a clangFrontend.a \
|
||||
clangLex.a clangParse.a clangSema.a clangSerialization.a
|
||||
USEDLIBS = clangBasic.a
|
||||
|
||||
include $(CLANG_LEVEL)/Makefile
|
||||
|
||||
|
|
|
@ -1,148 +0,0 @@
|
|||
//===- 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 "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 char getFlagForLevel(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 CompilerInstance *createCompiler(unsigned int argc, char **argv) {
|
||||
// First, build a compiler instance!
|
||||
OwningPtr<CompilerInstance> Clang(new CompilerInstance());
|
||||
IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs());
|
||||
|
||||
// Initialize targets first. This may be necessary if any warnings are
|
||||
// selectively enabled.
|
||||
llvm::InitializeAllTargets();
|
||||
llvm::InitializeAllTargetMCs();
|
||||
llvm::InitializeAllAsmPrinters();
|
||||
llvm::InitializeAllAsmParsers();
|
||||
|
||||
// Buffer diagnostics from argument parsing so that we can output them using a
|
||||
// well formed diagnostic object.
|
||||
TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer;
|
||||
DiagnosticsEngine Diags(DiagIDs, DiagsBuffer);
|
||||
|
||||
bool Success;
|
||||
Success = CompilerInvocation::CreateFromArgs(Clang->getInvocation(),
|
||||
argv, argv+argc, Diags);
|
||||
|
||||
// We are skipping cc1's usual search for a resource directory.
|
||||
// This is not likely to affect warning output.
|
||||
|
||||
// Create the actual diagnostics engine.
|
||||
Clang->createDiagnostics(argc, argv);
|
||||
if (!Clang->hasDiagnostics())
|
||||
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(Clang->getDiagnostics());
|
||||
if (!Success)
|
||||
return NULL;
|
||||
|
||||
return Clang.take();
|
||||
}
|
||||
|
||||
int ShowEnabledWarnings::run(unsigned int argc, char **argv, raw_ostream &Out) {
|
||||
// First check our one flag (--flags).
|
||||
bool ShouldShowFlags = true;
|
||||
if (argc > 0) {
|
||||
StringRef FirstArg(*argv);
|
||||
if (FirstArg.equals("--no-flags")) {
|
||||
ShouldShowFlags = false;
|
||||
--argc;
|
||||
++argv;
|
||||
} else if (FirstArg.equals("--flags")) {
|
||||
ShouldShowFlags = true;
|
||||
--argc;
|
||||
++argv;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the compiler instance.
|
||||
OwningPtr<CompilerInstance> Clang(createCompiler(argc, argv));
|
||||
if (!Clang)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
DiagnosticsEngine &Diags = Clang->getDiagnostics();
|
||||
|
||||
// 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 (ShouldShowFlags)
|
||||
Out << getFlagForLevel(I->Level) << " ";
|
||||
Out << I->Name;
|
||||
if (!I->Flag.empty())
|
||||
Out << " [-W" << I->Flag << "]";
|
||||
Out << '\n';
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Загрузка…
Ссылка в новой задаче