[flang-commits] [flang] [llvm] [flang][flang-rt] Add support for non-standard TIMEF intrinsic (PR #185377)

Eugene Epshteyn via flang-commits flang-commits at lists.llvm.org
Tue Mar 31 06:33:48 PDT 2026


================
@@ -413,6 +416,54 @@ double RTNAME(Dsecnds)(double *refTime, const char *sourceFile, int line) {
 // GNU extension function TIME()
 std::int64_t RTNAME(time)() { return time(nullptr); }
 
+/*
+ * Extension function TIMEF().
+ * By default, it returns number of seconds that have
+ * elapsed since the first time TIMEF was called.
+ * For the first call, it returns 0.
+ *
+ * FLANG_TIMEF_IN_MILLISECONDS=1 sets the resolution to
+ * milliseconds
+ */
+double RTNAME(Timef)() {
+#ifndef _WIN32
+  // posix-compliant
+  static clock_t start = (clock_t)-1;
+  static long ticks_per_sec = 0;
+  struct tms b;
+  clock_t current;
+  double duration;
+  {
+    CriticalSection critical{timef_lock};
+    if (ticks_per_sec <= 0) {
+      ticks_per_sec = sysconf(_SC_CLK_TCK);
+      if (ticks_per_sec <= 0)
+        return 0.0;
+    }
+
+    if (times(&b) == (clock_t)-1) {
+      return 0.0;
+    }
+
+    current = b.tms_utime + b.tms_stime;
+
+    if (start == (clock_t)-1) {
+      start = current;
+      return 0.0;
+    }
+    if (Fortran::runtime::executionEnvironment.timefInMillisec)
+      duration = ((double)(current - start) * 1000) / (double)ticks_per_sec;
+    else
+      duration = (double)(current - start) / (double)ticks_per_sec;
----------------
eugeneepshteyn wrote:

Let's only cast things that are absolutely necessary, and use C++ casts:
```
if (Fortran::runtime::executionEnvironment.timefInMillisec) {
    duration = (static_cast<double>(current - start) * 1000.0) / ticks_per_sec;
} else {
    duration = static_cast<double>(current - start) / ticks_per_sec;
}
```
(Once one operand is a `double`, the other will be promoted to `double`.)

https://github.com/llvm/llvm-project/pull/185377


More information about the flang-commits mailing list