macurtis-amd 310c281b02
[flang][Driver] Preliminary support for -ftime-report (#122894)
The behavior is not entirely consistent with that of clang for the
moment since detailed timing information on the LLVM IR optimization and
code generation passes is not provided. The -ftime-report= option is
also not enabled since that is only relevant for information about the
LLVM IR passes. However, some code to handle that option has been
included, to make it easier to support the option when the issues
blocking it are resolved. A FortranSupport library has been created that
is intended to mirror the LLVM and MLIR support libraries.

Based on @tarunprabhu's PR
https://github.com/llvm/llvm-project/pull/107270 with minor changes
addressing latest review feedback. He's busy and we'd like to get this
support in ASAP.

Co-authored-by: Tarun Prabhu <tarun.prabhu@gmail.com>
2025-01-14 08:02:02 -06:00

68 lines
2.3 KiB
C++

//===- Timing.cpp - Execution time measurement facilities -----------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// Facilities to measure and provide statistics on execution time.
//
//===----------------------------------------------------------------------===//
#include "flang/Support/Timing.h"
#include "llvm/Support/Format.h"
class OutputStrategyText : public mlir::OutputStrategy {
protected:
static constexpr llvm::StringLiteral header = "Flang execution timing report";
public:
OutputStrategyText(llvm::raw_ostream &os) : mlir::OutputStrategy(os) {}
void printHeader(const mlir::TimeRecord &total) override {
// Figure out how many spaces to description name.
unsigned padding = (80 - header.size()) / 2;
os << "===" << std::string(73, '-') << "===\n";
os.indent(padding) << header << '\n';
os << "===" << std::string(73, '-') << "===\n";
// Print the total time followed by the section headers.
os << llvm::format(" Total Execution Time: %.4f seconds\n\n", total.wall);
os << " ----User Time---- ----Wall Time---- ----Name----\n";
}
void printFooter() override { os.flush(); }
void printTime(
const mlir::TimeRecord &time, const mlir::TimeRecord &total) override {
os << llvm::format(
" %8.4f (%5.1f%%)", time.user, 100.0 * time.user / total.user);
os << llvm::format(
" %8.4f (%5.1f%%) ", time.wall, 100.0 * time.wall / total.wall);
}
void printListEntry(llvm::StringRef name, const mlir::TimeRecord &time,
const mlir::TimeRecord &total, bool lastEntry) override {
printTime(time, total);
os << name << "\n";
}
void printTreeEntry(unsigned indent, llvm::StringRef name,
const mlir::TimeRecord &time, const mlir::TimeRecord &total) override {
printTime(time, total);
os.indent(indent) << name << "\n";
}
void printTreeEntryEnd(unsigned indent, bool lastEntry) override {}
};
namespace Fortran::support {
std::unique_ptr<mlir::OutputStrategy> createTimingFormatterText(
llvm::raw_ostream &os) {
return std::make_unique<OutputStrategyText>(os);
}
} // namespace Fortran::support