9 /* Silly pseudo define. Do this right some day */
14 typedef struct pseudo
*pseudo_t
;
16 extern struct pseudo void_pseudo
;
18 #define VOID (&void_pseudo)
21 struct basic_block
*target
;
26 struct basic_block
*source
;
35 pseudo_t cond
; /* for branch and switch */
39 struct basic_block
*bb_true
, *bb_false
;
42 struct multijmp_list
*multijmp_list
;
44 struct /* phi_node */ {
45 struct phi_list
*phi_list
;
48 struct symbol
*orig_type
; /* casts */
54 struct /* multijump */ {
58 struct expression
*val
;
62 struct pseudo_list
*arguments
;
71 OP_RET
= OP_TERMINATOR
,
77 OP_TERMINATOR_END
= OP_UNWIND
,
96 OP_BINARY_END
= OP_OR_BOOL
,
98 /* Binary comparison */
100 OP_SET_EQ
= OP_BINCMP
,
110 OP_BINCMP_END
= OP_SET_AE
,
116 /* Setcc - always in combination with a select or conditional branch */
136 struct basic_block_list
;
137 struct instruction_list
;
140 * Basic block flags. Right now we only have one, which keeps
141 * track (at build time) whether the basic block has been branched
144 #define BB_REACHABLE 0x00000001
147 unsigned long flags
; /* BB status flags */
148 struct basic_block_list
*parents
; /* sources */
149 struct instruction_list
*insns
; /* Linear list of instructions */
152 static inline int is_branch_goto(struct instruction
*br
)
154 return br
&& br
->opcode
==OP_BR
&& (!br
->bb_true
|| !br
->bb_false
);
157 static inline void add_bb(struct basic_block_list
**list
, struct basic_block
*bb
)
159 add_ptr_list((struct ptr_list
**)list
, bb
);
162 static inline void add_instruction(struct instruction_list
**list
, struct instruction
*insn
)
164 add_ptr_list((struct ptr_list
**)list
, insn
);
167 static inline void add_multijmp(struct multijmp_list
**list
, struct multijmp
*multijmp
)
169 add_ptr_list((struct ptr_list
**)list
, multijmp
);
172 static inline void add_phi(struct phi_list
**list
, struct phi
*phi
)
174 add_ptr_list((struct ptr_list
**)list
, phi
);
177 static inline void add_pseudo(struct pseudo_list
**list
, struct pseudo
*pseudo
)
179 add_ptr_list((struct ptr_list
**)list
, pseudo
);
183 static inline int bb_terminated(struct basic_block
*bb
)
185 struct instruction
*insn
;
188 insn
= last_instruction(bb
->insns
);
189 return insn
&& insn
->opcode
>= OP_RET
&& insn
->opcode
<= OP_UNWIND
;
192 static inline int bb_reachable(struct basic_block
*bb
)
194 return bb
&& (bb
->parents
|| (bb
->flags
& BB_REACHABLE
));
199 struct symbol_list
*syms
;
200 struct basic_block_list
*bbs
;
201 struct basic_block
*active
;
204 struct entrypoint
*linearize_symbol(struct symbol
*sym
);
205 void show_entry(struct entrypoint
*ep
);
207 #endif /* LINEARIZE_H */