forked from OSchip/llvm-project
[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:
parent
2e8b57558d
commit
3f3a2573c3
|
@ -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;
|
||||
|
|
|
@ -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); }
|
|
@ -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!")
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue