Skip to content

Commit edd2c21

Browse files
author
Debadri Basak
committed
Merging the implementation change in lifetime-stats branch.
2 parents 20bc6f2 + 7844829 commit edd2c21

File tree

6 files changed

+62
-21
lines changed

6 files changed

+62
-21
lines changed

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ class LifetimeSafetyReporter {
4848
Confidence Confidence) {}
4949
};
5050

51-
/// The main entry point for the analysis.
52-
void runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
53-
LifetimeSafetyReporter *Reporter);
54-
5551
namespace internal {
5652
/// An object to hold the factories for immutable collections, ensuring
5753
/// that all created states share the same underlying memory management.
@@ -64,8 +60,6 @@ struct LifetimeFactory {
6460
/// Running the lifetime safety analysis and querying its results. It
6561
/// encapsulates the various dataflow analyses.
6662
class LifetimeSafetyAnalysis {
67-
private:
68-
static llvm::StringMap<int> MissingOriginCount;
6963

7064
public:
7165
LifetimeSafetyAnalysis(AnalysisDeclContext &AC,
@@ -80,10 +74,6 @@ class LifetimeSafetyAnalysis {
8074
LiveOriginsAnalysis &getLiveOrigins() const { return *LiveOrigins; }
8175
FactManager &getFactManager() { return FactMgr; }
8276

83-
static void PrintStats(llvm::raw_ostream &OS);
84-
85-
static void UpdateMissingOriginCount(const OriginManager &OM);
86-
8777
private:
8878
AnalysisDeclContext &AC;
8979
LifetimeSafetyReporter *Reporter;
@@ -93,6 +83,12 @@ class LifetimeSafetyAnalysis {
9383
std::unique_ptr<LoanPropagationAnalysis> LoanPropagation;
9484
};
9585
} // namespace internal
86+
87+
/// The main entry point for the analysis.
88+
std::unique_ptr<internal::LifetimeSafetyAnalysis>
89+
runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
90+
LifetimeSafetyReporter *Reporter);
91+
9692
} // namespace clang::lifetimes
9793

9894
#endif // LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_H

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class OriginManager {
9090
llvm::SmallVector<Origin> AllOrigins;
9191
llvm::DenseMap<const clang::ValueDecl *, OriginID> DeclToOriginID;
9292
llvm::DenseMap<const clang::Expr *, OriginID> ExprToOriginID;
93-
llvm::StringMap<int> ExprTypeToMissingOriginCount;
93+
llvm::StringMap<unsigned> ExprTypeToMissingOriginCount;
9494
};
9595
} // namespace clang::lifetimes::internal
9696

clang/include/clang/Sema/AnalysisBasedWarnings.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
#define LLVM_CLANG_SEMA_ANALYSISBASEDWARNINGS_H
1515

1616
#include "clang/AST/Decl.h"
17+
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
18+
#include "clang/Analysis/AnalysisDeclContext.h"
1719
#include "llvm/ADT/DenseMap.h"
20+
#include "llvm/ADT/StringMap.h"
1821
#include <memory>
1922

2023
namespace clang {
@@ -95,6 +98,9 @@ class AnalysisBasedWarnings {
9598
/// a single function.
9699
unsigned MaxUninitAnalysisBlockVisitsPerFunction;
97100

101+
/// Map from expressions missing origin in OriginManager to their counts.
102+
llvm::StringMap<unsigned> MissingOriginCount;
103+
98104
/// @}
99105

100106
public:
@@ -116,6 +122,9 @@ class AnalysisBasedWarnings {
116122
Policy &getPolicyOverrides() { return PolicyOverrides; }
117123

118124
void PrintStats() const;
125+
126+
void FindMissingOrigins(AnalysisDeclContext &AC,
127+
clang::lifetimes::internal::FactManager &FactMgr);
119128
};
120129

121130
} // namespace sema

clang/lib/Analysis/LifetimeSafety/LifetimeSafety.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,12 @@ void LifetimeSafetyAnalysis::run() {
8787
}
8888
} // namespace internal
8989

90-
void runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
91-
LifetimeSafetyReporter *Reporter) {
92-
internal::LifetimeSafetyAnalysis Analysis(AC, Reporter);
93-
Analysis.run();
90+
std::unique_ptr<internal::LifetimeSafetyAnalysis>
91+
runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
92+
LifetimeSafetyReporter *Reporter) {
93+
std::unique_ptr<internal::LifetimeSafetyAnalysis> Analysis =
94+
std::make_unique<internal::LifetimeSafetyAnalysis>(AC, Reporter);
95+
Analysis->run();
96+
return Analysis;
9497
}
9598
} // namespace clang::lifetimes

clang/lib/Analysis/LifetimeSafety/Origins.cpp

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

99
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
10+
#include "clang/AST/Expr.h"
1011
#include "clang/AST/TypeBase.h"
1112
#include "llvm/ADT/StringMap.h"
1213

@@ -24,7 +25,7 @@ void OriginManager::dump(OriginID OID, llvm::raw_ostream &OS) const {
2425
OS << ")";
2526
}
2627

27-
const llvm::StringMap<int> OriginManager::getMissingOrigins() const {
28+
const llvm::StringMap<unsigned> OriginManager::getMissingOrigins() const {
2829
return ExprTypeToMissingOriginCount;
2930
}
3031

@@ -46,10 +47,12 @@ OriginID OriginManager::get(const Expr &E) {
4647

4748
// if the expression has no specific origin, increment the missing origin
4849
// counter.
49-
const QualType ExprType = E.getType();
50-
auto CountIt = ExprTypeToMissingOriginCount.find(ExprType.getAsString());
50+
// const QualType ExprType = E.getType();
51+
std::string ExprStr(E.getStmtClassName());
52+
ExprStr = ExprStr + "<" + E.getType().getAsString() + ">";
53+
auto CountIt = ExprTypeToMissingOriginCount.find(ExprStr);
5154
if (CountIt == ExprTypeToMissingOriginCount.end()) {
52-
ExprTypeToMissingOriginCount[ExprType.getAsString()] = 1;
55+
ExprTypeToMissingOriginCount[ExprStr] = 1;
5356
} else {
5457
CountIt->second++;
5558
}
@@ -102,4 +105,9 @@ OriginID OriginManager::getOrCreate(const ValueDecl &D) {
102105
return NewID;
103106
}
104107

108+
bool OriginManager::isOriginMissing(const Expr &E) const {
109+
auto It = ExprToOriginID.find(&E);
110+
return It == ExprToOriginID.end();
111+
}
112+
105113
} // namespace clang::lifetimes::internal

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h"
3030
#include "clang/Analysis/Analyses/CalledOnceCheck.h"
3131
#include "clang/Analysis/Analyses/Consumed.h"
32+
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
3233
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h"
3334
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
3435
#include "clang/Analysis/Analyses/ReachableCode.h"
@@ -53,6 +54,7 @@
5354
#include "llvm/ADT/STLFunctionalExtras.h"
5455
#include "llvm/ADT/SmallVector.h"
5556
#include "llvm/ADT/StringRef.h"
57+
#include "llvm/Support/Casting.h"
5658
#include "llvm/Support/Debug.h"
5759
#include "llvm/Support/raw_ostream.h"
5860
#include <algorithm>
@@ -3067,7 +3069,11 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
30673069
if (EnableLifetimeSafetyAnalysis && S.getLangOpts().CPlusPlus) {
30683070
if (AC.getCFG()) {
30693071
lifetimes::LifetimeSafetyReporterImpl LifetimeSafetyReporter(S);
3070-
lifetimes::runLifetimeSafetyAnalysis(AC, &LifetimeSafetyReporter);
3072+
std::unique_ptr<clang::lifetimes::internal::LifetimeSafetyAnalysis>
3073+
Analysis =
3074+
lifetimes::runLifetimeSafetyAnalysis(AC, &LifetimeSafetyReporter);
3075+
if (S.CollectStats)
3076+
FindMissingOrigins(AC, Analysis->getFactManager());
30713077
}
30723078
}
30733079
// Check for violations of "called once" parameter properties.
@@ -3133,8 +3139,27 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
31333139
}
31343140
}
31353141

3142+
void clang::sema::AnalysisBasedWarnings::FindMissingOrigins(
3143+
AnalysisDeclContext &AC, lifetimes::internal::FactManager &FactMgr) {
3144+
if (AC.getCFG()) {
3145+
for (const auto &[expr, count] :
3146+
FactMgr.getOriginMgr().getMissingOrigins()) {
3147+
MissingOriginCount[expr] += count;
3148+
}
3149+
}
3150+
}
3151+
31363152
void clang::sema::AnalysisBasedWarnings::PrintStats() const {
3137-
clang::lifetimes::internal::LifetimeSafetyAnalysis::PrintStats(llvm::errs());
3153+
// clang::lifetimes::internal::LifetimeSafetyAnalysis::PrintStats(llvm::errs());
3154+
llvm::errs() << "\n*** LifetimeSafety Missing Origin Stats "
3155+
"(expression_type : count) :\n";
3156+
unsigned totalMissingOrigins = 0;
3157+
for (const auto &[expr, count] : MissingOriginCount) {
3158+
llvm::errs() << expr << " : " << count << '\n';
3159+
totalMissingOrigins += count;
3160+
}
3161+
llvm::errs() << "Total missing origins: " << totalMissingOrigins << "\n";
3162+
llvm::errs() << "****************************************\n";
31383163
llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
31393164
unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
31403165
unsigned AvgCFGBlocksPerFunction =

0 commit comments

Comments
 (0)