//===--- CaptureTracking.cpp - Determine whether a pointer is captured ----===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains routines that help determine which pointers are captured. // A pointer value is captured if the function makes a copy of any part of the // pointer that outlives the call. Not being captured means, more or less, that // the pointer is only dereferenced and not stored in a global. Returning part // of the pointer as the function return value may or may not count as capturing // the pointer, depending on the context. // //===----------------------------------------------------------------------===// #include "llvm/Analysis/CaptureTracking.h" using namespace llvm; namespace { struct SimpleCaptureTracker { explicit SimpleCaptureTracker(bool ReturnCaptures) : ReturnCaptures(ReturnCaptures), Captured(false) {} void tooManyUses() { Captured = true; } bool shouldExplore(Use *U) { return true; } bool captured(Instruction *I) { if (isa(I) && !ReturnCaptures) return false; Captured = true; return true; } bool ReturnCaptures; bool Captured; }; } /// PointerMayBeCaptured - Return true if this pointer value may be captured /// by the enclosing function (which is required to exist). This routine can /// be expensive, so consider caching the results. The boolean ReturnCaptures /// specifies whether returning the value (or part of it) from the function /// counts as capturing it or not. The boolean StoreCaptures specified whether /// storing the value (or part of it) into memory anywhere automatically /// counts as capturing it or not. bool llvm::PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures) { // TODO: If StoreCaptures is not true, we could do Fancy analysis // to determine whether this store is not actually an escape point. // In that case, BasicAliasAnalysis should be updated as well to // take advantage of this. (void)StoreCaptures; SimpleCaptureTracker SCT(ReturnCaptures); PointerMayBeCaptured(V, SCT); return SCT.Captured; }