+#if HAVE_VALGRIND_MEMCHECK_H
+#include <valgrind/memcheck.h>
+static void vg_register_stack(struct coroutine_stack *stack)
+{
+ char *base = coroutine_stack_base(stack);
+
+ VALGRIND_MAKE_MEM_UNDEFINED(base, stack->size);
+ stack->valgrind_id = VALGRIND_STACK_REGISTER(base,
+ base + stack->size - 1);
+}
+
+static void vg_deregister_stack(struct coroutine_stack *stack)
+{
+ VALGRIND_MAKE_MEM_UNDEFINED(coroutine_stack_base(stack), stack->size);
+ VALGRIND_STACK_DEREGISTER(stack->valgrind_id);
+}
+static bool vg_addressable(void *p, size_t len)
+{
+ return !VALGRIND_CHECK_MEM_IS_ADDRESSABLE(p, len);
+}
+#else
+#define vg_register_stack(stack) do { } while (0)
+#define vg_deregister_stack(stack) do { } while (0)
+#define vg_addressable(p, len) (true)
+#endif
+