Lines Matching refs:bb

50 #define bb_prev(bb)		list_prev_entry(bb, l)
51 #define bb_next(bb) list_next_entry(bb, l)
91 struct bb_node *new_bb, *bb;
93 list_for_each_entry(bb, &func->bbs, l) {
94 if (bb->head == insn)
95 return bb;
96 else if (bb->head > insn)
100 bb = bb_prev(bb);
109 list_add(&new_bb->l, &bb->l);
116 struct bb_node *bb;
118 bb = calloc(1, sizeof(*bb));
119 if (!bb) {
124 INIT_LIST_HEAD(&bb->e_prevs);
125 INIT_LIST_HEAD(&bb->e_succs);
126 list_add(&bb->l, after);
128 return bb;
168 struct bb_node *bb;
173 bb = func_append_bb(func, cur);
174 if (!bb)
184 bb = func_append_bb(func, cur + cur->off + 1);
185 if (!bb)
189 bb = func_append_bb(func, cur + 1);
190 if (!bb)
202 struct bb_node *bb, *last;
206 bb = func_first_bb(func);
207 list_for_each_entry_from(bb, &last->l, l) {
208 bb->tail = bb_next(bb)->head - 1;
209 bb->idx = bb_idx++;
218 struct bb_node *bb;
220 bb = func_insert_dummy_bb(&func->bbs);
221 if (!bb)
223 bb->idx = ENTRY_BLOCK_INDEX;
225 bb = func_insert_dummy_bb(&func_last_bb(func)->l);
226 if (!bb)
228 bb->idx = EXIT_BLOCK_INDEX;
246 struct bb_node *bb;
248 list_for_each_entry(bb, &func->bbs, l) {
249 if (bb->head == insn)
250 return bb;
281 struct bb_node *bb;
283 bb = entry_bb(func);
284 e = new_edge(bb, bb_next(bb), EDGE_FLAG_FALLTHROUGH);
287 list_add_tail(&e->l, &bb->e_succs);
289 bb = exit_bb(func);
290 e = new_edge(bb_prev(bb), bb, EDGE_FLAG_FALLTHROUGH);
293 list_add_tail(&e->l, &bb->e_prevs);
295 bb = entry_bb(func);
296 bb = bb_next(bb);
297 list_for_each_entry_from(bb, &exit_bb(func)->l, l) {
298 e = new_edge(bb, NULL, EDGE_FLAG_EMPTY);
301 e->src = bb;
303 insn = bb->tail;
306 e->dst = bb_next(bb);
308 list_add_tail(&e->l, &bb->e_succs);
314 list_add_tail(&e->l, &bb->e_succs);
318 e->dst = bb_next(bb);
320 list_add_tail(&e->l, &bb->e_succs);
322 e = new_edge(bb, NULL, EDGE_FLAG_JUMP);
325 e->src = bb;
327 list_add_tail(&e->l, &bb->e_succs);
359 struct bb_node *bb, *bb2;
361 list_for_each_entry_safe(bb, bb2, &func->bbs, l) {
364 list_for_each_entry_safe(e, e2, &bb->e_prevs, l) {
369 list_for_each_entry_safe(e, e2, &bb->e_succs, l) {
374 list_del(&bb->l);
375 free(bb);
384 draw_bb_node(struct func_node *func, struct bb_node *bb, struct dump_data *dd,
389 if (bb->idx == ENTRY_BLOCK_INDEX || bb->idx == EXIT_BLOCK_INDEX)
395 func->idx, bb->idx, shape);
397 if (bb->idx == ENTRY_BLOCK_INDEX) {
399 } else if (bb->idx == EXIT_BLOCK_INDEX) {
404 start_idx = bb->head - func->start;
405 dump_xlated_for_graph(dd, bb->head, bb->tail, start_idx,
413 static void draw_bb_succ_edges(struct func_node *func, struct bb_node *bb)
421 if (list_empty(&bb->e_succs))
424 list_for_each_entry(e, &bb->e_succs, l) {
436 struct bb_node *bb;
438 list_for_each_entry(bb, &func->bbs, l) {
439 draw_bb_node(func, bb, dd, opcodes, linum);
446 struct bb_node *bb;
448 list_for_each_entry(bb, &func->bbs, l) {
449 draw_bb_succ_edges(func, bb);