From 45ec4161781755dedc926341f98da2b8fa33695a Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 22 Apr 2014 08:46:36 +0200 Subject: Fix handling of memory usage in KLEE. Memory usage API in LLVM since 3.3 is not working the way it is intended by KLEE. This ports the pre 3.3. version to KLEE. Fixes the malloc test case. --- lib/Core/Executor.cpp | 7 ++----- lib/Support/MemoryUsage.cpp | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 lib/Support/MemoryUsage.cpp (limited to 'lib') diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 070f825e..c0baa88c 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -47,6 +47,7 @@ #include "klee/Internal/Module/KModule.h" #include "klee/Internal/Support/FloatEvaluation.h" #include "klee/Internal/System/Time.h" +#include "klee/Internal/System/MemoryUsage.h" #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 3) #include "llvm/IR/Function.h" @@ -2584,11 +2585,7 @@ void Executor::run(ExecutionState &initialState) { // We need to avoid calling GetMallocUsage() often because it // is O(elts on freelist). This is really bad since we start // to pummel the freelist once we hit the memory cap. -#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 3) - unsigned mbs = sys::Process::GetMallocUsage() >> 20; -#else - unsigned mbs = sys::Process::GetTotalMemoryUsage() >> 20; -#endif + unsigned mbs = util::GetTotalMemoryUsage() >> 20; if (mbs > MaxMemory) { if (mbs > MaxMemory + 100) { // just guess at how many to kill diff --git a/lib/Support/MemoryUsage.cpp b/lib/Support/MemoryUsage.cpp new file mode 100644 index 00000000..1bdff819 --- /dev/null +++ b/lib/Support/MemoryUsage.cpp @@ -0,0 +1,19 @@ +//===-- MemoryUsage.cpp ---------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/Internal/System/MemoryUsage.h" +#include + +using namespace klee; + +size_t util::GetTotalMemoryUsage() { + // This is linux platform specific + struct mallinfo mi = ::mallinfo(); + return mi.uordblks + mi.hblkhd; +} -- cgit 1.4.1 From e2799703b08cc1feb8a324bfb04edfeb2c296e57 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Thu, 24 Apr 2014 11:32:54 +0100 Subject: Modify klee::util::GetTotalMemoryUsage() so that if the system is not using glibc the malloc usage if computed differently. --- lib/Support/MemoryUsage.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/Support/MemoryUsage.cpp b/lib/Support/MemoryUsage.cpp index 1bdff819..94cee79e 100644 --- a/lib/Support/MemoryUsage.cpp +++ b/lib/Support/MemoryUsage.cpp @@ -13,7 +13,13 @@ using namespace klee; size_t util::GetTotalMemoryUsage() { - // This is linux platform specific struct mallinfo mi = ::mallinfo(); + // The malloc implementation in glibc (pmalloc2) + // does not include mmap()'ed memory in mi.uordblks + // but other implementations (e.g. tcmalloc) do. +#if defined(__GLIBC__) return mi.uordblks + mi.hblkhd; +#else + return mi.uordblks; +#endif } -- cgit 1.4.1 From 016120fd8a8a2cac8457b66b6d2a41e0b5093889 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 24 Apr 2014 13:58:03 +0200 Subject: Renamed GetTotalMemoryUsage to GetTotalMallocUsage --- include/klee/Internal/System/MemoryUsage.h | 2 +- lib/Core/Executor.cpp | 2 +- lib/Support/MemoryUsage.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/include/klee/Internal/System/MemoryUsage.h b/include/klee/Internal/System/MemoryUsage.h index 37c838fc..e8e5d769 100644 --- a/include/klee/Internal/System/MemoryUsage.h +++ b/include/klee/Internal/System/MemoryUsage.h @@ -14,7 +14,7 @@ namespace klee { namespace util { - size_t GetTotalMemoryUsage(); + size_t GetTotalMallocUsage(); } } diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index c0baa88c..abb023eb 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -2585,7 +2585,7 @@ void Executor::run(ExecutionState &initialState) { // We need to avoid calling GetMallocUsage() often because it // is O(elts on freelist). This is really bad since we start // to pummel the freelist once we hit the memory cap. - unsigned mbs = util::GetTotalMemoryUsage() >> 20; + unsigned mbs = util::GetTotalMallocUsage() >> 20; if (mbs > MaxMemory) { if (mbs > MaxMemory + 100) { // just guess at how many to kill diff --git a/lib/Support/MemoryUsage.cpp b/lib/Support/MemoryUsage.cpp index 94cee79e..676ce307 100644 --- a/lib/Support/MemoryUsage.cpp +++ b/lib/Support/MemoryUsage.cpp @@ -12,7 +12,7 @@ using namespace klee; -size_t util::GetTotalMemoryUsage() { +size_t util::GetTotalMallocUsage() { struct mallinfo mi = ::mallinfo(); // The malloc implementation in glibc (pmalloc2) // does not include mmap()'ed memory in mi.uordblks -- cgit 1.4.1