LLVM: lib/Transforms/ObjCARC/ObjCARC.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H

23#define LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H

24

30

31namespace llvm {

33

34

35

36

37

38

39

42

44

45 if (!Unused) {

46

50 "Can't delete non-forwarding instruction with users!");

52 }

53

55

56 if (Unused)

58}

59

60

61

65 return nullptr;

66

69 return C;

71}

72

73

74template<class PHINodeTy, class VectorTy>

76 auto *BB = PN.getParent();

77 for (auto &P : BB->phis()) {

78 if (&P == &PN)

79 continue;

80 unsigned I = 0, E = PN.getNumIncomingValues();

81 for (; I < E; ++I) {

82 auto *BB = PN.getIncomingBlock(I);

83 auto *PNOpnd = PN.getIncomingValue(I)->stripPointerCasts();

84 auto *POpnd = P.getIncomingValueForBlock(BB)->stripPointerCasts();

85 if (PNOpnd != POpnd)

86 break;

87 }

88 if (I == E)

89 PHIList.push_back(&P);

90 }

91}

92

97

98

99

100

105

107public:

109 bool UseClaimRV)

110 : EP(EP), ContractPass(ContractPass), UseClaimRV(UseClaimRV) {}

112

113

114

115

117

118

121

122

126

127

130 return RVCalls.count(CI);

131 return false;

132 }

133

134

136 auto It = RVCalls.find(CI);

137 if (It != RVCalls.end()) {

138

139 for (User *U : It->second->users())

141 if (CI->getIntrinsicID() == Intrinsic::objc_clang_arc_noop_use) {

143 break;

144 }

145

148 It->second->getIterator());

149 NewCall->copyMetadata(*It->second);

150 It->second->replaceAllUsesWith(NewCall);

151 It->second->eraseFromParent();

152 RVCalls.erase(It);

153 }

155 }

156

157private:

158

160

162 bool ContractPass;

163 bool UseClaimRV;

164};

165

166}

167}

168

169#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

This file contains a class ARCRuntimeEntryPoints for use in creating/managing references to entry poi...

static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")

This file defines common analysis utilities used by the ObjC ARC Optimizer.

This file defines ARC utility functions which are used by various parts of the compiler.

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

InstListType::iterator iterator

Instruction iterators...

Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...

LLVM_ABI Intrinsic::ID getIntrinsicID() const

Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...

static LLVM_ABI CallBase * removeOperandBundle(CallBase *CB, uint32_t ID, InsertPosition InsertPt=nullptr)

Create a clone of CB with operand bundle ID removed.

This class represents a function call, abstracting a target machine's calling convention.

Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.

A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...

LLVM_ABI InstListType::iterator eraseFromParent()

This method unlinks 'this' from the containing basic block and deletes it.

@ OB_clang_arc_attachedcall

A Module instance is used to store all the information related to an LLVM module.

Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...

Value * getOperand(unsigned i) const

LLVM Value Representation.

LLVM_ABI void replaceAllUsesWith(Value *V)

Change all uses of this to point to a new Value.

LLVM_ABI const Value * stripPointerCasts() const

Strip off pointer casts, all-zero GEPs and address space casts.

Declarations for ObjC runtime functions and constants.

bool contains(const Instruction *I) const

See if an instruction is a bundled retainRV/claimRV call.

Definition ObjCARC.h:128

BundledRetainClaimRVs(ARCRuntimeEntryPoints &EP, bool ContractPass, bool UseClaimRV)

Definition ObjCARC.h:108

std::pair< bool, bool > insertAfterInvokes(Function &F, DominatorTree *DT)

Insert a retainRV/claimRV call to the normal destination blocks of invokes with operand bundle "clang...

CallInst * insertRVCall(BasicBlock::iterator InsertPt, CallBase *AnnotatedCall)

Insert a retainRV/claimRV call.

void eraseInst(CallInst *CI)

Remove a retainRV/claimRV call entirely.

Definition ObjCARC.h:135

CallInst * insertRVCallWithColors(BasicBlock::iterator InsertPt, CallBase *AnnotatedCall, const DenseMap< BasicBlock *, ColorVector > &BlockColors)

Insert a retainRV/claimRV call with colors.

@ C

The default llvm calling convention, compatible with C.

static const Instruction * getreturnRVOperand(const Instruction &Inst, ARCInstKind Class)

If Inst is a ReturnRV and its operand is a call or invoke, return the operand.

Definition ObjCARC.h:62

const char * getRVMarkerModuleFlagStr()

bool IsNullOrUndef(const Value *V)

ARCInstKind

Equivalence classes of instructions in the ARC Model.

@ User

could "use" a pointer

@ RetainRV

objc_retainAutoreleasedReturnValue

CallInst * createCallInstWithColors(FunctionCallee Func, ArrayRef< Value * > Args, const Twine &NameStr, BasicBlock::iterator InsertBefore, const DenseMap< BasicBlock *, ColorVector > &BlockColors)

Create a call instruction with the correct funclet token.

void getEquivalentPHIs(PHINodeTy &PN, VectorTy &PHIList)

Return the list of PHI nodes that are equivalent to PN.

Definition ObjCARC.h:75

bool IsForwarding(ARCInstKind Class)

Test if the given class represents instructions which return their argument verbatim.

ARCInstKind GetBasicARCInstKind(const Value *V)

Determine which objc runtime call instruction class V belongs to.

bool IsNoopOnNull(ARCInstKind Class)

Test if the given class represents instructions which do nothing if passed a null pointer.

static MDString * getRVInstMarker(Module &M)

Definition ObjCARC.h:93

static void EraseInstruction(Instruction *CI)

Erase the given instruction.

Definition ObjCARC.h:40

This is an optimization pass for GlobalISel generic memory operations.

LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())

If the specified value is a trivially dead instruction, delete it.

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

auto dyn_cast_or_null(const Y &Val)

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.