[flang-commits] [clang] [flang] [clang][flang] Support -time in both clang and flang (PR #109165)

Tarun Prabhu via flang-commits flang-commits at lists.llvm.org
Mon Sep 23 08:53:03 PDT 2024


https://github.com/tarunprabhu updated https://github.com/llvm/llvm-project/pull/109165

>From 9bb43511fc688501730eeff0bec882d05d286278 Mon Sep 17 00:00:00 2001
From: Tarun Prabhu <tarun.prabhu at gmail.com>
Date: Wed, 18 Sep 2024 09:49:26 -0600
Subject: [PATCH 1/4] [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 aa3ae92fb6ae78..eecd4ac5d94413 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -5844,6 +5844,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 efe398dd531da7..c8b45e9be5328b 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1289,6 +1289,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 c4ca8b88c4108ea7a3d44796ca75726f2e57d741 Mon Sep 17 00:00:00 2001
From: Tarun Prabhu <tarun.prabhu at gmail.com>
Date: Wed, 18 Sep 2024 13:18:45 -0600
Subject: [PATCH 2/4] 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 5ef29e10735349a284d89d8eb3b6126162f954bf Mon Sep 17 00:00:00 2001
From: Tarun Prabhu <tarun.prabhu at gmail.com>
Date: Mon, 23 Sep 2024 09:49:35 -0600
Subject: [PATCH 3/4] 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 8cd2bc54a77ccc0e276c5e699937cf577b541dfc Mon Sep 17 00:00:00 2001
From: Tarun Prabhu <tarun.prabhu at gmail.com>
Date: Mon, 23 Sep 2024 09:52:51 -0600
Subject: [PATCH 4/4] 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]+)?}}



More information about the flang-commits mailing list