1//===- DependencyAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// \file 10/// 11/// This file declares special dependency analysis routines used in Objective C 12/// ARC Optimizations. 13/// 14/// WARNING: This file knows about certain library functions. It recognizes them 15/// by name, and hardwires knowledge of their semantics. 16/// 17/// WARNING: This file knows about how certain Objective-C library functions are 18/// used. Naive LLVM IR transformations which would otherwise be 19/// behavior-preserving may break these assumptions. 20/// 21//===----------------------------------------------------------------------===// 22 23#ifndef LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H 24#define LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H 25 26#include "llvm/ADT/SmallPtrSet.h" 27 28namespace llvm { 29 class BasicBlock; 30 class Instruction; 31 class Value; 32} 33 34namespace llvm { 35namespace objcarc { 36 37class ProvenanceAnalysis; 38 39/// \enum DependenceKind 40/// \brief Defines different dependence kinds among various ARC constructs. 41/// 42/// There are several kinds of dependence-like concepts in use here. 43/// 44enum DependenceKind { 45 NeedsPositiveRetainCount, 46 AutoreleasePoolBoundary, 47 CanChangeRetainCount, 48 RetainAutoreleaseDep, ///< Blocks objc_retainAutorelease. 49 RetainAutoreleaseRVDep, ///< Blocks objc_retainAutoreleaseReturnValue. 50 RetainRVDep ///< Blocks objc_retainAutoreleasedReturnValue. 51}; 52 53void FindDependencies(DependenceKind Flavor, 54 const Value *Arg, 55 BasicBlock *StartBB, Instruction *StartInst, 56 SmallPtrSet<Instruction *, 4> &DependingInstructions, 57 SmallPtrSet<const BasicBlock *, 4> &Visited, 58 ProvenanceAnalysis &PA); 59 60bool 61Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg, 62 ProvenanceAnalysis &PA); 63 64/// Test whether the given instruction can "use" the given pointer's object in a 65/// way that requires the reference count to be positive. 66bool 67CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA, 68 InstructionClass Class); 69 70/// Test whether the given instruction can result in a reference count 71/// modification (positive or negative) for the pointer's object. 72bool 73CanAlterRefCount(const Instruction *Inst, const Value *Ptr, 74 ProvenanceAnalysis &PA, InstructionClass Class); 75 76} // namespace objcarc 77} // namespace llvm 78 79#endif // LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H 80