diff --git a/llvm/lib/Support/Timer.cpp b/llvm/lib/Support/Timer.cpp index 089dae2886f22..eca726828c697 100644 --- a/llvm/lib/Support/Timer.cpp +++ b/llvm/lib/Support/Timer.cpp @@ -284,6 +284,11 @@ TimerGroup::~TimerGroup() { while (FirstTimer) removeTimer(*FirstTimer); + if (!TimersToPrint.empty()) { + std::unique_ptr OutStream = CreateInfoOutputFile(); + PrintQueuedTimers(*OutStream); + } + // Remove the group from the TimerGroupList. sys::SmartScopedLock L(timerLock()); *Prev = Next; @@ -305,14 +310,6 @@ void TimerGroup::removeTimer(Timer &T) { *T.Prev = T.Next; if (T.Next) T.Next->Prev = T.Prev; - - // Print the report when all timers in this group are destroyed if some of - // them were started. - if (FirstTimer || TimersToPrint.empty()) - return; - - std::unique_ptr OutStream = CreateInfoOutputFile(); - PrintQueuedTimers(*OutStream); } void TimerGroup::addTimer(Timer &T) { diff --git a/llvm/unittests/Support/TimerTest.cpp b/llvm/unittests/Support/TimerTest.cpp index 5686b394e16cd..612fd7231da70 100644 --- a/llvm/unittests/Support/TimerTest.cpp +++ b/llvm/unittests/Support/TimerTest.cpp @@ -66,4 +66,20 @@ TEST(Timer, CheckIfTriggered) { EXPECT_FALSE(T1.hasTriggered()); } -} // end anon namespace +TEST(Timer, TimerGroupTimerDestructed) { + testing::internal::CaptureStderr(); + + { + TimerGroup TG("tg", "desc"); + { + Timer T1("T1", "T1", TG); + T1.startTimer(); + T1.stopTimer(); + } + EXPECT_TRUE(testing::internal::GetCapturedStderr().empty()); + testing::internal::CaptureStderr(); + } + EXPECT_FALSE(testing::internal::GetCapturedStderr().empty()); +} + +} // namespace