| //===- ActionProfiler.cpp - Profiling Actions *- C++ -*-=====================// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "mlir/Debug/Observers/ActionProfiler.h" |
| #include "mlir/Debug/BreakpointManager.h" |
| #include "mlir/IR/Action.h" |
| #include "llvm/Support/Threading.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <chrono> |
| |
| using namespace mlir; |
| using namespace mlir::tracing; |
| |
| //===----------------------------------------------------------------------===// |
| // ActionProfiler |
| //===----------------------------------------------------------------------===// |
| void ActionProfiler::beforeExecute(const ActionActiveStack *action, |
| Breakpoint *breakpoint, bool willExecute) { |
| print(action, "B"); // begin event. |
| } |
| |
| void ActionProfiler::afterExecute(const ActionActiveStack *action) { |
| print(action, "E"); // end event. |
| } |
| |
| // Print an event in JSON format. |
| void ActionProfiler::print(const ActionActiveStack *action, |
| llvm::StringRef phase) { |
| // Create the event. |
| std::string str; |
| llvm::raw_string_ostream event(str); |
| event << "{"; |
| event << R"("name": ")" << action->getAction().getTag() << "\", "; |
| event << R"("cat": "PERF", )"; |
| event << R"("ph": ")" << phase << "\", "; |
| event << R"("pid": 0, )"; |
| event << R"("tid": )" << llvm::get_threadid() << ", "; |
| auto ts = std::chrono::steady_clock::now() - startTime; |
| event << R"("ts": )" |
| << std::chrono::duration_cast<std::chrono::microseconds>(ts).count(); |
| if (phase == "B") { |
| event << R"(, "args": {)"; |
| event << R"("desc": ")"; |
| action->getAction().print(event); |
| event << "\"}"; |
| } |
| event << "}"; |
| |
| // Print the event. |
| std::lock_guard<std::mutex> guard(mutex); |
| if (printComma) |
| os << ",\n"; |
| printComma = true; |
| os << str; |
| os.flush(); |
| } |