annotate lld/Common/Timer.cpp @ 213:25ca0248ac32

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 11 Jul 2021 17:05:31 +0900
parents 2e18cbf3894f
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- Timer.cpp ----------------------------------------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "lld/Common/Timer.h"
anatofuz
parents:
diff changeset
10 #include "lld/Common/ErrorHandler.h"
anatofuz
parents:
diff changeset
11 #include "llvm/Support/Format.h"
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 using namespace lld;
anatofuz
parents:
diff changeset
14 using namespace llvm;
anatofuz
parents:
diff changeset
15
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 ScopedTimer::ScopedTimer(Timer &t) : t(&t) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
17 startTime = std::chrono::high_resolution_clock::now();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
18 }
150
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 void ScopedTimer::stop() {
anatofuz
parents:
diff changeset
21 if (!t)
anatofuz
parents:
diff changeset
22 return;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
23 t->addToTotal(std::chrono::high_resolution_clock::now() - startTime);
150
anatofuz
parents:
diff changeset
24 t = nullptr;
anatofuz
parents:
diff changeset
25 }
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 ScopedTimer::~ScopedTimer() { stop(); }
anatofuz
parents:
diff changeset
28
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
29 Timer::Timer(llvm::StringRef name) : name(std::string(name)) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 Timer::Timer(llvm::StringRef name, Timer &parent) : name(std::string(name)) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 parent.children.push_back(this);
150
anatofuz
parents:
diff changeset
32 }
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 Timer &Timer::root() {
anatofuz
parents:
diff changeset
35 static Timer rootTimer("Total Link Time");
anatofuz
parents:
diff changeset
36 return rootTimer;
anatofuz
parents:
diff changeset
37 }
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 void Timer::print() {
anatofuz
parents:
diff changeset
40 double totalDuration = static_cast<double>(root().millis());
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 // We want to print the grand total under all the intermediate phases, so we
anatofuz
parents:
diff changeset
43 // print all children first, then print the total under that.
anatofuz
parents:
diff changeset
44 for (const auto &child : children)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
45 if (child->total > 0)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
46 child->print(1, totalDuration);
150
anatofuz
parents:
diff changeset
47
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
48 message(std::string(50, '-'));
150
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 root().print(0, root().millis(), false);
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 double Timer::millis() const {
anatofuz
parents:
diff changeset
54 return std::chrono::duration_cast<std::chrono::duration<double, std::milli>>(
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
55 std::chrono::nanoseconds(total))
150
anatofuz
parents:
diff changeset
56 .count();
anatofuz
parents:
diff changeset
57 }
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 void Timer::print(int depth, double totalDuration, bool recurse) const {
anatofuz
parents:
diff changeset
60 double p = 100.0 * millis() / totalDuration;
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 SmallString<32> str;
anatofuz
parents:
diff changeset
63 llvm::raw_svector_ostream stream(str);
anatofuz
parents:
diff changeset
64 std::string s = std::string(depth * 2, ' ') + name + std::string(":");
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
65 stream << format("%-30s%7d ms (%5.1f%%)", s.c_str(), (int)millis(), p);
150
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 message(str);
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 if (recurse) {
anatofuz
parents:
diff changeset
70 for (const auto &child : children)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
71 if (child->total > 0)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
72 child->print(depth + 1, totalDuration);
150
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74 }