LLVM 22.0.0git
ARCRuntimeEntryPoints.h
Go to the documentation of this file.
1//===- ARCRuntimeEntryPoints.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//
9/// \file
10/// This file contains a class ARCRuntimeEntryPoints for use in
11/// creating/managing references to entry points to the arc objective c runtime.
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_ARCRUNTIMEENTRYPOINTS_H
23#define LLVM_LIB_TRANSFORMS_OBJCARC_ARCRUNTIMEENTRYPOINTS_H
24
25#include "llvm/IR/Attributes.h"
26#include "llvm/IR/Intrinsics.h"
28#include <cassert>
29
30namespace llvm {
31
32class Function;
33class Module;
34
35namespace objcarc {
36
39 Release,
40 Retain,
45 ClaimRV,
51};
52
53/// Declarations for ObjC runtime functions and constants. These are initialized
54/// lazily to avoid cluttering up the Module with unused declarations.
56public:
58
59 void init(Module *M) {
60 TheModule = M;
61 AutoreleaseRV = nullptr;
62 Release = nullptr;
63 Retain = nullptr;
64 RetainBlock = nullptr;
65 Autorelease = nullptr;
66 StoreStrong = nullptr;
67 RetainRV = nullptr;
68 ClaimRV = nullptr;
69 UnsafeClaimRV = nullptr;
70 RetainAutorelease = nullptr;
71 RetainAutoreleaseRV = nullptr;
72 AutoreleasePoolPush = nullptr;
73 AutoreleasePoolPop = nullptr;
74 }
75
77 assert(TheModule != nullptr && "Not initialized.");
78
79 switch (kind) {
81 return getIntrinsicEntryPoint(AutoreleaseRV,
82 Intrinsic::objc_autoreleaseReturnValue);
84 return getIntrinsicEntryPoint(Release, Intrinsic::objc_release);
86 return getIntrinsicEntryPoint(Retain, Intrinsic::objc_retain);
88 return getIntrinsicEntryPoint(RetainBlock, Intrinsic::objc_retainBlock);
90 return getIntrinsicEntryPoint(Autorelease, Intrinsic::objc_autorelease);
92 return getIntrinsicEntryPoint(StoreStrong, Intrinsic::objc_storeStrong);
94 return getIntrinsicEntryPoint(RetainRV,
95 Intrinsic::objc_retainAutoreleasedReturnValue);
97 return getIntrinsicEntryPoint(
98 ClaimRV, Intrinsic::objc_claimAutoreleasedReturnValue);
100 return getIntrinsicEntryPoint(
101 UnsafeClaimRV, Intrinsic::objc_unsafeClaimAutoreleasedReturnValue);
103 return getIntrinsicEntryPoint(RetainAutorelease,
104 Intrinsic::objc_retainAutorelease);
106 return getIntrinsicEntryPoint(RetainAutoreleaseRV,
107 Intrinsic::objc_retainAutoreleaseReturnValue);
109 return getIntrinsicEntryPoint(AutoreleasePoolPush,
110 Intrinsic::objc_autoreleasePoolPush);
112 return getIntrinsicEntryPoint(AutoreleasePoolPop,
113 Intrinsic::objc_autoreleasePoolPop);
114 }
115
116 llvm_unreachable("Switch should be a covered switch.");
117 }
118
119private:
120 /// Cached reference to the module which we will insert declarations into.
121 Module *TheModule = nullptr;
122
123 /// Declaration for ObjC runtime function objc_autoreleaseReturnValue.
124 Function *AutoreleaseRV = nullptr;
125
126 /// Declaration for ObjC runtime function objc_release.
127 Function *Release = nullptr;
128
129 /// Declaration for ObjC runtime function objc_retain.
130 Function *Retain = nullptr;
131
132 /// Declaration for ObjC runtime function objc_retainBlock.
133 Function *RetainBlock = nullptr;
134
135 /// Declaration for ObjC runtime function objc_autorelease.
136 Function *Autorelease = nullptr;
137
138 /// Declaration for objc_storeStrong().
139 Function *StoreStrong = nullptr;
140
141 /// Declaration for objc_retainAutoreleasedReturnValue().
142 Function *RetainRV = nullptr;
143
144 /// Declaration for objc_claimAutoreleasedReturnValue().
145 Function *ClaimRV = nullptr;
146
147 /// Declaration for objc_unsafeClaimAutoreleasedReturnValue().
148 Function *UnsafeClaimRV = nullptr;
149
150 /// Declaration for objc_retainAutorelease().
151 Function *RetainAutorelease = nullptr;
152
153 /// Declaration for objc_retainAutoreleaseReturnValue().
154 Function *RetainAutoreleaseRV = nullptr;
155
156 /// Declaration for objc_autoreleasePoolPush().
157 Function *AutoreleasePoolPush = nullptr;
158
159 /// Declaration for objc_autoreleasePoolPop().
160 Function *AutoreleasePoolPop = nullptr;
161
162 Function *getIntrinsicEntryPoint(Function *&Decl, Intrinsic::ID IntID) {
163 if (Decl)
164 return Decl;
165
166 return Decl = Intrinsic::getOrInsertDeclaration(TheModule, IntID);
167 }
168};
169
170} // end namespace objcarc
171
172} // end namespace llvm
173
174#endif // LLVM_LIB_TRANSFORMS_OBJCARC_ARCRUNTIMEENTRYPOINTS_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
Machine Check Debug Module
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
Declarations for ObjC runtime functions and constants.
Function * get(ARCRuntimeEntryPointKind kind)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
Definition: Intrinsics.cpp:751
@ StoreStrong
objc_storeStrong (derived)
@ Autorelease
objc_autorelease
@ RetainRV
objc_retainAutoreleasedReturnValue
@ RetainBlock
objc_retainBlock
@ AutoreleaseRV
objc_autoreleaseReturnValue
@ UnsafeClaimRV
objc_unsafeClaimAutoreleasedReturnValue
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18