From b2659ec04a9814718736ad960635a9a28edd6078 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Wed, 7 Jun 2017 13:36:28 +0200 Subject: llvm4: use chrono helpers from LLVM LLVM 4 removes the old time interface and starts using the C++11's chrono. So switch to that in klee for LLVM 4 too. Signed-off-by: Jiri Slaby --- include/klee/Internal/Support/Timer.h | 8 ++++++++ include/klee/Internal/System/Time.h | 11 +++++++++++ lib/Core/StatsTracker.cpp | 24 ++++++++++++++++++++++++ lib/Support/Time.cpp | 32 ++++++++++++++++++++++++++++++++ lib/Support/Timer.cpp | 16 ++++++++++++++++ 5 files changed, 91 insertions(+) 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 +#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0) +#include +#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 + +#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(user - lastUserTime); + auto deltaNow = + std::chrono::duration_cast(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 + +#include +#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(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 -- cgit 1.4.1