Index: llvm/include/llvm/Support/Allocator.h =================================================================== --- llvm/include/llvm/Support/Allocator.h +++ llvm/include/llvm/Support/Allocator.h @@ -21,6 +21,7 @@ #ifndef LLVM_SUPPORT_ALLOCATOR_H #define LLVM_SUPPORT_ALLOCATOR_H +#include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" @@ -283,6 +284,35 @@ size_t GetNumSlabs() const { return Slabs.size() + CustomSizedSlabs.size(); } + /// \return An index uniquely and reproducibly identifying + /// an input pointer \p Ptr in the given allocator. + /// The returned value is negative iff the object is inside a custom-size + /// slab. + /// Returns an empty optional if the pointer is not found in the allocator. + llvm::Optional identifyObject(const void *Ptr) { + const char *P = reinterpret_cast(Ptr); + int64_t TotalSlabOffset = 0; + for (size_t Idx = 0; Idx < Slabs.size(); Idx++) { + const char *S = reinterpret_cast(Slabs[Idx]); + size_t IdxSlabSize = computeSlabSize(Idx); + if (P >= S && P < S + IdxSlabSize) + return TotalSlabOffset + (P - S); + TotalSlabOffset += IdxSlabSize; + } + + // Use negative index to denote custom sized slabs. + int64_t CustomSlabOffset = 0; + for (size_t Idx = 0; Idx < CustomSizedSlabs.size(); Idx++) { + const char *S = + reinterpret_cast(CustomSizedSlabs[Idx].first); + size_t Size = CustomSizedSlabs[Idx].second; + if (P >= S && P < S + Size) + return CustomSlabOffset - (P - S); + CustomSlabOffset -= Size; + } + return None; + } + size_t getTotalMemory() const { size_t TotalMemory = 0; for (auto I = Slabs.begin(), E = Slabs.end(); I != E; ++I)