1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef CPP_ABCKIT_BASIC_BLOCK_IMPL_H
17 #define CPP_ABCKIT_BASIC_BLOCK_IMPL_H
18
19 #include <cstdint>
20 #include "basic_block.h"
21 #include "instruction.h"
22
23 // NOLINTBEGIN(performance-unnecessary-value-param)
24 namespace abckit {
25
GetSuccCount()26 inline uint64_t BasicBlock::GetSuccCount() const
27 {
28 uint64_t count = GetApiConfig()->cGapi_->bbGetSuccBlockCount(GetView());
29 CheckError(GetApiConfig());
30 return count;
31 }
32
GetSuccByIdx(uint32_t idx)33 inline BasicBlock BasicBlock::GetSuccByIdx(uint32_t idx) const
34 {
35 const ApiConfig *conf = GetApiConfig();
36 AbckitBasicBlock *abcBB = conf->cGapi_->bbGetSuccBlock(GetView(), idx);
37 CheckError(conf);
38 return BasicBlock(abcBB, conf, GetResource());
39 }
40
41 // CC-OFFNXT(G.FUD.06) perf critical
GetSuccs()42 inline std::vector<BasicBlock> BasicBlock::GetSuccs() const
43 {
44 std::vector<BasicBlock> bBs;
45 Payload<std::vector<BasicBlock> *> payload {&bBs, GetApiConfig(), GetResource()};
46
47 GetApiConfig()->cGapi_->bbVisitSuccBlocks(GetView(), &payload, [](AbckitBasicBlock *succ, void *data) {
48 const auto &payload = *static_cast<Payload<std::vector<BasicBlock> *> *>(data);
49 payload.data->push_back(BasicBlock(succ, payload.config, payload.resource));
50 return true;
51 });
52
53 CheckError(GetApiConfig());
54
55 return bBs;
56 }
57
58 // CC-OFFNXT(G.FUD.06) perf critical
GetPreds()59 inline std::vector<BasicBlock> BasicBlock::GetPreds() const
60 {
61 std::vector<BasicBlock> bBs;
62 Payload<std::vector<BasicBlock> *> payload {&bBs, GetApiConfig(), GetResource()};
63
64 GetApiConfig()->cGapi_->bbVisitPredBlocks(GetView(), &payload, [](AbckitBasicBlock *succ, void *data) {
65 const auto &payload = *static_cast<Payload<std::vector<BasicBlock> *> *>(data);
66 payload.data->push_back(BasicBlock(succ, payload.config, payload.resource));
67 return true;
68 });
69
70 CheckError(GetApiConfig());
71
72 return bBs;
73 }
74
GetInstructions()75 inline std::vector<Instruction> BasicBlock::GetInstructions() const
76 {
77 std::vector<Instruction> insts;
78 auto *conf = GetApiConfig();
79 auto *inst = conf->cGapi_->bbGetFirstInst(GetView());
80 CheckError(conf);
81 while (inst != nullptr) {
82 insts.push_back(Instruction(inst, conf, GetResource()));
83 inst = conf->cGapi_->iGetNext(inst);
84 CheckError(conf);
85 }
86 return insts;
87 }
88
GetFirstInst()89 inline Instruction BasicBlock::GetFirstInst() const
90 {
91 auto *conf = GetApiConfig();
92 auto *inst = conf->cGapi_->bbGetFirstInst(GetView());
93 CheckError(conf);
94 return Instruction(inst, conf, GetResource());
95 }
96
GetLastInst()97 inline Instruction BasicBlock::GetLastInst() const
98 {
99 auto *conf = GetApiConfig();
100 auto *inst = conf->cGapi_->bbGetLastInst(GetView());
101 CheckError(conf);
102 return Instruction(inst, conf, GetResource());
103 }
104
AddInstFront(Instruction inst)105 inline BasicBlock BasicBlock::AddInstFront(Instruction inst) const
106 {
107 GetApiConfig()->cGapi_->bbAddInstFront(GetView(), inst.GetView());
108 CheckError(GetApiConfig());
109 return BasicBlock(GetView(), GetApiConfig(), GetResource());
110 }
111
AddInstBack(Instruction inst)112 inline BasicBlock BasicBlock::AddInstBack(Instruction inst) const
113 {
114 GetApiConfig()->cGapi_->bbAddInstBack(GetView(), inst.GetView());
115 CheckError(GetApiConfig());
116 return BasicBlock(GetView(), GetApiConfig(), GetResource());
117 }
118
VisitSuccBlocks(const std::function<void (BasicBlock)> & cb)119 inline void BasicBlock::VisitSuccBlocks(const std::function<void(BasicBlock)> &cb) const
120 {
121 Payload<const std::function<void(BasicBlock)> &> payload {cb, GetApiConfig(), GetResource()};
122
123 GetApiConfig()->cGapi_->bbVisitSuccBlocks(GetView(), &payload, [](AbckitBasicBlock *succ, void *data) {
124 const auto &payload = *static_cast<Payload<const std::function<void(BasicBlock)> &> *>(data);
125 payload.data(BasicBlock(succ, payload.config, payload.resource));
126 return true;
127 });
128 CheckError(GetApiConfig());
129 }
130
VisitPredBlocks(const std::function<bool (BasicBlock)> & cb)131 inline void BasicBlock::VisitPredBlocks(const std::function<bool(BasicBlock)> &cb) const
132 {
133 Payload<const std::function<bool(BasicBlock)> &> payload {cb, GetApiConfig(), GetResource()};
134
135 GetApiConfig()->cGapi_->bbVisitPredBlocks(GetView(), &payload, [](AbckitBasicBlock *succ, void *data) {
136 const auto &payload = *static_cast<Payload<const std::function<bool(BasicBlock)> &> *>(data);
137 return payload.data(BasicBlock(succ, payload.config, payload.resource));
138 });
139 CheckError(GetApiConfig());
140 }
141
GetId()142 inline uint32_t BasicBlock::GetId() const
143 {
144 auto id = GetApiConfig()->cGapi_->bbGetId(GetView());
145 CheckError(GetApiConfig());
146 return id;
147 }
148
GetGraph()149 inline const Graph *BasicBlock::GetGraph() const
150 {
151 return GetResource();
152 }
153
SplitBlockAfterInstruction(Instruction ins,bool makeEdge)154 inline BasicBlock BasicBlock::SplitBlockAfterInstruction(Instruction ins, bool makeEdge)
155 {
156 auto *bb = GetApiConfig()->cGapi_->bbSplitBlockAfterInstruction(GetView(), ins.GetView(), makeEdge);
157 CheckError(GetApiConfig());
158 return BasicBlock(bb, GetApiConfig(), GetResource());
159 }
160
GetPredBlockCount()161 inline uint64_t BasicBlock::GetPredBlockCount() const
162 {
163 auto count = GetApiConfig()->cGapi_->bbGetPredBlockCount(GetView());
164 CheckError(GetApiConfig());
165 return count;
166 }
167
GetPredBlock(uint32_t index)168 inline BasicBlock BasicBlock::GetPredBlock(uint32_t index) const
169 {
170 auto *bb = GetApiConfig()->cGapi_->bbGetPredBlock(GetView(), index);
171 CheckError(GetApiConfig());
172 return BasicBlock(bb, GetApiConfig(), GetResource());
173 }
174
GetSuccBlockCount()175 inline uint64_t BasicBlock::GetSuccBlockCount() const
176 {
177 auto count = GetApiConfig()->cGapi_->bbGetSuccBlockCount(GetView());
178 CheckError(GetApiConfig());
179 return count;
180 }
181
GetSuccBlock(uint32_t index)182 inline BasicBlock BasicBlock::GetSuccBlock(uint32_t index) const
183 {
184 auto *bb = GetApiConfig()->cGapi_->bbGetSuccBlock(GetView(), index);
185 CheckError(GetApiConfig());
186 return BasicBlock(bb, GetApiConfig(), GetResource());
187 }
188
InsertSuccBlock(BasicBlock succBlock,uint32_t index)189 inline BasicBlock BasicBlock::InsertSuccBlock(BasicBlock succBlock, uint32_t index)
190 {
191 GetApiConfig()->cGapi_->bbInsertSuccBlock(GetView(), succBlock.GetView(), index);
192 CheckError(GetApiConfig());
193 return BasicBlock(GetView(), GetApiConfig(), GetResource());
194 }
195
AppendSuccBlock(BasicBlock succBlock)196 inline BasicBlock BasicBlock::AppendSuccBlock(BasicBlock succBlock)
197 {
198 GetApiConfig()->cGapi_->bbAppendSuccBlock(GetView(), succBlock.GetView());
199 CheckError(GetApiConfig());
200 return BasicBlock(GetView(), GetApiConfig(), GetResource());
201 }
202
EraseSuccBlock(uint32_t index)203 inline BasicBlock BasicBlock::EraseSuccBlock(uint32_t index)
204 {
205 GetApiConfig()->cGapi_->bbDisconnectSuccBlock(GetView(), index);
206 CheckError(GetApiConfig());
207 return BasicBlock(GetView(), GetApiConfig(), GetResource());
208 }
209
GetTrueBranch()210 inline BasicBlock BasicBlock::GetTrueBranch() const
211 {
212 auto *bb = GetApiConfig()->cGapi_->bbGetTrueBranch(GetView());
213 CheckError(GetApiConfig());
214 return BasicBlock(bb, GetApiConfig(), GetResource());
215 }
216
GetFalseBranch()217 inline BasicBlock BasicBlock::GetFalseBranch() const
218 {
219 auto *bb = GetApiConfig()->cGapi_->bbGetFalseBranch(GetView());
220 CheckError(GetApiConfig());
221 return BasicBlock(bb, GetApiConfig(), GetResource());
222 }
223
RemoveAllInsts()224 inline BasicBlock BasicBlock::RemoveAllInsts()
225 {
226 GetApiConfig()->cGapi_->bbRemoveAllInsts(GetView());
227 CheckError(GetApiConfig());
228 return BasicBlock(GetView(), GetApiConfig(), GetResource());
229 }
230
GetNumberOfInstructions()231 inline uint32_t BasicBlock::GetNumberOfInstructions() const
232 {
233 auto num = GetApiConfig()->cGapi_->bbGetNumberOfInstructions(GetView());
234 CheckError(GetApiConfig());
235 return num;
236 }
237
GetImmediateDominator()238 inline BasicBlock BasicBlock::GetImmediateDominator() const
239 {
240 auto dom = GetApiConfig()->cGapi_->bbGetImmediateDominator(GetView());
241 CheckError(GetApiConfig());
242 return BasicBlock(dom, GetApiConfig(), GetResource());
243 }
244
CheckDominance(BasicBlock dom)245 inline bool BasicBlock::CheckDominance(BasicBlock dom) const
246 {
247 auto check = GetApiConfig()->cGapi_->bbCheckDominance(GetView(), dom.GetView());
248 CheckError(GetApiConfig());
249 return check;
250 }
251
VisitDominatedBlocks(const std::function<bool (BasicBlock)> & cb)252 inline void BasicBlock::VisitDominatedBlocks(const std::function<bool(BasicBlock)> &cb) const
253 {
254 Payload<const std::function<bool(BasicBlock)> &> payload {cb, GetApiConfig(), GetResource()};
255
256 GetApiConfig()->cGapi_->bbVisitDominatedBlocks(GetView(), &payload, [](AbckitBasicBlock *succ, void *data) {
257 const auto &payload = *static_cast<Payload<const std::function<bool(BasicBlock)> &> *>(data);
258 return payload.data(BasicBlock(succ, payload.config, payload.resource));
259 });
260 CheckError(GetApiConfig());
261 }
262
IsStart()263 inline bool BasicBlock::IsStart() const
264 {
265 auto check = GetApiConfig()->cGapi_->bbIsStart(GetView());
266 CheckError(GetApiConfig());
267 return check;
268 }
269
IsEnd()270 inline bool BasicBlock::IsEnd() const
271 {
272 auto check = GetApiConfig()->cGapi_->bbIsEnd(GetView());
273 CheckError(GetApiConfig());
274 return check;
275 }
276
IsLoopHead()277 inline bool BasicBlock::IsLoopHead() const
278 {
279 auto check = GetApiConfig()->cGapi_->bbIsLoopHead(GetView());
280 CheckError(GetApiConfig());
281 return check;
282 }
283
IsLoopPrehead()284 inline bool BasicBlock::IsLoopPrehead() const
285 {
286 auto check = GetApiConfig()->cGapi_->bbIsLoopPrehead(GetView());
287 CheckError(GetApiConfig());
288 return check;
289 }
290
IsTryBegin()291 inline bool BasicBlock::IsTryBegin() const
292 {
293 auto check = GetApiConfig()->cGapi_->bbIsTryBegin(GetView());
294 CheckError(GetApiConfig());
295 return check;
296 }
297
IsTry()298 inline bool BasicBlock::IsTry() const
299 {
300 auto check = GetApiConfig()->cGapi_->bbIsTry(GetView());
301 CheckError(GetApiConfig());
302 return check;
303 }
304
IsTryEnd()305 inline bool BasicBlock::IsTryEnd() const
306 {
307 auto check = GetApiConfig()->cGapi_->bbIsTryEnd(GetView());
308 CheckError(GetApiConfig());
309 return check;
310 }
311
IsCatchBegin()312 inline bool BasicBlock::IsCatchBegin() const
313 {
314 auto check = GetApiConfig()->cGapi_->bbIsCatchBegin(GetView());
315 CheckError(GetApiConfig());
316 return check;
317 }
318
IsCatch()319 inline bool BasicBlock::IsCatch() const
320 {
321 auto check = GetApiConfig()->cGapi_->bbIsCatch(GetView());
322 CheckError(GetApiConfig());
323 return check;
324 }
325
Dump(int32_t fd)326 inline BasicBlock BasicBlock::Dump(int32_t fd)
327 {
328 GetApiConfig()->cGapi_->bbDump(GetView(), fd);
329 CheckError(GetApiConfig());
330 return BasicBlock(GetView(), GetApiConfig(), GetResource());
331 }
332
333 template <typename... Args>
CreatePhi(Args...args)334 inline Instruction BasicBlock::CreatePhi(Args... args)
335 {
336 auto *inst = GetApiConfig()->cGapi_->bbCreatePhi(GetView(), sizeof...(args), (args.GetView())...);
337 CheckError(GetApiConfig());
338 return Instruction(inst, GetApiConfig(), GetResource());
339 }
340
341 template <typename... Args>
CreateCatchPhi(Args...args)342 inline Instruction BasicBlock::CreateCatchPhi(Args... args)
343 {
344 auto *inst = GetApiConfig()->cGapi_->bbCreateCatchPhi(GetView(), sizeof...(args), (args.GetView())...);
345 CheckError(GetApiConfig());
346 return Instruction(inst, GetApiConfig(), GetResource());
347 }
348
349 } // namespace abckit
350 // NOLINTEND(performance-unnecessary-value-param)
351
352 #endif // CPP_ABCKIT_BASIC_BLOCK_H
353