Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Transforms/ObjCARC/DependencyAnalysis.h
35266 views
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-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
///
10
/// This file declares special dependency analysis routines used in Objective C
11
/// ARC Optimizations.
12
///
13
/// WARNING: This file knows about certain library functions. It recognizes them
14
/// by name, and hardwires knowledge of their semantics.
15
///
16
/// WARNING: This file knows about how certain Objective-C library functions are
17
/// used. Naive LLVM IR transformations which would otherwise be
18
/// behavior-preserving may break these assumptions.
19
///
20
//===----------------------------------------------------------------------===//
21
22
#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H
23
#define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H
24
25
#include "llvm/Analysis/ObjCARCInstKind.h"
26
27
namespace llvm {
28
class BasicBlock;
29
class Instruction;
30
class Value;
31
}
32
33
namespace llvm {
34
namespace objcarc {
35
36
class ProvenanceAnalysis;
37
38
/// \enum DependenceKind
39
/// Defines different dependence kinds among various ARC constructs.
40
///
41
/// There are several kinds of dependence-like concepts in use here.
42
///
43
enum 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.
53
llvm::Instruction *findSingleDependency(DependenceKind Flavor, const Value *Arg,
54
BasicBlock *StartBB,
55
Instruction *StartInst,
56
ProvenanceAnalysis &PA);
57
58
bool
59
Depends(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 a
63
/// way that requires the reference count to be positive.
64
bool CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA,
65
ARCInstKind Class);
66
67
/// Test whether the given instruction can result in a reference count
68
/// modification (positive or negative) for the pointer's object.
69
bool 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 decrement
73
/// the reference count of Ptr. Returns false if we can.
74
bool CanDecrementRefCount(const Instruction *Inst, const Value *Ptr,
75
ProvenanceAnalysis &PA, ARCInstKind Class);
76
77
static 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 objcarc
84
} // namespace llvm
85
86
#endif
87
88