summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-22 16:49:22 -0700
committerGabe Black <gabeblack@google.com>2018-08-24 18:15:09 +0000
commita3385dadcb0ffb53da32d2690c0ea8157e2419bd (patch)
tree9af7ab099183937a851be9124961e4c26f5e7374
parentf741bb7cdbdd6c2526be40fe1e03a705364ddf8d (diff)
downloadgem5-a3385dadcb0ffb53da32d2690c0ea8157e2419bd.tar.xz
base: If valgrind is available, tell it about Fiber stacks.
Valgrind can get confused when switching stacks between different Fibers. If valgrind (and its headers) are available, this change adds calls to some hooks so valgrind knows where the new stacks are and doesn't report a bunch of false positives. Change-Id: I00aefe60372be6de7371dec29427d7182dbee7b6 Reviewed-on: https://gem5-review.googlesource.com/12227 Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br> Maintainer: Gabe Black <gabeblack@google.com>
-rwxr-xr-xSConstruct8
-rw-r--r--src/base/fiber.cc13
-rw-r--r--src/base/fiber.hh5
3 files changed, 23 insertions, 3 deletions
diff --git a/SConstruct b/SConstruct
index 5209aa6d4..79522e46f 100755
--- a/SConstruct
+++ b/SConstruct
@@ -783,6 +783,10 @@ main['HAVE_PROTOBUF'] = main['PROTOC'] and \
conf.CheckLibWithHeader('protobuf', 'google/protobuf/message.h',
'C++', 'GOOGLE_PROTOBUF_VERIFY_VERSION;')
+# Valgrind gets much less confused if you tell it when you're using
+# alternative stacks.
+main['HAVE_VALGRIND'] = conf.CheckCHeader('valgrind/valgrind.h')
+
# If we have the compiler but not the library, print another warning.
if main['PROTOC'] and not main['HAVE_PROTOBUF']:
print(termcap.Yellow + termcap.Bold +
@@ -1012,8 +1016,8 @@ sticky_vars.AddVariables(
# These variables get exported to #defines in config/*.hh (see src/SConscript).
export_vars += ['USE_FENV', 'SS_COMPATIBLE_FP', 'TARGET_ISA', 'TARGET_GPU_ISA',
'CP_ANNOTATE', 'USE_POSIX_CLOCK', 'USE_KVM', 'USE_TUNTAP',
- 'PROTOCOL', 'HAVE_PROTOBUF', 'HAVE_PERF_ATTR_EXCLUDE_HOST',
- 'USE_PNG']
+ 'PROTOCOL', 'HAVE_PROTOBUF', 'HAVE_VALGRIND',
+ 'HAVE_PERF_ATTR_EXCLUDE_HOST', 'USE_PNG']
###################################################
#
diff --git a/src/base/fiber.cc b/src/base/fiber.cc
index f10f1fbfd..eac1d9394 100644
--- a/src/base/fiber.cc
+++ b/src/base/fiber.cc
@@ -29,6 +29,10 @@
#include "base/fiber.hh"
+#if HAVE_VALGRIND
+#include <valgrind/valgrind.h>
+#endif
+
#include <cerrno>
#include <cstring>
@@ -71,7 +75,11 @@ Fiber::Fiber(size_t stack_size) :
link(primaryFiber()),
stack(stack_size ? new uint8_t[stack_size] : nullptr),
stackSize(stack_size), started(false), _finished(false)
-{}
+{
+#if HAVE_VALGRIND
+ valgrindStackId = VALGRIND_STACK_REGISTER(stack, stack + stack_size);
+#endif
+}
Fiber::Fiber(Fiber *link, size_t stack_size) :
link(link), stack(stack_size ? new uint8_t[stack_size] : nullptr),
@@ -81,6 +89,9 @@ Fiber::Fiber(Fiber *link, size_t stack_size) :
Fiber::~Fiber()
{
panic_if(stack && _currentFiber == this, "Fiber stack is in use.");
+#if HAVE_VALGRIND
+ VALGRIND_STACK_DEREGISTER(valgrindStackId);
+#endif
delete [] stack;
}
diff --git a/src/base/fiber.hh b/src/base/fiber.hh
index 5f7285b29..3d82075f0 100644
--- a/src/base/fiber.hh
+++ b/src/base/fiber.hh
@@ -44,6 +44,8 @@
#include <cstddef>
#include <cstdint>
+#include "config/have_valgrind.hh"
+
/**
* This class represents a fiber, which is a light weight sort of thread which
* is cooperatively scheduled and runs sequentially with other fibers, swapping
@@ -106,6 +108,9 @@ class Fiber
// The stack for this context, or a nullptr if allocated elsewhere.
uint8_t *stack;
size_t stackSize;
+#if HAVE_VALGRIND
+ unsigned valgrindStackId;
+#endif
bool started;
bool _finished;