This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG7e3b9aba609f: [Timer] On macOS count number of executed
instructions (authored by ahoppen, committed by teemperor).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D96049/new/
https://reviews.llvm.org/D96049
Files:
clang-tools-extra/test/clang-tidy/infrastructure/clang-tidy-store-check-profile-one-tu.cpp
llvm/CMakeLists.txt
llvm/include/llvm/Config/config.h.cmake
llvm/include/llvm/Support/Timer.h
llvm/lib/Support/Timer.cpp
Index: llvm/lib/Support/Timer.cpp
===================================================================
--- llvm/lib/Support/Timer.cpp
+++ llvm/lib/Support/Timer.cpp
@@ -13,6 +13,7 @@
#include "llvm/Support/Timer.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringMap.h"
+#include "llvm/Config/config.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Format.h"
@@ -24,6 +25,14 @@
#include "llvm/Support/raw_ostream.h"
#include <limits>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_PROC_PID_RUSAGE
+#include <libproc.h>
+#endif
+
using namespace llvm;
// This ugly hack is brought to you courtesy of constructor/destructor ordering
@@ -120,6 +129,17 @@
return sys::Process::GetMallocUsage();
}
+static uint64_t getCurInstructionsExecuted() {
+#if defined(HAVE_UNISTD_H) && defined(HAVE_PROC_PID_RUSAGE) && \
+ defined(RUSAGE_INFO_V4)
+ struct rusage_info_v4 ru;
+ if (proc_pid_rusage(getpid(), RUSAGE_INFO_V4, (rusage_info_t *)&ru) == 0) {
+ return ru.ri_instructions;
+ }
+#endif
+ return 0;
+}
+
TimeRecord TimeRecord::getCurrentTime(bool Start) {
using Seconds = std::chrono::duration<double, std::ratio<1>>;
TimeRecord Result;
@@ -128,9 +148,11 @@
if (Start) {
Result.MemUsed = getMemUsage();
+ Result.InstructionsExecuted = getCurInstructionsExecuted();
sys::Process::GetTimeUsage(now, user, sys);
} else {
sys::Process::GetTimeUsage(now, user, sys);
+ Result.InstructionsExecuted = getCurInstructionsExecuted();
Result.MemUsed = getMemUsage();
}
@@ -180,6 +202,8 @@
if (Total.getMemUsed())
OS << format("%9" PRId64 " ", (int64_t)getMemUsed());
+ if (Total.getInstructionsExecuted())
+ OS << format("%9" PRId64 " ", (int64_t)getInstructionsExecuted());
}
@@ -339,6 +363,8 @@
OS << " ---Wall Time---";
if (Total.getMemUsed())
OS << " ---Mem---";
+ if (Total.getInstructionsExecuted())
+ OS << " ---Instr---";
OS << " --- Name ---\n";
// Loop through all of the timing data, printing it out.
@@ -433,6 +459,10 @@
OS << delim;
printJSONValue(OS, R, ".mem", T.getMemUsed());
}
+ if (T.getInstructionsExecuted()) {
+ OS << delim;
+ printJSONValue(OS, R, ".instr", T.getInstructionsExecuted());
+ }
}
TimersToPrint.clear();
return delim;
Index: llvm/include/llvm/Support/Timer.h
===================================================================
--- llvm/include/llvm/Support/Timer.h
+++ llvm/include/llvm/Support/Timer.h
@@ -24,12 +24,15 @@
class raw_ostream;
class TimeRecord {
- double WallTime; ///< Wall clock time elapsed in seconds.
- double UserTime; ///< User time elapsed.
- double SystemTime; ///< System time elapsed.
- ssize_t MemUsed; ///< Memory allocated (in bytes).
+ double WallTime; ///< Wall clock time elapsed in seconds.
+ double UserTime; ///< User time elapsed.
+ double SystemTime; ///< System time elapsed.
+ ssize_t MemUsed; ///< Memory allocated (in bytes).
+ uint64_t InstructionsExecuted; ///< Number of instructions executed
public:
- TimeRecord() : WallTime(0), UserTime(0), SystemTime(0), MemUsed(0) {}
+ TimeRecord()
+ : WallTime(0), UserTime(0), SystemTime(0), MemUsed(0),
+ InstructionsExecuted(0) {}
/// Get the current time and memory usage. If Start is true we get the memory
/// usage before the time, otherwise we get time before memory usage. This
@@ -42,6 +45,7 @@
double getSystemTime() const { return SystemTime; }
double getWallTime() const { return WallTime; }
ssize_t getMemUsed() const { return MemUsed; }
+ uint64_t getInstructionsExecuted() const { return InstructionsExecuted; }
bool operator<(const TimeRecord &T) const {
// Sort by Wall Time elapsed, as it is the only thing really accurate
@@ -49,16 +53,18 @@
}
void operator+=(const TimeRecord &RHS) {
- WallTime += RHS.WallTime;
- UserTime += RHS.UserTime;
+ WallTime += RHS.WallTime;
+ UserTime += RHS.UserTime;
SystemTime += RHS.SystemTime;
- MemUsed += RHS.MemUsed;
+ MemUsed += RHS.MemUsed;
+ InstructionsExecuted += RHS.InstructionsExecuted;
}
void operator-=(const TimeRecord &RHS) {
- WallTime -= RHS.WallTime;
- UserTime -= RHS.UserTime;
+ WallTime -= RHS.WallTime;
+ UserTime -= RHS.UserTime;
SystemTime -= RHS.SystemTime;
- MemUsed -= RHS.MemUsed;
+ MemUsed -= RHS.MemUsed;
+ InstructionsExecuted -= RHS.InstructionsExecuted;
}
/// Print the current time record to \p OS, with a breakdown showing
Index: llvm/include/llvm/Config/config.h.cmake
===================================================================
--- llvm/include/llvm/Config/config.h.cmake
+++ llvm/include/llvm/Config/config.h.cmake
@@ -353,4 +353,6 @@
/* Whether Timers signpost passes in Xcode Instruments */
#cmakedefine01 LLVM_SUPPORT_XCODE_SIGNPOSTS
+#cmakedefine HAVE_PROC_PID_RUSAGE 1
+
#endif
Index: llvm/CMakeLists.txt
===================================================================
--- llvm/CMakeLists.txt
+++ llvm/CMakeLists.txt
@@ -649,6 +649,12 @@
endforeach()
endif()
+include(CheckSymbolExists)
+check_symbol_exists(proc_pid_rusage "libproc.h" HAVE_PROC_PID_RUSAGE)
+if(HAVE_PROC_PID_RUSAGE)
+ list(APPEND CMAKE_REQUIRED_LIBRARIES proc)
+endif()
+
# Use libtool instead of ar if you are both on an Apple host, and targeting Apple.
if(CMAKE_HOST_APPLE AND APPLE)
include(UseLibtool)
Index: clang-tools-extra/test/clang-tidy/infrastructure/clang-tidy-store-check-profile-one-tu.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/infrastructure/clang-tidy-store-check-profile-one-tu.cpp
+++ clang-tools-extra/test/clang-tidy/infrastructure/clang-tidy-store-check-profile-one-tu.cpp
@@ -17,8 +17,9 @@
// CHECK-FILE-NEXT:"profile": {
// CHECK-FILE-NEXT: "time.clang-tidy.readability-function-size.wall": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}},
// CHECK-FILE-NEXT: "time.clang-tidy.readability-function-size.user": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}},
-// CHECK-FILE-NEXT: "time.clang-tidy.readability-function-size.sys": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}}
-// CHECK-FILE-NEXT: }
+// CHECK-FILE-NEXT: "time.clang-tidy.readability-function-size.sys": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}}{{,?}}
+// If available on the platform, we also have a "time.clang-tidy.readability-function-size.instr" entry
+// CHECK-FILE: }
// CHECK-FILE-NEXT: }
// CHECK-FILE-NOT: {
@@ -27,7 +28,7 @@
// CHECK-FILE-NOT: "profile": {
// CHECK-FILE-NOT: "time.clang-tidy.readability-function-size.wall": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}},
// CHECK-FILE-NOT: "time.clang-tidy.readability-function-size.user": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}},
-// CHECK-FILE-NOT: "time.clang-tidy.readability-function-size.sys": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}}
+// CHECK-FILE-NOT: "time.clang-tidy.readability-function-size.sys": {{.*}}{{[0-9]}}.{{[0-9]+}}e{{[-+]}}{{[0-9]}}{{[0-9]}}{{,?}}
// CHECK-FILE-NOT: }
// CHECK-FILE-NOT: }
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits