| //===- ActionLogging.cpp - Logging 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/ActionLogging.h" | |
| #include "mlir/Debug/BreakpointManager.h" | |
| #include "mlir/IR/Action.h" | |
| #include "llvm/Support/InterleavedRange.h" | |
| #include "llvm/Support/Threading.h" | |
| #include "llvm/Support/raw_ostream.h" | |
| using namespace mlir; | |
| using namespace mlir::tracing; | |
| //===----------------------------------------------------------------------===// | |
| // ActionLogger | |
| //===----------------------------------------------------------------------===// | |
| bool ActionLogger::shouldLog(const ActionActiveStack *action) { | |
| // If some condition was set, we ensured it is met before logging. | |
| if (breakpointManagers.empty()) | |
| return true; | |
| return llvm::any_of(breakpointManagers, | |
| [&](const BreakpointManager *manager) { | |
| return manager->match(action->getAction()); | |
| }); | |
| } | |
| void ActionLogger::beforeExecute(const ActionActiveStack *action, | |
| Breakpoint *breakpoint, bool willExecute) { | |
| if (!shouldLog(action)) | |
| return; | |
| SmallVector<char> name; | |
| llvm::get_thread_name(name); | |
| if (name.empty()) { | |
| llvm::raw_svector_ostream os(name); | |
| os << llvm::get_threadid(); | |
| } | |
| os << "[thread " << name << "] "; | |
| if (willExecute) | |
| os << "begins "; | |
| else | |
| os << "skipping "; | |
| if (printBreakpoints) { | |
| if (breakpoint) | |
| os << "(on breakpoint: " << *breakpoint << ") "; | |
| else | |
| os << "(no breakpoint) "; | |
| } | |
| os << "Action "; | |
| if (printActions) | |
| action->getAction().print(os); | |
| else | |
| os << action->getAction().getTag(); | |
| if (printIRUnits) | |
| os << " (" << llvm::interleaved(action->getAction().getContextIRUnits()) | |
| << ")"; | |
| os << "`\n"; | |
| } | |
| void ActionLogger::afterExecute(const ActionActiveStack *action) { | |
| if (!shouldLog(action)) | |
| return; | |
| SmallVector<char> name; | |
| llvm::get_thread_name(name); | |
| if (name.empty()) { | |
| llvm::raw_svector_ostream os(name); | |
| os << llvm::get_threadid(); | |
| } | |
| os << "[thread " << name << "] completed `" << action->getAction().getTag() | |
| << "`\n"; | |
| } |