1218885Sdim//===-- Valgrind.cpp - Implement Valgrind communication ---------*- C++ -*-===//
2218885Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6218885Sdim//
7218885Sdim//===----------------------------------------------------------------------===//
8218885Sdim//
9218885Sdim//  Defines Valgrind communication methods, if HAVE_VALGRIND_VALGRIND_H is
10218885Sdim//  defined.  If we have valgrind.h but valgrind isn't running, its macros are
11218885Sdim//  no-ops.
12218885Sdim//
13218885Sdim//===----------------------------------------------------------------------===//
14218885Sdim
15218885Sdim#include "llvm/Support/Valgrind.h"
16218885Sdim#include "llvm/Config/config.h"
17296417Sdim#include <cstddef>
18218885Sdim
19218885Sdim#if HAVE_VALGRIND_VALGRIND_H
20218885Sdim#include <valgrind/valgrind.h>
21218885Sdim
22218885Sdimstatic bool InitNotUnderValgrind() {
23218885Sdim  return !RUNNING_ON_VALGRIND;
24218885Sdim}
25218885Sdim
26218885Sdim// This bool is negated from what we'd expect because code may run before it
27218885Sdim// gets initialized.  If that happens, it will appear to be 0 (false), and we
28218885Sdim// want that to cause the rest of the code in this file to run the
29218885Sdim// Valgrind-provided macros.
30218885Sdimstatic const bool NotUnderValgrind = InitNotUnderValgrind();
31218885Sdim
32218885Sdimbool llvm::sys::RunningOnValgrind() {
33218885Sdim  if (NotUnderValgrind)
34218885Sdim    return false;
35218885Sdim  return RUNNING_ON_VALGRIND;
36218885Sdim}
37218885Sdim
38218885Sdimvoid llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
39218885Sdim  if (NotUnderValgrind)
40218885Sdim    return;
41218885Sdim
42218885Sdim  VALGRIND_DISCARD_TRANSLATIONS(Addr, Len);
43218885Sdim}
44218885Sdim
45218885Sdim#else  // !HAVE_VALGRIND_VALGRIND_H
46218885Sdim
47218885Sdimbool llvm::sys::RunningOnValgrind() {
48218885Sdim  return false;
49218885Sdim}
50218885Sdim
51218885Sdimvoid llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
52218885Sdim}
53218885Sdim
54218885Sdim#endif  // !HAVE_VALGRIND_VALGRIND_H
55