10 DECLARE_PTR_LIST(pseudo_ptr_list
, pseudo_t
);
23 enum pseudo_type type
;
24 struct pseudo_ptr_list
*users
;
28 struct instruction
*def
;
33 extern struct pseudo void_pseudo
;
35 #define VOID (&void_pseudo)
38 struct basic_block
*target
;
42 struct asm_constraint
{
44 const char *constraint
;
45 const struct ident
*ident
;
48 DECLARE_PTR_LIST(asm_constraint_list
, struct asm_constraint
);
51 struct asm_constraint_list
*inputs
;
52 struct asm_constraint_list
*outputs
;
53 struct asm_constraint_list
*clobbers
;
59 struct basic_block
*bb
;
63 pseudo_t cond
; /* for branch and switch */
66 struct /* entrypoint */ {
67 struct pseudo_list
*arg_list
;
70 struct basic_block
*bb_true
, *bb_false
;
73 struct multijmp_list
*multijmp_list
;
75 struct /* phi_node */ {
76 struct pseudo_list
*phi_list
;
78 struct /* phi source */ {
80 struct instruction_list
*phi_users
;
84 struct symbol
*orig_type
; /* casts */
85 unsigned int offset
; /* memops */
87 struct /* binops and sel */ {
88 pseudo_t src1
, src2
, src3
;
94 struct /* multijump */ {
98 pseudo_t symbol
; /* Subtle: same offset as "src" !! */
99 struct expression
*val
;
103 struct pseudo_list
*arguments
;
105 struct /* context */ {
108 struct expression
*context_expr
;
112 struct asm_rules
*asm_rules
;
125 OP_RET
= OP_TERMINATOR
,
131 OP_TERMINATOR_END
= OP_UNWIND
,
149 OP_BINARY_END
= OP_OR_BOOL
,
151 /* Binary comparison */
153 OP_SET_EQ
= OP_BINCMP
,
163 OP_BINCMP_END
= OP_SET_AE
,
169 /* Select - three input values */
199 /* Sparse tagging (line numbers, context, whatever) */
203 /* Needed to translate SSA back to normal form */
207 struct basic_block_list
;
208 struct instruction_list
;
212 unsigned long generation
;
214 struct entrypoint
*ep
;
215 struct basic_block_list
*parents
; /* sources */
216 struct basic_block_list
*children
; /* destinations */
217 struct instruction_list
*insns
; /* Linear list of instructions */
218 struct pseudo_list
*needs
, *defines
;
221 static inline int is_branch_goto(struct instruction
*br
)
223 return br
&& br
->opcode
==OP_BR
&& (!br
->bb_true
|| !br
->bb_false
);
226 static inline void add_bb(struct basic_block_list
**list
, struct basic_block
*bb
)
228 add_ptr_list(list
, bb
);
231 static inline void add_instruction(struct instruction_list
**list
, struct instruction
*insn
)
233 add_ptr_list(list
, insn
);
236 static inline void add_multijmp(struct multijmp_list
**list
, struct multijmp
*multijmp
)
238 add_ptr_list(list
, multijmp
);
241 static inline pseudo_t
*add_pseudo(struct pseudo_list
**list
, pseudo_t pseudo
)
243 return add_ptr_list(list
, pseudo
);
246 static inline int remove_pseudo(struct pseudo_list
**list
, pseudo_t pseudo
)
248 return delete_ptr_list_entry((struct ptr_list
**)list
, pseudo
, 0) != 0;
251 static inline int bb_terminated(struct basic_block
*bb
)
253 struct instruction
*insn
;
256 insn
= last_instruction(bb
->insns
);
257 return insn
&& insn
->opcode
>= OP_TERMINATOR
258 && insn
->opcode
<= OP_TERMINATOR_END
;
261 static inline int bb_reachable(struct basic_block
*bb
)
266 static inline void add_pseudo_ptr(pseudo_t
*ptr
, struct pseudo_ptr_list
**list
)
268 add_ptr_list(list
, ptr
);
271 static inline int has_use_list(pseudo_t p
)
273 return (p
&& p
->type
!= PSEUDO_VOID
&& p
->type
!= PSEUDO_VAL
);
276 static inline void use_pseudo(pseudo_t p
, pseudo_t
*pp
)
280 add_pseudo_ptr(pp
, &p
->users
);
283 static inline void remove_bb_from_list(struct basic_block_list
**list
, struct basic_block
*entry
, int count
)
285 delete_ptr_list_entry((struct ptr_list
**)list
, entry
, count
);
288 static inline void replace_bb_in_list(struct basic_block_list
**list
,
289 struct basic_block
*old
, struct basic_block
*new, int count
)
291 replace_ptr_list_entry((struct ptr_list
**)list
, old
, new, count
);
296 struct symbol_list
*syms
;
297 struct symbol_list
*accesses
;
298 struct basic_block_list
*bbs
;
299 struct basic_block
*active
;
300 struct instruction
*entry
;
303 extern void insert_select(struct basic_block
*bb
, struct instruction
*br
, struct instruction
*phi
, pseudo_t
true, pseudo_t
false);
304 extern void insert_branch(struct basic_block
*bb
, struct instruction
*br
, struct basic_block
*target
);
306 pseudo_t
alloc_phi(struct basic_block
*source
, pseudo_t pseudo
, int size
);
307 pseudo_t
alloc_pseudo(struct instruction
*def
);
308 pseudo_t
value_pseudo(long long val
);
310 struct entrypoint
*linearize_symbol(struct symbol
*sym
);
311 int unssa(struct entrypoint
*ep
);
312 void show_entry(struct entrypoint
*ep
);
313 const char *show_pseudo(pseudo_t pseudo
);
314 void show_bb(struct basic_block
*bb
);
315 const char *show_instruction(struct instruction
*insn
);
317 #endif /* LINEARIZE_H */