diff options
Diffstat (limited to 'llvm/lib/Transforms/ObjCARC/DependencyAnalysis.h')
| -rw-r--r-- | llvm/lib/Transforms/ObjCARC/DependencyAnalysis.h | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/llvm/lib/Transforms/ObjCARC/DependencyAnalysis.h b/llvm/lib/Transforms/ObjCARC/DependencyAnalysis.h new file mode 100644 index 000000000000..ed89c8c8fc89 --- /dev/null +++ b/llvm/lib/Transforms/ObjCARC/DependencyAnalysis.h @@ -0,0 +1,88 @@ +//===- DependencyAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// This file declares special dependency analysis routines used in Objective C +/// ARC Optimizations. +/// +/// WARNING: This file knows about certain library functions. It recognizes them +/// by name, and hardwires knowledge of their semantics. +/// +/// WARNING: This file knows about how certain Objective-C library functions are +/// used. Naive LLVM IR transformations which would otherwise be +/// behavior-preserving may break these assumptions. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H +#define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H + +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/Analysis/ObjCARCInstKind.h" + +namespace llvm { +  class BasicBlock; +  class Instruction; +  class Value; +} + +namespace llvm { +namespace objcarc { + +class ProvenanceAnalysis; + +/// \enum DependenceKind +/// Defines different dependence kinds among various ARC constructs. +/// +/// There are several kinds of dependence-like concepts in use here. +/// +enum DependenceKind { +  NeedsPositiveRetainCount, +  AutoreleasePoolBoundary, +  CanChangeRetainCount, +  RetainAutoreleaseDep,       ///< Blocks objc_retainAutorelease. +  RetainAutoreleaseRVDep,     ///< Blocks objc_retainAutoreleaseReturnValue. +  RetainRVDep                 ///< Blocks objc_retainAutoreleasedReturnValue. +}; + +void FindDependencies(DependenceKind Flavor, +                      const Value *Arg, +                      BasicBlock *StartBB, Instruction *StartInst, +                      SmallPtrSetImpl<Instruction *> &DependingInstructions, +                      SmallPtrSetImpl<const BasicBlock *> &Visited, +                      ProvenanceAnalysis &PA); + +bool +Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg, +        ProvenanceAnalysis &PA); + +/// Test whether the given instruction can "use" the given pointer's object in a +/// way that requires the reference count to be positive. +bool CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA, +            ARCInstKind Class); + +/// Test whether the given instruction can result in a reference count +/// modification (positive or negative) for the pointer's object. +bool CanAlterRefCount(const Instruction *Inst, const Value *Ptr, +                      ProvenanceAnalysis &PA, ARCInstKind Class); + +/// Returns true if we can not conservatively prove that Inst can not decrement +/// the reference count of Ptr. Returns false if we can. +bool CanDecrementRefCount(const Instruction *Inst, const Value *Ptr, +                          ProvenanceAnalysis &PA, ARCInstKind Class); + +static inline bool CanDecrementRefCount(const Instruction *Inst, +                                        const Value *Ptr, +                                        ProvenanceAnalysis &PA) { +  return CanDecrementRefCount(Inst, Ptr, PA, GetARCInstKind(Inst)); +} + +} // namespace objcarc +} // namespace llvm + +#endif | 
