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 Andricvoid 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