https://github.com/tarunprabhu updated https://github.com/llvm/llvm-project/pull/109165
>From 3b926fce8dbf42577adf54e80d3383a85b170e91 Mon Sep 17 00:00:00 2001 From: Tarun Prabhu <tarun.pra...@gmail.com> Date: Wed, 18 Sep 2024 09:49:26 -0600 Subject: [PATCH 1/6] [clang][flang] Support -time in both clang and flang The -time option prints timing information for the subcommands (compiler, linker) in a format similar to that used by gcc/gfortran (we use more digits of precision). This partially addresses requests from #89888 --- clang/include/clang/Driver/Options.td | 1 + clang/lib/Driver/Compilation.cpp | 21 +++++++++++++++++++++ clang/lib/Driver/Driver.cpp | 3 +++ clang/test/Driver/time.c | 24 ++++++++++++++++++++++++ flang/test/Driver/time.f90 | 22 ++++++++++++++++++++++ 5 files changed, 71 insertions(+) create mode 100644 clang/test/Driver/time.c create mode 100644 flang/test/Driver/time.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d306c751505e98..f7cce59105e17a 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5865,6 +5865,7 @@ def print_enabled_extensions : Flag<["-", "--"], "print-enabled-extensions">, def : Flag<["-"], "mcpu=help">, Alias<print_supported_cpus>; def : Flag<["-"], "mtune=help">, Alias<print_supported_cpus>; def time : Flag<["-"], "time">, + Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, HelpText<"Time individual commands">; def traditional_cpp : Flag<["-", "--"], "traditional-cpp">, Visibility<[ClangOption, CC1Option]>, diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index ad077d5bbfa69a..aadaa236246a27 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -21,6 +21,9 @@ #include "llvm/Option/OptSpecifier.h" #include "llvm/Option/Option.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/Format.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" #include <cassert> @@ -194,11 +197,29 @@ int Compilation::ExecuteCommand(const Command &C, if (LogOnly) return 0; + // We don't use any timers or llvm::TimeGroup's because those are tied into + // the global static timer list which, in principle, could be cleared without + // us knowing about it. + llvm::TimeRecord StartTime; + if (getArgs().hasArg(options::OPT_time)) { + StartTime = llvm::TimeRecord::getCurrentTime(true); + } + std::string Error; bool ExecutionFailed; int Res = C.Execute(Redirects, &Error, &ExecutionFailed); if (PostCallback) PostCallback(C, Res); + + if (getArgs().hasArg(options::OPT_time)) { + llvm::TimeRecord Time = llvm::TimeRecord::getCurrentTime(false); + Time -= StartTime; + llvm::StringRef Name = llvm::sys::path::filename(C.getExecutable()); + llvm::errs() << "# " << Name << " " + << llvm::format("%0.5f", Time.getUserTime()) << " " + << llvm::format("%0.5f", Time.getSystemTime()) << "\n"; + } + if (!Error.empty()) { assert(Res && "Error string set with 0 result code!"); getDriver().Diag(diag::err_drv_command_failure) << Error; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 9878a9dad78d40..15ae86bc479010 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1318,6 +1318,9 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { // Ignore -pipe. Args.ClaimAllArgs(options::OPT_pipe); + // Ignore -time. + Args.ClaimAllArgs(options::OPT_time); + // Extract -ccc args. // // FIXME: We need to figure out where this behavior should live. Most of it diff --git a/clang/test/Driver/time.c b/clang/test/Driver/time.c new file mode 100644 index 00000000000000..1e19f29ab76a32 --- /dev/null +++ b/clang/test/Driver/time.c @@ -0,0 +1,24 @@ +// The -time option prints timing information for the various subcommands in a +// format similar to that used by gcc. When compiling and linking, this will +// include the time to call clang-${LLVM_VERSION_MAJOR} and the linker. Since +// the name of the linker could vary across platforms, and name of the compiler +// could be something different, just check that whatever is printed to stderr +// looks like timing information. + +// RUN: %clang -time -c -O3 -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=COMPILE-ONLY +// RUN: %clang -time -S -emit-llvm -O3 -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=COMPILE-ONLY +// RUN: %clang -time -S -O3 -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=COMPILE-ONLY +// RUN: %clang -time -O3 -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=COMPILE-AND-LINK + +// COMPILE-ONLY: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} + +// COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} +// COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} + +int main() { + return 0; +} diff --git a/flang/test/Driver/time.f90 b/flang/test/Driver/time.f90 new file mode 100644 index 00000000000000..dda86e08960135 --- /dev/null +++ b/flang/test/Driver/time.f90 @@ -0,0 +1,22 @@ +! The -time option prints timing information for the various subcommands in a +! format similar to that used by gfortran. When compiling and linking, this will +! include the time to call flang-${LLVM_VERSION_MAJOR} and the linker. Since the +! name of the linker could vary across platforms, and the flang name could also +! potentially be something different, just check that whatever is printed to +! stderr looks like timing information. + +! RUN: %flang -time -c -O3 -o /dev/null %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY +! RUN: %flang -time -S -emit-llvm -O3 -o /dev/null %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY +! RUN: %flang -time -S -O3 -o /dev/null %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY +! RUN: %flang -time -O3 -o /dev/null %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=COMPILE-AND-LINK + +! COMPILE-ONLY: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} + +! COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} +! COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} + +end program >From 968eff4ca2286c8e8f2cda72ab2ad7555dd13e1d Mon Sep 17 00:00:00 2001 From: Tarun Prabhu <tarun.pra...@gmail.com> Date: Wed, 18 Sep 2024 13:18:45 -0600 Subject: [PATCH 2/6] Disable the Fortran test on Windows because it does not produce any output causing the test to fail. --- flang/test/Driver/time.f90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flang/test/Driver/time.f90 b/flang/test/Driver/time.f90 index dda86e08960135..e39d1f28af74d2 100644 --- a/flang/test/Driver/time.f90 +++ b/flang/test/Driver/time.f90 @@ -1,3 +1,9 @@ +! TODO: For some reason, on Windows, nothing is printed to stderr which causes +! the checks to fail. It is not clear why this is, so disable this on Windows +! until the root cause can be determined. +! +! UNSUPPORTED: system-windows + ! The -time option prints timing information for the various subcommands in a ! format similar to that used by gfortran. When compiling and linking, this will ! include the time to call flang-${LLVM_VERSION_MAJOR} and the linker. Since the >From c49c8e71c0c9da899dfe0e7d9e8abee3ea771e3f Mon Sep 17 00:00:00 2001 From: Tarun Prabhu <tarun.pra...@gmail.com> Date: Mon, 23 Sep 2024 09:49:35 -0600 Subject: [PATCH 3/6] Address reviewer comments. Remove unnecessary -O3 flag in test run lines. Improve checks to handle corner case. --- clang/test/Driver/time.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/clang/test/Driver/time.c b/clang/test/Driver/time.c index 1e19f29ab76a32..814c4ecc742ac6 100644 --- a/clang/test/Driver/time.c +++ b/clang/test/Driver/time.c @@ -5,16 +5,17 @@ // could be something different, just check that whatever is printed to stderr // looks like timing information. -// RUN: %clang -time -c -O3 -o /dev/null %s 2>&1 \ +// RUN: %clang -time -c -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -// RUN: %clang -time -S -emit-llvm -O3 -o /dev/null %s 2>&1 \ +// RUN: %clang -time -S -emit-llvm -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -// RUN: %clang -time -S -O3 -o /dev/null %s 2>&1 \ +// RUN: %clang -time -S -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -// RUN: %clang -time -O3 -o /dev/null %s 2>&1 \ +// RUN: %clang -time -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-AND-LINK // COMPILE-ONLY: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} +// COMPILE-ONLY-NOT: {{.}} // COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} // COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} >From b5361efce21598c52294b790052cbbd274a5d99f Mon Sep 17 00:00:00 2001 From: Tarun Prabhu <tarun.pra...@gmail.com> Date: Mon, 23 Sep 2024 09:52:51 -0600 Subject: [PATCH 4/6] Address reviewer comments. Same fixes to Fortran. --- flang/test/Driver/time.f90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flang/test/Driver/time.f90 b/flang/test/Driver/time.f90 index e39d1f28af74d2..cb94a5333f6e33 100644 --- a/flang/test/Driver/time.f90 +++ b/flang/test/Driver/time.f90 @@ -11,16 +11,17 @@ ! potentially be something different, just check that whatever is printed to ! stderr looks like timing information. -! RUN: %flang -time -c -O3 -o /dev/null %s 2>&1 \ +! RUN: %flang -time -c -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY ! RUN: %flang -time -S -emit-llvm -O3 -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -! RUN: %flang -time -S -O3 -o /dev/null %s 2>&1 \ +! RUN: %flang -time -S -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -! RUN: %flang -time -O3 -o /dev/null %s 2>&1 \ +! RUN: %flang -time -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-AND-LINK ! COMPILE-ONLY: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} +! COMPILE-ONLY-NOT: {{.}} ! COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} ! COMPILE-AND-LINK: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} >From dfeabb74c128674071e320e45dbf932da0ba4d9f Mon Sep 17 00:00:00 2001 From: Tarun Prabhu <ta...@lanl.gov> Date: Fri, 11 Oct 2024 08:50:54 -0600 Subject: [PATCH 5/6] Add explicit target triple and enable the tests only on Linux on x86_64. Add a comment to the tests explaining the reason for this restriction. --- clang/test/Driver/time.c | 16 ++++++++++++---- flang/test/Driver/time.f90 | 15 +++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/clang/test/Driver/time.c b/clang/test/Driver/time.c index 814c4ecc742ac6..a9a95b073afb73 100644 --- a/clang/test/Driver/time.c +++ b/clang/test/Driver/time.c @@ -5,13 +5,21 @@ // could be something different, just check that whatever is printed to stderr // looks like timing information. -// RUN: %clang -time -c -o /dev/null %s 2>&1 \ +// Ideally, this should be tested on various platforms, but that requires the +// the full toolchain, including a linker to be present. The initial author of +// the test only had access to Linux on x86 which is why this is only enabled +// there. More platforms ought to be added if possible. + +// REQUIRES: x86-registered-target +// REQUIRES: x86_64-linux + +// RUN: %clang --target=x86_64-pc-linux -time -c -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -// RUN: %clang -time -S -emit-llvm -o /dev/null %s 2>&1 \ +// RUN: %clang --target=x86_64-pc-linux -time -S -emit-llvm -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -// RUN: %clang -time -S -o /dev/null %s 2>&1 \ +// RUN: %clang --target=x86_64-pc-linux -time -S -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -// RUN: %clang -time -o /dev/null %s 2>&1 \ +// RUN: %clang --target=x86_64-pc-linux -time -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=COMPILE-AND-LINK // COMPILE-ONLY: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} diff --git a/flang/test/Driver/time.f90 b/flang/test/Driver/time.f90 index cb94a5333f6e33..98d4fac4e805e9 100644 --- a/flang/test/Driver/time.f90 +++ b/flang/test/Driver/time.f90 @@ -11,13 +11,20 @@ ! potentially be something different, just check that whatever is printed to ! stderr looks like timing information. -! RUN: %flang -time -c -o /dev/null %s 2>&1 \ +! Ideally, this should be tested on various platforms, but that requires the +! the full toolchain, including a linker to be present. The initial author of +! the test only had access to Linux on x86 which is why this is only enabled +! there. More platforms ought to be added if possible. + +! REQUIRES: x86_64-linux + +! RUN: %flang --target=x86_64-linux -time -c -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -! RUN: %flang -time -S -emit-llvm -O3 -o /dev/null %s 2>&1 \ +! RUN: %flang --target=x86_64-linux -time -S -emit-llvm -O3 -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -! RUN: %flang -time -S -o /dev/null %s 2>&1 \ +! RUN: %flang --target=x86_64-linux -time -S -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-ONLY -! RUN: %flang -time -o /dev/null %s 2>&1 \ +! RUN: %flang --target=x86_64-linux -time -o /dev/null %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=COMPILE-AND-LINK ! COMPILE-ONLY: # {{.+}} {{[0-9]+(.[0-9]+)?}} {{[0-9]+(.[0-9]+)?}} >From 70245213a9757c39fc81be94618eafa467ee294d Mon Sep 17 00:00:00 2001 From: Tarun Prabhu <ta...@lanl.gov> Date: Mon, 14 Oct 2024 14:26:41 -0600 Subject: [PATCH 6/6] Address reviewer comments. --- clang/lib/Driver/Compilation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index aadaa236246a27..43124a6c997e31 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -202,7 +202,7 @@ int Compilation::ExecuteCommand(const Command &C, // us knowing about it. llvm::TimeRecord StartTime; if (getArgs().hasArg(options::OPT_time)) { - StartTime = llvm::TimeRecord::getCurrentTime(true); + StartTime = llvm::TimeRecord::getCurrentTime(/*Start=*/true); } std::string Error; @@ -212,7 +212,7 @@ int Compilation::ExecuteCommand(const Command &C, PostCallback(C, Res); if (getArgs().hasArg(options::OPT_time)) { - llvm::TimeRecord Time = llvm::TimeRecord::getCurrentTime(false); + llvm::TimeRecord Time = llvm::TimeRecord::getCurrentTime(/*Start=*/false); Time -= StartTime; llvm::StringRef Name = llvm::sys::path::filename(C.getExecutable()); llvm::errs() << "# " << Name << " " _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits