Skip to content

Commit 00e34e4

Browse files
authored
Merge pull request #11988 from graydon/unified-stats-reporter-fixes-for-swift-4.0-branch
Unified stats reporter fixes for swift 4.0 branch
2 parents 2c60469 + 730166b commit 00e34e4

File tree

5 files changed

+88
-35
lines changed

5 files changed

+88
-35
lines changed

include/swift/Basic/Statistic.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ class UnifiedStatsReporter {
7474
struct AlwaysOnFrontendCounters
7575
{
7676
size_t NumSourceBuffers;
77+
size_t NumSourceLines;
78+
size_t NumSourceLinesPerSecond;
7779
size_t NumLinkLibraries;
7880
size_t NumLoadedModules;
7981
size_t NumImportedExternalDefinitions;
@@ -132,6 +134,7 @@ class UnifiedStatsReporter {
132134

133135
private:
134136
SmallString<128> Filename;
137+
llvm::TimeRecord StartedTime;
135138
std::unique_ptr<llvm::NamedRegionTimer> Timer;
136139

137140
std::unique_ptr<AlwaysOnDriverCounters> DriverCounters;

lib/Basic/Statistic.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ UnifiedStatsReporter::UnifiedStatsReporter(StringRef ProgramName,
124124
StringRef AuxName,
125125
StringRef Directory)
126126
: Filename(Directory),
127+
StartedTime(llvm::TimeRecord::getCurrentTime()),
127128
Timer(make_unique<NamedRegionTimer>(AuxName,
128129
"Building Target",
129130
ProgramName, "Running Program"))
@@ -161,6 +162,8 @@ UnifiedStatsReporter::publishAlwaysOnStatsToLLVM() {
161162
auto &C = getFrontendCounters();
162163

163164
PUBLISH_STAT(C, "AST", NumSourceBuffers);
165+
PUBLISH_STAT(C, "AST", NumSourceLines);
166+
PUBLISH_STAT(C, "AST", NumSourceLinesPerSecond);
164167
PUBLISH_STAT(C, "AST", NumLinkLibraries);
165168
PUBLISH_STAT(C, "AST", NumLoadedModules);
166169
PUBLISH_STAT(C, "AST", NumImportedExternalDefinitions);
@@ -251,6 +254,8 @@ UnifiedStatsReporter::printAlwaysOnStatsAndTimers(raw_ostream &OS) {
251254
auto &C = getFrontendCounters();
252255

253256
PRINT_STAT(OS, delim, C, "AST", NumSourceBuffers);
257+
PRINT_STAT(OS, delim, C, "AST", NumSourceLines);
258+
PRINT_STAT(OS, delim, C, "AST", NumSourceLinesPerSecond);
254259
PRINT_STAT(OS, delim, C, "AST", NumLinkLibraries);
255260
PRINT_STAT(OS, delim, C, "AST", NumLoadedModules);
256261
PRINT_STAT(OS, delim, C, "AST", NumImportedExternalDefinitions);
@@ -339,11 +344,24 @@ UnifiedStatsReporter::~UnifiedStatsReporter()
339344
// we're repurposing a bit here.
340345
Timer.reset();
341346

347+
// We currently do this by manual TimeRecord keeping because LLVM has decided
348+
// not to allow access to the Timers inside NamedRegionTimers.
349+
auto ElapsedTime = llvm::TimeRecord::getCurrentTime();
350+
ElapsedTime -= StartedTime;
351+
342352
if (DriverCounters) {
343353
auto &C = getDriverCounters();
344354
C.ChildrenMaxRSS = getChildrenMaxResidentSetSize();
345355
}
346356

357+
if (FrontendCounters) {
358+
auto &C = getFrontendCounters();
359+
// Convenience calculation for crude top-level "absolute speed".
360+
if (C.NumSourceLines != 0 && ElapsedTime.getProcessTime() != 0.0)
361+
C.NumSourceLinesPerSecond = (size_t) (((double)C.NumSourceLines) /
362+
ElapsedTime.getProcessTime());
363+
}
364+
347365
std::error_code EC;
348366
raw_fd_ostream ostream(Filename, EC, fs::F_Append | fs::F_Text);
349367
if (EC)

lib/FrontendTool/FrontendTool.cpp

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
#include "llvm/ADT/Statistic.h"
6666
#include "llvm/IR/LLVMContext.h"
6767
#include "llvm/IR/Module.h"
68-
#include "llvm/IR/ValueSymbolTable.h"
6968
#include "llvm/IRReader/IRReader.h"
7069
#include "llvm/Option/Option.h"
7170
#include "llvm/Option/OptTable.h"
@@ -373,10 +372,32 @@ static bool emitIndexData(SourceFile *PrimarySourceFile,
373372
const CompilerInvocation &Invocation,
374373
CompilerInstance &Instance);
375374

375+
static void countStatsOfSourceFile(UnifiedStatsReporter &Stats,
376+
CompilerInstance &Instance,
377+
SourceFile *SF) {
378+
auto &C = Stats.getFrontendCounters();
379+
auto &SM = Instance.getSourceMgr();
380+
C.NumDecls += SF->Decls.size();
381+
C.NumLocalTypeDecls += SF->LocalTypeDecls.size();
382+
C.NumObjCMethods += SF->ObjCMethods.size();
383+
C.NumInfixOperators += SF->InfixOperators.size();
384+
C.NumPostfixOperators += SF->PostfixOperators.size();
385+
C.NumPrefixOperators += SF->PrefixOperators.size();
386+
C.NumPrecedenceGroups += SF->PrecedenceGroups.size();
387+
C.NumUsedConformances += SF->getUsedConformances().size();
388+
389+
auto bufID = SF->getBufferID();
390+
if (bufID.hasValue()) {
391+
C.NumSourceLines +=
392+
SM.getEntireTextForBuffer(bufID.getValue()).count('\n');
393+
}
394+
}
395+
376396
static void countStatsPostSema(UnifiedStatsReporter &Stats,
377397
CompilerInstance& Instance) {
378398
auto &C = Stats.getFrontendCounters();
379-
C.NumSourceBuffers = Instance.getSourceMgr().getLLVMSourceMgr().getNumBuffers();
399+
auto &SM = Instance.getSourceMgr();
400+
C.NumSourceBuffers = SM.getLLVMSourceMgr().getNumBuffers();
380401
C.NumLinkLibraries = Instance.getLinkLibraries().size();
381402

382403
auto const &AST = Instance.getASTContext();
@@ -395,32 +416,13 @@ static void countStatsPostSema(UnifiedStatsReporter &Stats,
395416
}
396417

397418
if (auto *SF = Instance.getPrimarySourceFile()) {
398-
C.NumDecls = SF->Decls.size();
399-
C.NumLocalTypeDecls = SF->LocalTypeDecls.size();
400-
C.NumObjCMethods = SF->ObjCMethods.size();
401-
C.NumInfixOperators = SF->InfixOperators.size();
402-
C.NumPostfixOperators = SF->PostfixOperators.size();
403-
C.NumPrefixOperators = SF->PrefixOperators.size();
404-
C.NumPrecedenceGroups = SF->PrecedenceGroups.size();
405-
C.NumUsedConformances = SF->getUsedConformances().size();
406-
}
407-
}
408-
409-
static void countStatsPostIRGen(UnifiedStatsReporter &Stats,
410-
const llvm::Module& Module) {
411-
auto &C = Stats.getFrontendCounters();
412-
// FIXME: calculate these in constant time if possible.
413-
C.NumIRGlobals = Module.getGlobalList().size();
414-
C.NumIRFunctions = Module.getFunctionList().size();
415-
C.NumIRAliases = Module.getAliasList().size();
416-
C.NumIRIFuncs = Module.getIFuncList().size();
417-
C.NumIRNamedMetaData = Module.getNamedMDList().size();
418-
C.NumIRValueSymbols = Module.getValueSymbolTable().size();
419-
C.NumIRComdatSymbols = Module.getComdatSymbolTable().size();
420-
for (auto const &Func : Module) {
421-
for (auto const &BB : Func) {
422-
C.NumIRBasicBlocks++;
423-
C.NumIRInsts += BB.size();
419+
countStatsOfSourceFile(Stats, Instance, SF);
420+
} else if (auto *M = Instance.getMainModule()) {
421+
// No primary source file, but a main module; this is WMO-mode
422+
for (auto *F : M->getFiles()) {
423+
if (auto *SF = dyn_cast<SourceFile>(F)) {
424+
countStatsOfSourceFile(Stats, Instance, SF);
425+
}
424426
}
425427
}
426428
}
@@ -961,10 +963,6 @@ static bool performCompile(CompilerInstance &Instance,
961963
return HadError;
962964
}
963965

964-
if (Stats) {
965-
countStatsPostIRGen(*Stats, *IRModule);
966-
}
967-
968966
bool allSymbols = false;
969967
switch (opts.ValidateTBDAgainstIR) {
970968
case FrontendOptions::TBDValidationMode::None:

lib/IRGen/IRGen.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "llvm/IR/LegacyPassManager.h"
4545
#include "llvm/IR/LLVMContext.h"
4646
#include "llvm/IR/Module.h"
47+
#include "llvm/IR/ValueSymbolTable.h"
4748
#include "llvm/IR/Verifier.h"
4849
#include "llvm/Linker/Linker.h"
4950
#include "llvm/MC/SubtargetFeature.h"
@@ -353,6 +354,25 @@ static bool needsRecompile(StringRef OutputFilename, ArrayRef<uint8_t> HashData,
353354
return true;
354355
}
355356

357+
static void countStatsPostIRGen(UnifiedStatsReporter &Stats,
358+
const llvm::Module& Module) {
359+
auto &C = Stats.getFrontendCounters();
360+
// FIXME: calculate these in constant time if possible.
361+
C.NumIRGlobals += Module.getGlobalList().size();
362+
C.NumIRFunctions += Module.getFunctionList().size();
363+
C.NumIRAliases += Module.getAliasList().size();
364+
C.NumIRIFuncs += Module.getIFuncList().size();
365+
C.NumIRNamedMetaData += Module.getNamedMDList().size();
366+
C.NumIRValueSymbols += Module.getValueSymbolTable().size();
367+
C.NumIRComdatSymbols += Module.getComdatSymbolTable().size();
368+
for (auto const &Func : Module) {
369+
for (auto const &BB : Func) {
370+
C.NumIRBasicBlocks++;
371+
C.NumIRInsts += BB.size();
372+
}
373+
}
374+
}
375+
356376
/// Run the LLVM passes. In multi-threaded compilation this will be done for
357377
/// multiple LLVM modules in parallel.
358378
bool swift::performLLVM(IRGenOptions &Opts, DiagnosticEngine *Diags,
@@ -464,6 +484,14 @@ bool swift::performLLVM(IRGenOptions &Opts, DiagnosticEngine *Diags,
464484
}
465485
}
466486

487+
if (Stats) {
488+
if (DiagMutex)
489+
DiagMutex->lock();
490+
countStatsPostIRGen(*Stats, *Module);
491+
if (DiagMutex)
492+
DiagMutex->unlock();
493+
}
494+
467495
EmitPasses.run(*Module);
468496

469497
if (Stats && RawOS.hasValue()) {
@@ -785,7 +813,7 @@ static std::unique_ptr<llvm::Module> performIRGeneration(IRGenOptions &Opts,
785813
if (performLLVM(Opts, &IGM.Context.Diags, nullptr, IGM.ModuleHash,
786814
IGM.getModule(), IGM.TargetMachine.get(),
787815
IGM.Context.LangOpts.EffectiveLanguageVersion,
788-
IGM.OutputFilename))
816+
IGM.OutputFilename, IGM.Context.Stats))
789817
return nullptr;
790818
}
791819

@@ -805,7 +833,7 @@ static void ThreadEntryPoint(IRGenerator *irgen,
805833
performLLVM(irgen->Opts, &IGM->Context.Diags, DiagMutex, IGM->ModuleHash,
806834
IGM->getModule(), IGM->TargetMachine.get(),
807835
IGM->Context.LangOpts.EffectiveLanguageVersion,
808-
IGM->OutputFilename);
836+
IGM->OutputFilename, IGM->Context.Stats);
809837
if (IGM->Context.Diags.hadAnyError())
810838
return;
811839
}

test/Misc/stats_dir.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
// RUN: %target-swift-frontend -c -o %t/out.o -stats-output-dir %t %s
33
// RUN: %utils/process-stats-dir.py --set-csv-baseline %t/frontend.csv %t
44
// RUN: %FileCheck -input-file %t/frontend.csv %s
5+
// RUN: rm -rf %t && mkdir -p %t
6+
// RUN: %target-swift-frontend -c -wmo -num-threads 4 -o %t/out.o -stats-output-dir %t %s
7+
// RUN: %utils/process-stats-dir.py --set-csv-baseline %t/frontend.csv %t
8+
// RUN: %FileCheck -input-file %t/frontend.csv %s
59
// RUN: echo '9000000000 "LLVM.NumLLVMBytesOutput" 1' >>%t/frontend.csv
610
// RUN: not %utils/process-stats-dir.py --compare-to-csv-baseline %t/frontend.csv %t
711

@@ -11,7 +15,9 @@
1115
// RUN: %FileCheck -input-file %t/driver.csv %s
1216
// RUN: %utils/process-stats-dir.py --compare-to-csv-baseline %t/driver.csv %t
1317

14-
// CHECK: LLVM.NumLLVMBytesOutput
18+
// CHECK: {{"AST.NumSourceLines" [1-9][0-9]*$}}
19+
// CHECK: {{"IRModule.NumIRFunctions" [1-9][0-9]*$}}
20+
// CHECK: {{"LLVM.NumLLVMBytesOutput" [1-9][0-9]*$}}
1521

1622
public func foo() {
1723
print("hello")

0 commit comments

Comments
 (0)