about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--include/klee/Internal/Support/Timer.h8
-rw-r--r--include/klee/Internal/System/Time.h11
-rw-r--r--lib/Core/StatsTracker.cpp24
-rw-r--r--lib/Support/Time.cpp32
-rw-r--r--lib/Support/Timer.cpp16
5 files changed, 91 insertions, 0 deletions
diff --git a/include/klee/Internal/Support/Timer.h b/include/klee/Internal/Support/Timer.h
index a422abd0..d80ccb31 100644
--- a/include/klee/Internal/Support/Timer.h
+++ b/include/klee/Internal/Support/Timer.h
@@ -12,9 +12,17 @@
 
 #include <stdint.h>
 
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+#include <llvm/Support/Chrono.h>
+#endif
+
 namespace klee {
   class WallTimer {
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+    llvm::sys::TimePoint<> start;
+#else
     uint64_t startMicroseconds;
+#endif
     
   public:
     WallTimer();
diff --git a/include/klee/Internal/System/Time.h b/include/klee/Internal/System/Time.h
index 220e260c..12522c86 100644
--- a/include/klee/Internal/System/Time.h
+++ b/include/klee/Internal/System/Time.h
@@ -10,7 +10,13 @@
 #ifndef KLEE_UTIL_TIME_H
 #define KLEE_UTIL_TIME_H
 
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+#include <chrono>
+
+#include "llvm/Support/Chrono.h"
+#else
 #include "llvm/Support/TimeValue.h"
+#endif
 
 namespace klee {
   namespace util {
@@ -22,7 +28,12 @@ namespace klee {
     double getWallTime();
 
     /// Wall time as TimeValue object.
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+    double durationToDouble(std::chrono::nanoseconds dur);
+    llvm::sys::TimePoint<> getWallTimeVal();
+#else
     llvm::sys::TimeValue getWallTimeVal();
+#endif
   }
 }
 
diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp
index 97e7fccb..6ad5b89f 100644
--- a/lib/Core/StatsTracker.cpp
+++ b/lib/Core/StatsTracker.cpp
@@ -285,6 +285,29 @@ void StatsTracker::done() {
 void StatsTracker::stepInstruction(ExecutionState &es) {
   if (OutputIStats) {
     if (TrackInstructionTime) {
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+      static sys::TimePoint<> lastNowTime;
+      static std::chrono::nanoseconds lastUserTime(0);
+
+      if (lastUserTime.count() == 0) {
+        std::chrono::nanoseconds sys;
+        sys::Process::GetTimeUsage(lastNowTime, lastUserTime, sys);
+      } else {
+        sys::TimePoint<> now;
+        std::chrono::nanoseconds user, sys;
+
+        sys::Process::GetTimeUsage(now, user, sys);
+
+        auto delta =
+          std::chrono::duration_cast<std::chrono::microseconds>(user - lastUserTime);
+        auto deltaNow =
+          std::chrono::duration_cast<std::chrono::microseconds>(now - lastNowTime);
+        stats::instructionTime += delta.count();
+        stats::instructionRealTime += deltaNow.count();
+        lastUserTime = user;
+        lastNowTime = now;
+      }
+#else
       static sys::TimeValue lastNowTime(0,0),lastUserTime(0,0);
     
       if (lastUserTime.seconds()==0 && lastUserTime.nanoseconds()==0) {
@@ -300,6 +323,7 @@ void StatsTracker::stepInstruction(ExecutionState &es) {
         lastUserTime = user;
         lastNowTime = now;
       }
+#endif
     }
 
     Instruction *inst = es.pc->inst;
diff --git a/lib/Support/Time.cpp b/lib/Support/Time.cpp
index be5eaf18..f508e6fa 100644
--- a/lib/Support/Time.cpp
+++ b/lib/Support/Time.cpp
@@ -10,12 +10,43 @@
 #include "klee/Config/Version.h"
 #include "klee/Internal/System/Time.h"
 
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+#include <chrono>
+
+#include <llvm/Support/Chrono.h>
+#else
 #include "llvm/Support/TimeValue.h"
+#endif
+
 #include "llvm/Support/Process.h"
 
 using namespace llvm;
 using namespace klee;
 
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+double util::durationToDouble(std::chrono::nanoseconds dur)
+{
+  return dur.count() / 1e9;
+}
+
+double util::getUserTime() {
+  sys::TimePoint<> now;
+  std::chrono::nanoseconds user, sys;
+
+  sys::Process::GetTimeUsage(now, user, sys);
+
+  return durationToDouble(user);
+}
+
+double util::getWallTime() {
+  return durationToDouble(getWallTimeVal().time_since_epoch());
+}
+
+sys::TimePoint<> util::getWallTimeVal() {
+  return std::chrono::system_clock::now();
+}
+
+#else
 double util::getUserTime() {
   sys::TimeValue now(0,0),user(0,0),sys(0,0);
   sys::Process::GetTimeUsage(now,user,sys);
@@ -30,3 +61,4 @@ double util::getWallTime() {
 sys::TimeValue util::getWallTimeVal() {
   return sys::TimeValue::now();
 }
+#endif
diff --git a/lib/Support/Timer.cpp b/lib/Support/Timer.cpp
index da969810..0e727bb4 100644
--- a/lib/Support/Timer.cpp
+++ b/lib/Support/Timer.cpp
@@ -15,6 +15,20 @@
 using namespace klee;
 using namespace llvm;
 
+#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0)
+
+WallTimer::WallTimer() {
+  start = util::getWallTimeVal();
+}
+
+uint64_t WallTimer::check() {
+  auto now = util::getWallTimeVal();
+  return std::chrono::duration_cast<std::chrono::microseconds>(now -
+    start).count();
+}
+
+#else
+
 WallTimer::WallTimer() {
   startMicroseconds = util::getWallTimeVal().usec();
 }
@@ -22,3 +36,5 @@ WallTimer::WallTimer() {
 uint64_t WallTimer::check() {
   return util::getWallTimeVal().usec() - startMicroseconds;
 }
+
+#endif