1*b5893f02SDimitry Andric //===- BuryPointer.cpp - Memory Manipulation/Leak ---------------*- C++ -*-===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric //                     The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric 
10*b5893f02SDimitry Andric #include "llvm/Support/BuryPointer.h"
11*b5893f02SDimitry Andric #include "llvm/Support/Compiler.h"
12*b5893f02SDimitry Andric #include <atomic>
13*b5893f02SDimitry Andric 
14*b5893f02SDimitry Andric namespace llvm {
15*b5893f02SDimitry Andric 
BuryPointer(const void * Ptr)16*b5893f02SDimitry Andric void BuryPointer(const void *Ptr) {
17*b5893f02SDimitry Andric   // This function may be called only a small fixed amount of times per each
18*b5893f02SDimitry Andric   // invocation, otherwise we do actually have a leak which we want to report.
19*b5893f02SDimitry Andric   // If this function is called more than kGraveYardMaxSize times, the pointers
20*b5893f02SDimitry Andric   // will not be properly buried and a leak detector will report a leak, which
21*b5893f02SDimitry Andric   // is what we want in such case.
22*b5893f02SDimitry Andric   static const size_t kGraveYardMaxSize = 16;
23*b5893f02SDimitry Andric   LLVM_ATTRIBUTE_UNUSED static const void *GraveYard[kGraveYardMaxSize];
24*b5893f02SDimitry Andric   static std::atomic<unsigned> GraveYardSize;
25*b5893f02SDimitry Andric   unsigned Idx = GraveYardSize++;
26*b5893f02SDimitry Andric   if (Idx >= kGraveYardMaxSize)
27*b5893f02SDimitry Andric     return;
28*b5893f02SDimitry Andric   GraveYard[Idx] = Ptr;
29*b5893f02SDimitry Andric }
30*b5893f02SDimitry Andric 
31*b5893f02SDimitry Andric }
32