mirror of
https://github.com/intel/llvm.git
synced 2026-02-06 23:31:50 +08:00
Modify behavior of -ast-dump-lookups: if -ast-dump is not also provided, dump
anyway. If -ast-dump *is* also provided, then dump the AST declarations as well as the lookup results. This is invaluable for cross-correlating the lookup information with the declarations actually found. llvm-svn: 215393
This commit is contained in:
@@ -1642,7 +1642,7 @@ public:
|
||||
|
||||
void dumpDeclContext() const;
|
||||
void dumpLookups() const;
|
||||
void dumpLookups(llvm::raw_ostream &OS) const;
|
||||
void dumpLookups(llvm::raw_ostream &OS, bool DumpDecls = false) const;
|
||||
|
||||
private:
|
||||
void reconcileExternalVisibleStorage() const;
|
||||
|
||||
@@ -323,8 +323,6 @@ def ast_dump_filter : Separate<["-"], "ast-dump-filter">,
|
||||
HelpText<"Use with -ast-dump or -ast-print to dump/print only AST declaration"
|
||||
" nodes having a certain substring in a qualified name. Use"
|
||||
" -ast-list to list all filterable declaration node names.">;
|
||||
def ast_dump_lookups : Flag<["-"], "ast-dump-lookups">,
|
||||
HelpText<"Include name lookup table dumps in AST dumps">;
|
||||
def fno_modules_global_index : Flag<["-"], "fno-modules-global-index">,
|
||||
HelpText<"Do not automatically generate or update the global module index">;
|
||||
def fno_modules_error_recovery : Flag<["-"], "fno-modules-error-recovery">,
|
||||
@@ -360,6 +358,8 @@ def ast_list : Flag<["-"], "ast-list">,
|
||||
HelpText<"Build ASTs and print the list of declaration node qualified names">;
|
||||
def ast_dump : Flag<["-"], "ast-dump">,
|
||||
HelpText<"Build ASTs and then debug dump them">;
|
||||
def ast_dump_lookups : Flag<["-"], "ast-dump-lookups">,
|
||||
HelpText<"Build ASTs and then debug dump their name lookup tables">;
|
||||
def ast_view : Flag<["-"], "ast-view">,
|
||||
HelpText<"Build ASTs and view them with GraphViz">;
|
||||
def print_decl_contexts : Flag<["-"], "print-decl-contexts">,
|
||||
|
||||
@@ -38,7 +38,8 @@ std::unique_ptr<ASTConsumer> CreateASTPrinter(raw_ostream *OS,
|
||||
// AST dumper: dumps the raw AST in human-readable form to stderr; this is
|
||||
// intended for debugging.
|
||||
std::unique_ptr<ASTConsumer> CreateASTDumper(StringRef FilterString,
|
||||
bool DumpLookups = false);
|
||||
bool DumpDecls,
|
||||
bool DumpLookups);
|
||||
|
||||
// AST Decl node lister: prints qualified names of all filterable AST Decl
|
||||
// nodes.
|
||||
|
||||
@@ -142,6 +142,8 @@ public:
|
||||
///< global module index if available.
|
||||
unsigned GenerateGlobalModuleIndex : 1; ///< Whether we can generate the
|
||||
///< global module index if needed.
|
||||
unsigned ASTDumpDecls : 1; ///< Whether we include declaration
|
||||
///< dumps in AST dumps.
|
||||
unsigned ASTDumpLookups : 1; ///< Whether we include lookup table
|
||||
///< dumps in AST dumps.
|
||||
|
||||
@@ -246,7 +248,7 @@ public:
|
||||
FixWhatYouCan(false), FixOnlyWarnings(false), FixAndRecompile(false),
|
||||
FixToTemporaries(false), ARCMTMigrateEmitARCErrors(false),
|
||||
SkipFunctionBodies(false), UseGlobalModuleIndex(true),
|
||||
GenerateGlobalModuleIndex(true), ASTDumpLookups(false),
|
||||
GenerateGlobalModuleIndex(true), ASTDumpDecls(false), ASTDumpLookups(false),
|
||||
ARCMTAction(ARCMT_None), ObjCMTAction(ObjCMT_None),
|
||||
ProgramAction(frontend::ParseSyntaxOnly)
|
||||
{}
|
||||
|
||||
@@ -220,7 +220,7 @@ namespace {
|
||||
void dumpName(const NamedDecl *D);
|
||||
bool hasNodes(const DeclContext *DC);
|
||||
void dumpDeclContext(const DeclContext *DC);
|
||||
void dumpLookups(const DeclContext *DC);
|
||||
void dumpLookups(const DeclContext *DC, bool DumpDecls);
|
||||
void dumpAttr(const Attr *A);
|
||||
|
||||
// C++ Utilities
|
||||
@@ -569,7 +569,7 @@ void ASTDumper::dumpDeclContext(const DeclContext *DC) {
|
||||
}
|
||||
}
|
||||
|
||||
void ASTDumper::dumpLookups(const DeclContext *DC) {
|
||||
void ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) {
|
||||
IndentScope Indent(*this);
|
||||
|
||||
OS << "StoredDeclsMap ";
|
||||
@@ -602,9 +602,26 @@ void ASTDumper::dumpLookups(const DeclContext *DC) {
|
||||
RI != RE; ++RI) {
|
||||
if (RI + 1 == RE)
|
||||
lastChild();
|
||||
dumpDeclRef(*RI);
|
||||
|
||||
IndentScope LookupIndent(*this);
|
||||
dumpBareDeclRef(*RI);
|
||||
|
||||
if ((*RI)->isHidden())
|
||||
OS << " hidden";
|
||||
|
||||
// If requested, dump the redecl chain for this lookup.
|
||||
if (DumpDecls) {
|
||||
// Dump earliest decl first.
|
||||
std::function<void(Decl*)> DumpPrev = [&](Decl *D) {
|
||||
if (Decl *Prev = D->getPreviousDecl()) {
|
||||
DumpPrev(Prev);
|
||||
dumpDecl(Prev);
|
||||
}
|
||||
};
|
||||
DumpPrev(*RI);
|
||||
lastChild();
|
||||
dumpDecl(*RI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2169,13 +2186,14 @@ LLVM_DUMP_METHOD void DeclContext::dumpLookups() const {
|
||||
dumpLookups(llvm::errs());
|
||||
}
|
||||
|
||||
LLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS) const {
|
||||
LLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS,
|
||||
bool DumpDecls) const {
|
||||
const DeclContext *DC = this;
|
||||
while (!DC->isTranslationUnit())
|
||||
DC = DC->getParent();
|
||||
ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext();
|
||||
ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &Ctx.getSourceManager());
|
||||
P.dumpLookups(this);
|
||||
P.dumpLookups(this, DumpDecls);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@@ -57,7 +57,8 @@ namespace {
|
||||
bool ShowColors = Out.has_colors();
|
||||
if (ShowColors)
|
||||
Out.changeColor(raw_ostream::BLUE);
|
||||
Out << (Dump ? "Dumping " : "Printing ") << getName(D) << ":\n";
|
||||
Out << ((Dump || DumpLookups) ? "Dumping " : "Printing ") << getName(D)
|
||||
<< ":\n";
|
||||
if (ShowColors)
|
||||
Out.resetColor();
|
||||
print(D);
|
||||
@@ -79,9 +80,13 @@ namespace {
|
||||
}
|
||||
void print(Decl *D) {
|
||||
if (DumpLookups) {
|
||||
if (DeclContext *DC = dyn_cast<DeclContext>(D))
|
||||
DC->dumpLookups(Out);
|
||||
else
|
||||
if (DeclContext *DC = dyn_cast<DeclContext>(D)) {
|
||||
if (DC == DC->getPrimaryContext())
|
||||
DC->dumpLookups(Out, Dump);
|
||||
else
|
||||
Out << "Lookup map is in primary DeclContext "
|
||||
<< DC->getPrimaryContext() << "\n";
|
||||
} else
|
||||
Out << "Not a DeclContext\n";
|
||||
} else if (Dump)
|
||||
D->dump(Out);
|
||||
@@ -124,8 +129,10 @@ std::unique_ptr<ASTConsumer> clang::CreateASTPrinter(raw_ostream *Out,
|
||||
}
|
||||
|
||||
std::unique_ptr<ASTConsumer> clang::CreateASTDumper(StringRef FilterString,
|
||||
bool DumpDecls,
|
||||
bool DumpLookups) {
|
||||
return llvm::make_unique<ASTPrinter>(nullptr, /*Dump=*/true, FilterString,
|
||||
assert((DumpDecls || DumpLookups) && "nothing to dump");
|
||||
return llvm::make_unique<ASTPrinter>(nullptr, DumpDecls, FilterString,
|
||||
DumpLookups);
|
||||
}
|
||||
|
||||
|
||||
@@ -718,6 +718,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
|
||||
case OPT_ast_list:
|
||||
Opts.ProgramAction = frontend::ASTDeclList; break;
|
||||
case OPT_ast_dump:
|
||||
case OPT_ast_dump_lookups:
|
||||
Opts.ProgramAction = frontend::ASTDump; break;
|
||||
case OPT_ast_print:
|
||||
Opts.ProgramAction = frontend::ASTPrint; break;
|
||||
@@ -825,6 +826,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
|
||||
Opts.FixOnlyWarnings = Args.hasArg(OPT_fix_only_warnings);
|
||||
Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile);
|
||||
Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp);
|
||||
Opts.ASTDumpDecls = Args.hasArg(OPT_ast_dump);
|
||||
Opts.ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter);
|
||||
Opts.ASTDumpLookups = Args.hasArg(OPT_ast_dump_lookups);
|
||||
Opts.UseGlobalModuleIndex = !Args.hasArg(OPT_fno_modules_global_index);
|
||||
|
||||
@@ -55,6 +55,7 @@ ASTPrintAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
|
||||
std::unique_ptr<ASTConsumer>
|
||||
ASTDumpAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
|
||||
return CreateASTDumper(CI.getFrontendOpts().ASTDumpFilter,
|
||||
CI.getFrontendOpts().ASTDumpDecls,
|
||||
CI.getFrontendOpts().ASTDumpLookups);
|
||||
}
|
||||
|
||||
|
||||
38
clang/test/Misc/ast-dump-lookups.cpp
Normal file
38
clang/test/Misc/ast-dump-lookups.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter Test %s | FileCheck -check-prefix DECLS %s
|
||||
// RUN: %clang_cc1 -std=c++11 -ast-dump-lookups -ast-dump-filter Test %s | FileCheck -check-prefix LOOKUPS %s
|
||||
// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-lookups -ast-dump-filter Test %s | FileCheck -check-prefix DECLS-LOOKUPS %s
|
||||
|
||||
namespace Test {
|
||||
extern int a;
|
||||
int a = 0;
|
||||
}
|
||||
|
||||
namespace Test { }
|
||||
|
||||
// DECLS: Dumping Test:
|
||||
// DECLS-NEXT: NamespaceDecl {{.*}} Test
|
||||
// DECLS-NEXT: |-VarDecl [[EXTERN_A:0x[^ ]*]] {{.*}} a 'int' extern
|
||||
// DECLS-NEXT: `-VarDecl {{.*}} prev [[EXTERN_A]] {{.*}} a 'int' cinit
|
||||
// DECLS-NEXT: `-IntegerLiteral {{.*}} 'int' 0
|
||||
//
|
||||
// DECLS: Dumping Test:
|
||||
// DECLS-NEXT: NamespaceDecl {{.*}} Test
|
||||
|
||||
// LOOKUPS: Dumping Test:
|
||||
// LOOKUPS-NEXT: StoredDeclsMap Namespace {{.*}} 'Test'
|
||||
// LOOKUPS-NEXT: `-DeclarationName 'a'
|
||||
// LOOKUPS-NEXT: `-Var {{.*}} 'a' 'int'
|
||||
//
|
||||
// LOOKUPS: Dumping Test:
|
||||
// LOOKUPS-NEXT: Lookup map is in primary DeclContext
|
||||
|
||||
// DECLS-LOOKUPS: Dumping Test:
|
||||
// DECLS-LOOKUPS-NEXT: StoredDeclsMap Namespace {{.*}} 'Test'
|
||||
// DECLS-LOOKUPS-NEXT: `-DeclarationName 'a'
|
||||
// DECLS-LOOKUPS-NEXT: `-Var [[A:[^ ]*]] 'a' 'int'
|
||||
// DECLS-LOOKUPS-NEXT: |-VarDecl [[EXTERN_A:0x[^ ]*]] {{.*}} a 'int' extern
|
||||
// DECLS-LOOKUPS-NEXT: `-VarDecl [[A]] prev [[EXTERN_A]] {{.*}} a 'int' cinit
|
||||
// DECLS-LOOKUPS-NEXT: `-IntegerLiteral {{.*}} 'int' 0
|
||||
//
|
||||
// DECLS-LOOKUPS: Dumping Test:
|
||||
// DECLS-LOOKUPS-NEXT: Lookup map is in primary DeclContext
|
||||
@@ -1,6 +1,6 @@
|
||||
// RUN: rm -rf %t
|
||||
// RUN: not %clang_cc1 -x objective-c++ -fmodules -fno-modules-error-recovery -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump -ast-dump-lookups | FileCheck %s --check-prefix=CHECK-GLOBAL
|
||||
// RUN: not %clang_cc1 -x objective-c++ -fmodules -fno-modules-error-recovery -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump -ast-dump-lookups -ast-dump-filter N | FileCheck %s --check-prefix=CHECK-NAMESPACE-N
|
||||
// RUN: not %clang_cc1 -x objective-c++ -fmodules -fno-modules-error-recovery -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump-lookups | FileCheck %s --check-prefix=CHECK-GLOBAL
|
||||
// RUN: not %clang_cc1 -x objective-c++ -fmodules -fno-modules-error-recovery -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump-lookups -ast-dump-filter N | FileCheck %s --check-prefix=CHECK-NAMESPACE-N
|
||||
// RUN: not %clang_cc1 -x objective-c++ -fmodules -fno-modules-error-recovery -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump | FileCheck %s --check-prefix=CHECK-DUMP
|
||||
// RUN: %clang_cc1 -x objective-c++ -fmodules -fno-modules-error-recovery -fmodules-cache-path=%t -I %S/Inputs %s -verify -std=c++11
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
// Test with pch.
|
||||
// RUN: %clang_cc1 -x c++-header -emit-pch -o %t %S/cxx-namespaces.h
|
||||
// RUN: %clang_cc1 -include-pch %t -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -include-pch %t -fsyntax-only -ast-dump -ast-dump-lookups -ast-dump-filter N %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -include-pch %t -fsyntax-only -ast-dump-lookups -ast-dump-filter N %s | FileCheck %s
|
||||
|
||||
// Test with modules.
|
||||
// RUN: %clang_cc1 -fmodules -x c++-header -emit-pch -o %t %S/cxx-namespaces.h
|
||||
// RUN: %clang_cc1 -fmodules -include-pch %t -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fmodules -include-pch %t -fsyntax-only -ast-dump -ast-dump-lookups -ast-dump-filter N %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -fmodules -include-pch %t -fsyntax-only -ast-dump-lookups -ast-dump-filter N %s | FileCheck %s
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
|
||||
@@ -184,7 +184,8 @@ public:
|
||||
if (ASTList)
|
||||
return clang::CreateASTDeclNodeLister();
|
||||
if (ASTDump)
|
||||
return clang::CreateASTDumper(ASTDumpFilter);
|
||||
return clang::CreateASTDumper(ASTDumpFilter, /*DumpDecls*/ true,
|
||||
/*DumpLookups*/ false);
|
||||
if (ASTPrint)
|
||||
return clang::CreateASTPrinter(&llvm::outs(), ASTDumpFilter);
|
||||
return llvm::make_unique<clang::ASTConsumer>();
|
||||
|
||||
Reference in New Issue
Block a user