[Support][Time profiler] Make FE codegen blocks to be inside frontend blocks

Summary:
Add `Frontend` time trace entry to `HandleTranslationUnit()` function.
Add test to check all codegen blocks are inside frontend blocks.
Also, change `--time-trace-granularity` option a bit to make sure very small
time blocks are outputed to json-file when using `--time-trace-granularity=0`.

This fixes http://llvm.org/pr41969

Reviewers: russell.gallop, lebedev.ri, thakis

Reviewed By: russell.gallop

Subscribers: vsapsai, aras-p, lebedev.ri, hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D63325

llvm-svn: 369308
This commit is contained in:
Anton Afanasyev 2019-08-19 22:58:26 +00:00
parent 2e8b57558d
commit 3f3a2573c3
4 changed files with 36 additions and 2 deletions

View File

@ -38,6 +38,7 @@
#include "llvm/Pass.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/YAMLTraits.h"
@ -229,6 +230,7 @@ namespace clang {
void HandleTranslationUnit(ASTContext &C) override {
{
llvm::TimeTraceScope TimeScope("Frontend", StringRef(""));
PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
if (FrontendTimesIsEnabled) {
LLVMIRGenerationRefCount += 1;

View File

@ -0,0 +1,7 @@
// REQUIRES: shell
// RUN: %clangxx -S -ftime-trace -ftime-trace-granularity=0 -o %T/check-time-trace-sections %s
// RUN: cat %T/check-time-trace-sections.json | %python %S/check-time-trace-sections.py
template <typename T>
void foo(T) {}
void bar() { foo(0); }

View File

@ -0,0 +1,25 @@
#!/usr/bin/env python
import json, sys
def is_inside(range1, range2):
a = range1["ts"]; b = a + range1["dur"]
c = range2["ts"]; d = c + range2["dur"]
return (a >= c and a <= d) and (b >= c and b <= d)
def is_before(range1, range2):
b = range1["ts"] + range1["dur"]; c = range2["ts"]
return b <= c
events = json.loads(sys.stdin.read())["traceEvents"]
codegens = filter(lambda x: x["name"] == "CodeGen Function", events)
frontends = filter(lambda x: x["name"] == "Frontend", events)
backends = filter(lambda x: x["name"] == "Backend", events)
if not all([any([is_inside(codegen, frontend) for frontend in frontends])
for codegen in codegens]):
sys.exit("Not all CodeGen sections are inside any Frontend section!")
if not all([all([is_before(frontend, backend) for frontend in frontends])
for backend in backends]):
sys.exit("Not all Frontend section are before all Backend sections!")

View File

@ -58,8 +58,8 @@ struct TimeTraceProfiler {
auto &E = Stack.back();
E.Duration = steady_clock::now() - E.Start;
// Only include sections longer than TimeTraceGranularity msec.
if (duration_cast<microseconds>(E.Duration).count() > TimeTraceGranularity)
// Only include sections longer or equal to TimeTraceGranularity msec.
if (duration_cast<microseconds>(E.Duration).count() >= TimeTraceGranularity)
Entries.emplace_back(E);
// Track total time taken by each "name", but only the topmost levels of