ast2firm: Implement casting from complex to real types.
[cparser] / jump_target.c
1 /*
2  * This file is part of cparser.
3  * Copyright (C) 2012 Christoph Mallon <christoph.mallon@gmx.de>
4  */
5 #include "adt/util.h"
6 #include "jump_target.h"
7
8 void jump_from_block_to_target(jump_target *const tgt, ir_node *const block)
9 {
10         if (!tgt->block) {
11                 tgt->block = block;
12                 tgt->first = true;
13                 return;
14         } else if (tgt->first) {
15                 ir_node *const jmp = new_r_Jmp(tgt->block);
16                 tgt->block = new_immBlock();
17                 tgt->first = false;
18                 add_immBlock_pred(tgt->block, jmp);
19         }
20         ir_node *const jmp = new_r_Jmp(block);
21         add_immBlock_pred(tgt->block, jmp);
22 }
23
24 void jump_to_target(jump_target *const tgt)
25 {
26         ir_node *const block = get_cur_block();
27         if (block)
28                 jump_from_block_to_target(tgt, block);
29 }
30
31 void add_pred_to_jump_target(jump_target *const tgt, ir_node *const pred)
32 {
33         if (!tgt->block) {
34                 tgt->block = new_immBlock();
35         } else if (tgt->first) {
36                 ir_node *const jmp = new_r_Jmp(tgt->block);
37                 tgt->block = new_immBlock();
38                 tgt->first = false;
39                 add_immBlock_pred(tgt->block, jmp);
40         }
41         add_immBlock_pred(tgt->block, pred);
42 }
43
44 ir_node *enter_jump_target(jump_target *const tgt)
45 {
46         ir_node *const block = tgt->block;
47         if (block && !tgt->first)
48                 mature_immBlock(block);
49         set_cur_block(block);
50         return block;
51 }
52
53 void enter_immature_jump_target(jump_target *const tgt)
54 {
55         ir_node *jmp;
56         ir_node *block = tgt->block;
57         if (!block) {
58                 /* Avoid unreachable loops by adding a Bad entry. */
59                 jmp = new_Bad(mode_X);
60                 goto new_block;
61         } else if (tgt->first) {
62                 tgt->first = false;
63                 jmp = new_r_Jmp(block);
64 new_block:
65                 tgt->block = block = new_immBlock();
66                 add_immBlock_pred(block, jmp);
67         }
68         set_cur_block(block);
69 }