• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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