Skip to content

Commit 5326b27

Browse files
author
Debadri Basak
committed
Adding implementation for LifetimeSafetyAnalysis::PrintStats
1 parent 2545209 commit 5326b27

File tree

5 files changed

+52
-0
lines changed

5 files changed

+52
-0
lines changed

clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
2424
#include "clang/Analysis/Analyses/LifetimeSafety/LiveOrigins.h"
2525
#include "clang/Analysis/Analyses/LifetimeSafety/LoanPropagation.h"
26+
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
2627
#include "clang/Analysis/AnalysisDeclContext.h"
28+
#include "llvm/ADT/StringMap.h"
29+
#include "llvm/Support/raw_ostream.h"
2730

2831
namespace clang::lifetimes {
2932

@@ -73,7 +76,12 @@ class LifetimeSafetyAnalysis {
7376
LiveOriginsAnalysis &getLiveOrigins() const { return *LiveOrigins; }
7477
FactManager &getFactManager() { return FactMgr; }
7578

79+
static void PrintStats(llvm::raw_ostream& OS);
80+
81+
static void UpdateMissingOriginCount(const OriginManager& OM);
82+
7683
private:
84+
static llvm::StringMap<int> MissingOriginMap;
7785
AnalysisDeclContext &AC;
7886
LifetimeSafetyReporter *Reporter;
7987
LifetimeFactory Factory;

clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616

1717
#include "clang/AST/Decl.h"
1818
#include "clang/AST/Expr.h"
19+
#include "clang/AST/TypeBase.h"
1920
#include "clang/Analysis/Analyses/LifetimeSafety/Utils.h"
21+
#include "llvm/ADT/StringMap.h"
22+
#include "llvm/Support/raw_ostream.h"
2023

2124
namespace clang::lifetimes::internal {
2225

@@ -76,6 +79,8 @@ class OriginManager {
7679

7780
void dump(OriginID OID, llvm::raw_ostream &OS) const;
7881

82+
const llvm::StringMap<int> getMissingOrigins() const;
83+
7984
private:
8085
OriginID getNextOriginID() { return NextOriginID++; }
8186

@@ -85,6 +90,7 @@ class OriginManager {
8590
llvm::SmallVector<Origin> AllOrigins;
8691
llvm::DenseMap<const clang::ValueDecl *, OriginID> DeclToOriginID;
8792
llvm::DenseMap<const clang::Expr *, OriginID> ExprToOriginID;
93+
llvm::StringMap<int> ExprTypeToMissingOriginCount;
8894
};
8995
} // namespace clang::lifetimes::internal
9096

clang/lib/Analysis/LifetimeSafety/LifetimeSafety.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,35 @@
2323
#include "clang/Analysis/AnalysisDeclContext.h"
2424
#include "clang/Analysis/CFG.h"
2525
#include "llvm/ADT/FoldingSet.h"
26+
#include "llvm/ADT/StringMap.h"
2627
#include "llvm/Support/Debug.h"
2728
#include "llvm/Support/ErrorHandling.h"
2829
#include "llvm/Support/TimeProfiler.h"
30+
#include "llvm/Support/raw_ostream.h"
2931
#include <memory>
3032

3133
namespace clang::lifetimes {
3234
namespace internal {
3335

36+
llvm::StringMap<int> LifetimeSafetyAnalysis::MissingOriginMap;
37+
3438
LifetimeSafetyAnalysis::LifetimeSafetyAnalysis(AnalysisDeclContext &AC,
3539
LifetimeSafetyReporter *Reporter)
3640
: AC(AC), Reporter(Reporter) {}
3741

42+
void LifetimeSafetyAnalysis::PrintStats(llvm::raw_ostream& OS) {
43+
llvm::errs() << "\n*** LifetimeSafety Missing Origin Stats (expression_type : count) :\n";
44+
for (const auto& [expr, count] : LifetimeSafetyAnalysis::MissingOriginMap) {
45+
OS << expr << " : " << count << '\n';
46+
}
47+
}
48+
49+
void LifetimeSafetyAnalysis::UpdateMissingOriginCount(const OriginManager& OM) {
50+
for (const auto& [expr, missing_origin_count] : OM.getMissingOrigins()) {
51+
LifetimeSafetyAnalysis::MissingOriginMap[std::string(expr)] += missing_origin_count;
52+
}
53+
}
54+
3855
void LifetimeSafetyAnalysis::run() {
3956
llvm::TimeTraceScope TimeProfile("LifetimeSafetyAnalysis");
4057

@@ -66,6 +83,7 @@ void LifetimeSafetyAnalysis::run() {
6683
LiveOrigins->dump(llvm::dbgs(), FactMgr.getTestPoints()));
6784

6885
runLifetimeChecker(*LoanPropagation, *LiveOrigins, FactMgr, AC, Reporter);
86+
UpdateMissingOriginCount(FactMgr.getOriginMgr());
6987
}
7088
} // namespace internal
7189

clang/lib/Analysis/LifetimeSafety/Origins.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
10+
#include "clang/AST/TypeBase.h"
11+
#include "llvm/ADT/StringMap.h"
1012

1113
namespace clang::lifetimes::internal {
1214

@@ -22,6 +24,11 @@ void OriginManager::dump(OriginID OID, llvm::raw_ostream &OS) const {
2224
OS << ")";
2325
}
2426

27+
const llvm::StringMap<int> OriginManager::getMissingOrigins() const {
28+
return ExprTypeToMissingOriginCount;
29+
}
30+
31+
2532
Origin &OriginManager::addOrigin(OriginID ID, const clang::ValueDecl &D) {
2633
AllOrigins.emplace_back(ID, &D);
2734
return AllOrigins.back();
@@ -37,6 +44,16 @@ OriginID OriginManager::get(const Expr &E) {
3744
auto It = ExprToOriginID.find(&E);
3845
if (It != ExprToOriginID.end())
3946
return It->second;
47+
48+
// if the expression has no specific origin, increment the missing origin counter.
49+
const QualType ExprType = E.getType();
50+
auto CountIt = ExprTypeToMissingOriginCount.find(ExprType.getAsString());
51+
if (CountIt == ExprTypeToMissingOriginCount.end()) {
52+
ExprTypeToMissingOriginCount[ExprType.getAsString()] = 1;
53+
} else {
54+
CountIt->second++;
55+
}
56+
4057
// If the expression itself has no specific origin, and it's a reference
4158
// to a declaration, its origin is that of the declaration it refers to.
4259
// For pointer types, where we don't pre-emptively create an origin for the

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "clang/Analysis/Analyses/CalledOnceCheck.h"
3131
#include "clang/Analysis/Analyses/Consumed.h"
3232
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h"
33+
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
3334
#include "clang/Analysis/Analyses/ReachableCode.h"
3435
#include "clang/Analysis/Analyses/ThreadSafety.h"
3536
#include "clang/Analysis/Analyses/UninitializedValues.h"
@@ -53,6 +54,7 @@
5354
#include "llvm/ADT/SmallVector.h"
5455
#include "llvm/ADT/StringRef.h"
5556
#include "llvm/Support/Debug.h"
57+
#include "llvm/Support/raw_ostream.h"
5658
#include <algorithm>
5759
#include <deque>
5860
#include <iterator>
@@ -3132,6 +3134,7 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
31323134
}
31333135

31343136
void clang::sema::AnalysisBasedWarnings::PrintStats() const {
3137+
clang::lifetimes::internal::LifetimeSafetyAnalysis::PrintStats(llvm::errs());
31353138
llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
31363139

31373140
unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;

0 commit comments

Comments
 (0)