forked from OSchip/llvm-project
[CTU] Add DisplayCTUProgress analyzer switch
Summary: With a new switch we may be able to print to stderr if a new TU is being loaded during CTU. This is very important for higher level scripts (like CodeChecker) to be able to parse this output so they can create e.g. a zip file in case of a Clang crash which contains all the related TU files. Reviewers: xazax.hun, Szelethus, a_sidorin, george.karpenkov Subscribers: whisperity, baloghadamsoftware, szepet, rnkovacs, a.sidorin, mikhail.ramalho, donat.nagy, dkrupp, Differential Revision: https://reviews.llvm.org/D55135 llvm-svn: 348594
This commit is contained in:
parent
b9e65cbddf
commit
9419eb42c4
|
@ -108,7 +108,7 @@ public:
|
|||
/// Note that the AST files should also be in the \p CrossTUDir.
|
||||
llvm::Expected<const FunctionDecl *>
|
||||
getCrossTUDefinition(const FunctionDecl *FD, StringRef CrossTUDir,
|
||||
StringRef IndexName);
|
||||
StringRef IndexName, bool DisplayCTUProgress = false);
|
||||
|
||||
/// This function loads a function definition from an external AST
|
||||
/// file.
|
||||
|
@ -124,7 +124,8 @@ public:
|
|||
/// Note that the AST files should also be in the \p CrossTUDir.
|
||||
llvm::Expected<ASTUnit *> loadExternalAST(StringRef LookupName,
|
||||
StringRef CrossTUDir,
|
||||
StringRef IndexName);
|
||||
StringRef IndexName,
|
||||
bool DisplayCTUProgress = false);
|
||||
|
||||
/// This function merges a definition from a separate AST Unit into
|
||||
/// the current one which was created by the compiler instance that
|
||||
|
|
|
@ -283,6 +283,11 @@ ANALYZER_OPTION(bool, ShouldDisplayMacroExpansions, "expand-macros",
|
|||
"expanded and included in the plist output.",
|
||||
false)
|
||||
|
||||
ANALYZER_OPTION(bool, DisplayCTUProgress, "display-ctu-progress",
|
||||
"Whether to emit verbose output about "
|
||||
"the analyzer's progress related to ctu.",
|
||||
false)
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Unsinged analyzer options.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -159,7 +159,8 @@ CrossTranslationUnitContext::findFunctionInDeclContext(const DeclContext *DC,
|
|||
llvm::Expected<const FunctionDecl *>
|
||||
CrossTranslationUnitContext::getCrossTUDefinition(const FunctionDecl *FD,
|
||||
StringRef CrossTUDir,
|
||||
StringRef IndexName) {
|
||||
StringRef IndexName,
|
||||
bool DisplayCTUProgress) {
|
||||
assert(FD && "FD is missing, bad call to this function!");
|
||||
assert(!FD->hasBody() && "FD has a definition in current translation unit!");
|
||||
++NumGetCTUCalled;
|
||||
|
@ -168,7 +169,7 @@ CrossTranslationUnitContext::getCrossTUDefinition(const FunctionDecl *FD,
|
|||
return llvm::make_error<IndexError>(
|
||||
index_error_code::failed_to_generate_usr);
|
||||
llvm::Expected<ASTUnit *> ASTUnitOrError =
|
||||
loadExternalAST(LookupFnName, CrossTUDir, IndexName);
|
||||
loadExternalAST(LookupFnName, CrossTUDir, IndexName, DisplayCTUProgress);
|
||||
if (!ASTUnitOrError)
|
||||
return ASTUnitOrError.takeError();
|
||||
ASTUnit *Unit = *ASTUnitOrError;
|
||||
|
@ -205,7 +206,8 @@ void CrossTranslationUnitContext::emitCrossTUDiagnostics(const IndexError &IE) {
|
|||
}
|
||||
|
||||
llvm::Expected<ASTUnit *> CrossTranslationUnitContext::loadExternalAST(
|
||||
StringRef LookupName, StringRef CrossTUDir, StringRef IndexName) {
|
||||
StringRef LookupName, StringRef CrossTUDir, StringRef IndexName,
|
||||
bool DisplayCTUProgress) {
|
||||
// FIXME: The current implementation only supports loading functions with
|
||||
// a lookup name from a single translation unit. If multiple
|
||||
// translation units contains functions with the same lookup name an
|
||||
|
@ -247,6 +249,10 @@ llvm::Expected<ASTUnit *> CrossTranslationUnitContext::loadExternalAST(
|
|||
ASTUnit::LoadEverything, Diags, CI.getFileSystemOpts()));
|
||||
Unit = LoadedUnit.get();
|
||||
FileASTUnitMap[ASTFileName] = std::move(LoadedUnit);
|
||||
if (DisplayCTUProgress) {
|
||||
llvm::errs() << "CTU loaded AST file: "
|
||||
<< ASTFileName << "\n";
|
||||
}
|
||||
} else {
|
||||
Unit = ASTCacheEntry->second.get();
|
||||
}
|
||||
|
|
|
@ -560,8 +560,8 @@ RuntimeDefinition AnyFunctionCall::getRuntimeDefinition() const {
|
|||
cross_tu::CrossTranslationUnitContext &CTUCtx =
|
||||
*Engine->getCrossTranslationUnitContext();
|
||||
llvm::Expected<const FunctionDecl *> CTUDeclOrError =
|
||||
CTUCtx.getCrossTUDefinition(FD, Opts.CTUDir,
|
||||
Opts.CTUIndexName);
|
||||
CTUCtx.getCrossTUDefinition(FD, Opts.CTUDir, Opts.CTUIndexName,
|
||||
Opts.DisplayCTUProgress);
|
||||
|
||||
if (!CTUDeclOrError) {
|
||||
handleAllErrors(CTUDeclOrError.takeError(),
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
// CHECK-NEXT: crosscheck-with-z3 = false
|
||||
// CHECK-NEXT: ctu-dir = ""
|
||||
// CHECK-NEXT: ctu-index-name = externalFnMap.txt
|
||||
// CHECK-NEXT: display-ctu-progress = false
|
||||
// CHECK-NEXT: eagerly-assume = true
|
||||
// CHECK-NEXT: elide-constructors = true
|
||||
// CHECK-NEXT: expand-macros = false
|
||||
|
@ -51,4 +52,4 @@
|
|||
// CHECK-NEXT: unroll-loops = false
|
||||
// CHECK-NEXT: widen-loops = false
|
||||
// CHECK-NEXT: [stats]
|
||||
// CHECK-NEXT: num-entries = 48
|
||||
// CHECK-NEXT: num-entries = 49
|
||||
|
|
|
@ -10,6 +10,14 @@
|
|||
// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \
|
||||
// RUN: -analyzer-config ctu-dir=%t/ctudir \
|
||||
// RUN: -verify %s
|
||||
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu \
|
||||
// RUN: -analyzer-checker=core,debug.ExprInspection \
|
||||
// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \
|
||||
// RUN: -analyzer-config ctu-dir=%t/ctudir \
|
||||
// RUN: -analyzer-config display-ctu-progress=true 2>&1 %s | FileCheck %s
|
||||
|
||||
// CHECK: CTU loaded AST file: {{.*}}/ctu-other.cpp
|
||||
// CHECK: CTU loaded AST file: {{.*}}/ctu-chain.cpp
|
||||
|
||||
#include "ctu-hdr.h"
|
||||
|
||||
|
|
Loading…
Reference in New Issue