Skip to content

Commit c9513a4

Browse files
committed
[Stats] Add support for tracing protocol conformances.
1 parent 5f12ffc commit c9513a4

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

include/swift/Basic/Statistic.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace clang {
5656
namespace swift {
5757

5858
class Decl;
59+
class ProtocolConformance;
5960
class Expr;
6061
class SILFunction;
6162
class FrontendStatsTracer;
@@ -191,6 +192,8 @@ class FrontendStatsTracer
191192
/// disabled").
192193
FrontendStatsTracer(UnifiedStatsReporter *Reporter, StringRef EventName,
193194
const Decl *D);
195+
FrontendStatsTracer(UnifiedStatsReporter *Reporter, StringRef EventName,
196+
const ProtocolConformance *P);
194197
FrontendStatsTracer(UnifiedStatsReporter *Reporter, StringRef EventName,
195198
const clang::Decl *D);
196199
FrontendStatsTracer(UnifiedStatsReporter *Reporter, StringRef EventName,
@@ -209,6 +212,9 @@ class FrontendStatsTracer
209212
template<> const UnifiedStatsReporter::TraceFormatter*
210213
FrontendStatsTracer::getTraceFormatter<const Decl *>();
211214

215+
template<> const UnifiedStatsReporter::TraceFormatter*
216+
FrontendStatsTracer::getTraceFormatter<const ProtocolConformance *>();
217+
212218
template<> const UnifiedStatsReporter::TraceFormatter*
213219
FrontendStatsTracer::getTraceFormatter<const clang::Decl *>();
214220

lib/AST/ProtocolConformance.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "swift/AST/Substitution.h"
2525
#include "swift/AST/Types.h"
2626
#include "swift/AST/TypeWalker.h"
27+
#include "swift/Basic/Statistic.h"
2728
#include "swift/ClangImporter/ClangModule.h"
2829
#include "llvm/ADT/MapVector.h"
2930
#include "llvm/ADT/Statistic.h"
@@ -1367,3 +1368,46 @@ ProtocolConformanceRef::getCanonicalConformanceRef() const {
13671368
return *this;
13681369
return ProtocolConformanceRef(getConcrete()->getCanonicalConformance());
13691370
}
1371+
1372+
// See swift/Basic/Statistic.h for declaration: this enables tracing
1373+
// ProtocolConformances, is defined here to avoid too much layering violation /
1374+
// circular linkage dependency.
1375+
1376+
struct ProtocolConformanceTraceFormatter
1377+
: public UnifiedStatsReporter::TraceFormatter {
1378+
void traceName(const void *Entity, raw_ostream &OS) const {
1379+
if (!Entity)
1380+
return;
1381+
const ProtocolConformance *C =
1382+
static_cast<const ProtocolConformance *>(Entity);
1383+
OS << "<conformance ";
1384+
if (auto const *DC = C->getDeclContext()) {
1385+
if (auto const *N = DC->getAsNominalTypeOrNominalTypeExtensionContext()) {
1386+
N->getFullName().print(OS, false);
1387+
}
1388+
}
1389+
OS << " : ";
1390+
if (auto *P = C->getProtocol())
1391+
P->getFullName().print(OS, false);
1392+
OS << ">";
1393+
}
1394+
void traceLoc(const void *Entity, SourceManager *SM,
1395+
clang::SourceManager *CSM, raw_ostream &OS) const {
1396+
if (!Entity)
1397+
return;
1398+
const ProtocolConformance *C =
1399+
static_cast<const ProtocolConformance *>(Entity);
1400+
if (auto const *DC = C->getDeclContext()) {
1401+
if (auto const *D = DC->getAsDeclOrDeclExtensionContext())
1402+
D->getSourceRange().print(OS, *SM, false);
1403+
}
1404+
}
1405+
};
1406+
1407+
static ProtocolConformanceTraceFormatter TF;
1408+
1409+
template<>
1410+
const UnifiedStatsReporter::TraceFormatter*
1411+
FrontendStatsTracer::getTraceFormatter<const ProtocolConformance *>() {
1412+
return &TF;
1413+
}

lib/Basic/Statistic.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,11 @@ FrontendStatsTracer::FrontendStatsTracer(UnifiedStatsReporter *R, StringRef S,
276276
: FrontendStatsTracer(R, S, D, getTraceFormatter<const Decl *>())
277277
{}
278278

279+
FrontendStatsTracer::FrontendStatsTracer(UnifiedStatsReporter *R, StringRef S,
280+
const ProtocolConformance *P)
281+
: FrontendStatsTracer(R, S, P,
282+
getTraceFormatter<const ProtocolConformance *>()) {}
283+
279284
FrontendStatsTracer::FrontendStatsTracer(UnifiedStatsReporter *R, StringRef S,
280285
const Expr *E)
281286
: FrontendStatsTracer(R, S, E, getTraceFormatter<const Expr *>())

0 commit comments

Comments
 (0)