6 void mark_variable (struct variable
*var
, enum variabletype type
, int num
)
13 useel
= list_head (var
->uses
);
15 struct operation
*use
= element_getvalue (useel
);
16 if (use
->type
== OP_PHI
) {
17 phiel
= list_head (use
->operands
);
19 struct value
*val
= element_getvalue (phiel
);
20 if (val
->val
.variable
->type
== VARIABLE_UNK
) {
21 mark_variable (val
->val
.variable
, type
, num
);
23 phiel
= element_next (phiel
);
25 val
= list_headvalue (use
->results
);
26 if (val
->val
.variable
->type
== VARIABLE_UNK
)
27 mark_variable (val
->val
.variable
, type
, num
);
29 useel
= element_next (useel
);
32 if (var
->def
->type
== OP_PHI
) {
33 phiel
= list_head (var
->def
->operands
);
35 struct value
*val
= element_getvalue (phiel
);
36 if (val
->val
.variable
->type
== VARIABLE_UNK
) {
37 mark_variable (val
->val
.variable
, type
, num
);
39 phiel
= element_next (phiel
);
44 void extract_variables (struct subroutine
*sub
)
49 varel
= list_head (sub
->variables
);
51 struct variable
*var
= element_getvalue (varel
);
52 if (var
->type
== VARIABLE_UNK
) {
53 if (var
->def
->type
== OP_START
) {
54 mark_variable (var
, VARIABLE_ARGUMENT
, var
->name
.val
.intval
);
55 } else if (var
->def
->type
== OP_CALL
&& var
->name
.val
.intval
!= 2 &&
56 var
->name
.val
.intval
!= 3) {
57 var
->type
= VARIABLE_INVALID
;
61 if (list_size (var
->uses
) <= 1) {
62 struct operation
*op
= list_headvalue (var
->uses
);
64 if (op
->type
!= OP_PHI
)
71 if (var
->def
->type
== OP_MOVE
|| var
->def
->type
== OP_INSTRUCTION
) {
72 if (var
->def
->type
== OP_INSTRUCTION
) {
73 if (var
->def
->info
.iop
.loc
->insn
->flags
& (INSN_LOAD
| INSN_STORE
| INSN_BRANCH
))
81 var
->def
->deferred
= TRUE
;
82 var
->type
= VARIABLE_TEMP
;
85 mark_variable (var
, VARIABLE_LOCAL
, ++count
);
89 varel
= element_next (varel
);