brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 7732eeb Raw
87 lines · c
1//===- DependencyAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8/// \file9///10/// This file declares special dependency analysis routines used in Objective C11/// ARC Optimizations.12///13/// WARNING: This file knows about certain library functions. It recognizes them14/// by name, and hardwires knowledge of their semantics.15///16/// WARNING: This file knows about how certain Objective-C library functions are17/// used. Naive LLVM IR transformations which would otherwise be18/// behavior-preserving may break these assumptions.19///20//===----------------------------------------------------------------------===//21 22#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H23#define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H24 25#include "llvm/Analysis/ObjCARCInstKind.h"26 27namespace llvm {28  class BasicBlock;29  class Instruction;30  class Value;31}32 33namespace llvm {34namespace objcarc {35 36class ProvenanceAnalysis;37 38/// \enum DependenceKind39/// Defines different dependence kinds among various ARC constructs.40///41/// There are several kinds of dependence-like concepts in use here.42///43enum DependenceKind {44  NeedsPositiveRetainCount,45  AutoreleasePoolBoundary,46  CanChangeRetainCount,47  RetainAutoreleaseDep,       ///< Blocks objc_retainAutorelease.48  RetainAutoreleaseRVDep      ///< Blocks objc_retainAutoreleaseReturnValue.49};50 51/// Find dependent instructions. If there is exactly one dependent instruction,52/// return it. Otherwise, return null.53llvm::Instruction *findSingleDependency(DependenceKind Flavor, const Value *Arg,54                                        BasicBlock *StartBB,55                                        Instruction *StartInst,56                                        ProvenanceAnalysis &PA);57 58bool59Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg,60        ProvenanceAnalysis &PA);61 62/// Test whether the given instruction can "use" the given pointer's object in a63/// way that requires the reference count to be positive.64bool CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA,65            ARCInstKind Class);66 67/// Test whether the given instruction can result in a reference count68/// modification (positive or negative) for the pointer's object.69bool CanAlterRefCount(const Instruction *Inst, const Value *Ptr,70                      ProvenanceAnalysis &PA, ARCInstKind Class);71 72/// Returns true if we can not conservatively prove that Inst can not decrement73/// the reference count of Ptr. Returns false if we can.74bool CanDecrementRefCount(const Instruction *Inst, const Value *Ptr,75                          ProvenanceAnalysis &PA, ARCInstKind Class);76 77static inline bool CanDecrementRefCount(const Instruction *Inst,78                                        const Value *Ptr,79                                        ProvenanceAnalysis &PA) {80  return CanDecrementRefCount(Inst, Ptr, PA, GetARCInstKind(Inst));81}82 83} // namespace objcarc84} // namespace llvm85 86#endif87