anton-afanasyev created this revision. anton-afanasyev added reviewers: russell.gallop, lebedev.ri, thakis. Herald added subscribers: llvm-commits, cfe-commits, hiraditya. Herald added projects: clang, LLVM.
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 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D63325 Files: clang/lib/CodeGen/CodeGenAction.cpp clang/test/Driver/check-time-trace-blocks.cpp clang/test/Driver/check-time-trace-blocks.py llvm/lib/Support/TimeProfiler.cpp Index: llvm/lib/Support/TimeProfiler.cpp =================================================================== --- llvm/lib/Support/TimeProfiler.cpp +++ llvm/lib/Support/TimeProfiler.cpp @@ -65,7 +65,7 @@ E.Duration = steady_clock::now() - E.Start; // Only include sections longer than TimeTraceGranularity msec. - if (duration_cast<microseconds>(E.Duration).count() > TimeTraceGranularity) + 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 Index: clang/test/Driver/check-time-trace-blocks.py =================================================================== --- /dev/null +++ clang/test/Driver/check-time-trace-blocks.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +import json, sys + +events = json.loads(sys.stdin.read())["traceEvents"] +codegens = filter(lambda x: x["name"] == "CodeGen Function", events) +frontends = filter(lambda x: x["name"] == "Frontend", events) + +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) + +if not all([any([is_inside(codegen, frontend) for frontend in frontends]) + for codegen in codegens]): + sys.exit("Not all CodeGen blocks are inside any of Frontend blocks!") Index: clang/test/Driver/check-time-trace-blocks.cpp =================================================================== --- /dev/null +++ clang/test/Driver/check-time-trace-blocks.cpp @@ -0,0 +1,7 @@ +// REQUIRES: shell +// RUN: %clangxx -S -ftime-trace -mllvm --time-trace-granularity=0 -o %T/check-time-trace-blocks %s +// RUN: cat %T/check-time-trace-blocks.json | %python %s/check-time-trace-blocks.py + +template <typename T> +void foo(T) {} +void bar() { foo(0); } Index: clang/lib/CodeGen/CodeGenAction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenAction.cpp +++ clang/lib/CodeGen/CodeGenAction.cpp @@ -37,6 +37,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" @@ -228,6 +229,7 @@ void HandleTranslationUnit(ASTContext &C) override { { + llvm::TimeTraceScope TimeScope("Frontend", StringRef("")); PrettyStackTraceString CrashInfo("Per-file LLVM IR generation"); if (FrontendTimesIsEnabled) { LLVMIRGenerationRefCount += 1;
Index: llvm/lib/Support/TimeProfiler.cpp =================================================================== --- llvm/lib/Support/TimeProfiler.cpp +++ llvm/lib/Support/TimeProfiler.cpp @@ -65,7 +65,7 @@ E.Duration = steady_clock::now() - E.Start; // Only include sections longer than TimeTraceGranularity msec. - if (duration_cast<microseconds>(E.Duration).count() > TimeTraceGranularity) + 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 Index: clang/test/Driver/check-time-trace-blocks.py =================================================================== --- /dev/null +++ clang/test/Driver/check-time-trace-blocks.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +import json, sys + +events = json.loads(sys.stdin.read())["traceEvents"] +codegens = filter(lambda x: x["name"] == "CodeGen Function", events) +frontends = filter(lambda x: x["name"] == "Frontend", events) + +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) + +if not all([any([is_inside(codegen, frontend) for frontend in frontends]) + for codegen in codegens]): + sys.exit("Not all CodeGen blocks are inside any of Frontend blocks!") Index: clang/test/Driver/check-time-trace-blocks.cpp =================================================================== --- /dev/null +++ clang/test/Driver/check-time-trace-blocks.cpp @@ -0,0 +1,7 @@ +// REQUIRES: shell +// RUN: %clangxx -S -ftime-trace -mllvm --time-trace-granularity=0 -o %T/check-time-trace-blocks %s +// RUN: cat %T/check-time-trace-blocks.json | %python %s/check-time-trace-blocks.py + +template <typename T> +void foo(T) {} +void bar() { foo(0); } Index: clang/lib/CodeGen/CodeGenAction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenAction.cpp +++ clang/lib/CodeGen/CodeGenAction.cpp @@ -37,6 +37,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" @@ -228,6 +229,7 @@ void HandleTranslationUnit(ASTContext &C) override { { + llvm::TimeTraceScope TimeScope("Frontend", StringRef("")); PrettyStackTraceString CrashInfo("Per-file LLVM IR generation"); if (FrontendTimesIsEnabled) { LLVMIRGenerationRefCount += 1;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits