|
dvander@2320
|
1 |
#ifndef _INCLUDE_SP_DECOMP_CODE_ANALYZER_H_ |
|
dvander@2320
|
2 |
#define _INCLUDE_SP_DECOMP_CODE_ANALYZER_H_ |
|
dvander@2320
|
3 |
|
|
dvander@2320
|
4 |
#include <sp_vm_types.h> |
|
dvander@2320
|
5 |
|
|
dvander@2320
|
6 |
enum Opcode |
|
dvander@2320
|
7 |
{ |
|
dvander@2322
|
8 |
_OP_VAR = -1, /* Variable container */ |
|
dvander@2322
|
9 |
_OP_STMT = -2, /* Statement contained */ |
|
dvander@2322
|
10 |
_OP_CONST = -3, /* Constant value */ |
|
dvander@2322
|
11 |
_OP_STORE = -4, /* Store operation (binary assignment) */ |
|
dvander@2322
|
12 |
_OP_NEW = -5, /* Variable declaration */ |
|
dvander@2322
|
13 |
_OP_MODULO = -6, /* Binary modulo operator */ |
|
dvander@2322
|
14 |
_OP_DEFINE = -7, /* "define" node for SSA */ |
|
dvander@2322
|
15 |
_OP_USE = -8, /* "use" node for SSA */ |
|
dvander@2320
|
16 |
#define OPDEF(num,name,str,params) \ |
|
dvander@2320
|
17 |
OP_##name = num, |
|
dvander@2320
|
18 |
#include "opcodes.tbl" |
|
dvander@2320
|
19 |
#undef OPDEF |
|
dvander@2320
|
20 |
}; |
|
dvander@2320
|
21 |
|
|
dvander@2320
|
22 |
struct sp_opdef_t |
|
dvander@2320
|
23 |
{ |
|
dvander@2320
|
24 |
const char *name; |
|
dvander@2320
|
25 |
int params; |
|
dvander@2320
|
26 |
}; |
|
dvander@2320
|
27 |
|
|
dvander@2320
|
28 |
struct FuncVar; |
|
dvander@2320
|
29 |
|
|
dvander@2320
|
30 |
struct BaseNode |
|
dvander@2320
|
31 |
{ |
|
dvander@2320
|
32 |
BaseNode(cell_t _op) : op(_op) |
|
dvander@2320
|
33 |
{ |
|
dvander@2320
|
34 |
} |
|
dvander@2320
|
35 |
cell_t op; |
|
dvander@2320
|
36 |
}; |
|
dvander@2320
|
37 |
|
|
dvander@2320
|
38 |
struct ConstNode : public BaseNode |
|
dvander@2320
|
39 |
{ |
|
dvander@2320
|
40 |
ConstNode(cell_t _val) : BaseNode(_OP_CONST), val(_val) |
|
dvander@2320
|
41 |
{ |
|
dvander@2320
|
42 |
} |
|
dvander@2320
|
43 |
cell_t val; |
|
dvander@2320
|
44 |
}; |
|
dvander@2320
|
45 |
|
|
dvander@2320
|
46 |
struct StmtNode : public BaseNode |
|
dvander@2320
|
47 |
{ |
|
dvander@2320
|
48 |
StmtNode(cell_t _op, BaseNode *_node, StmtNode *_next) : BaseNode(_op) |
|
dvander@2320
|
49 |
, node(_node) |
|
dvander@2320
|
50 |
, next(_next) |
|
dvander@2320
|
51 |
{ |
|
dvander@2320
|
52 |
} |
|
dvander@2320
|
53 |
BaseNode *node; |
|
dvander@2320
|
54 |
StmtNode *next; |
|
dvander@2320
|
55 |
}; |
|
dvander@2320
|
56 |
|
|
dvander@2320
|
57 |
struct FunctionInfo; |
|
dvander@2320
|
58 |
|
|
dvander@2320
|
59 |
struct CallNode : public BaseNode |
|
dvander@2320
|
60 |
{ |
|
dvander@2320
|
61 |
CallNode(FunctionInfo *f, BaseNode **t, unsigned int c) : BaseNode(OP_CALL) |
|
dvander@2320
|
62 |
, func(f) |
|
dvander@2320
|
63 |
, args(t) |
|
dvander@2320
|
64 |
, argc(c) |
|
dvander@2320
|
65 |
{ |
|
dvander@2320
|
66 |
} |
|
dvander@2320
|
67 |
FunctionInfo *func; |
|
dvander@2320
|
68 |
BaseNode **args; |
|
dvander@2320
|
69 |
unsigned int argc; |
|
dvander@2320
|
70 |
}; |
|
dvander@2320
|
71 |
|
|
dvander@2320
|
72 |
struct DefineNode : public BaseNode |
|
dvander@2320
|
73 |
{ |
|
dvander@2322
|
74 |
DefineNode(BaseNode *o, const char *fmt, ...); |
|
dvander@2320
|
75 |
char name[32]; |
|
dvander@2322
|
76 |
BaseNode *other; |
|
dvander@2322
|
77 |
}; |
|
dvander@2322
|
78 |
|
|
dvander@2322
|
79 |
struct UseNode : public BaseNode |
|
dvander@2322
|
80 |
{ |
|
dvander@2322
|
81 |
UseNode(DefineNode *n) : BaseNode(_OP_USE), def(n) |
|
dvander@2322
|
82 |
{ |
|
dvander@2322
|
83 |
} |
|
dvander@2322
|
84 |
DefineNode *def; |
|
dvander@2320
|
85 |
}; |
|
dvander@2320
|
86 |
|
|
dvander@2320
|
87 |
struct UnaryNode : public BaseNode |
|
dvander@2320
|
88 |
{ |
|
dvander@2320
|
89 |
UnaryNode(cell_t _op, BaseNode *_node) : BaseNode(_op), node(_node) |
|
dvander@2320
|
90 |
{ |
|
dvander@2320
|
91 |
} |
|
dvander@2320
|
92 |
BaseNode *node; |
|
dvander@2320
|
93 |
}; |
|
dvander@2320
|
94 |
|
|
dvander@2320
|
95 |
struct VarNode : public BaseNode |
|
dvander@2320
|
96 |
{ |
|
dvander@2320
|
97 |
VarNode(FuncVar *_var) : BaseNode(_OP_VAR), var(_var) |
|
dvander@2320
|
98 |
{ |
|
dvander@2320
|
99 |
} |
|
dvander@2320
|
100 |
FuncVar *var; |
|
dvander@2320
|
101 |
}; |
|
dvander@2320
|
102 |
|
|
dvander@2320
|
103 |
struct BinOpNode : public BaseNode |
|
dvander@2320
|
104 |
{ |
|
dvander@2320
|
105 |
BinOpNode(cell_t _op, BaseNode *_left, BaseNode *_right) : BaseNode(_op) |
|
dvander@2320
|
106 |
,left(_left) |
|
dvander@2320
|
107 |
,right(_right) |
|
dvander@2320
|
108 |
{ |
|
dvander@2320
|
109 |
} |
|
dvander@2320
|
110 |
BaseNode *left; |
|
dvander@2320
|
111 |
BaseNode *right; |
|
dvander@2320
|
112 |
}; |
|
dvander@2320
|
113 |
|
|
dvander@2320
|
114 |
struct DeclNode : public BaseNode |
|
dvander@2320
|
115 |
{ |
|
dvander@2320
|
116 |
DeclNode(VarNode *_var, BaseNode *_expr) : BaseNode(_OP_NEW), var(_var), expr(_expr) |
|
dvander@2320
|
117 |
{ |
|
dvander@2320
|
118 |
} |
|
dvander@2320
|
119 |
VarNode *var; |
|
dvander@2320
|
120 |
BaseNode *expr; |
|
dvander@2320
|
121 |
}; |
|
dvander@2320
|
122 |
|
|
dvander@2320
|
123 |
struct FuncVar |
|
dvander@2320
|
124 |
{ |
|
dvander@2320
|
125 |
sp_fdbg_symbol_t *sym; |
|
dvander@2320
|
126 |
sp_fdbg_arraydim_t *dims; |
|
dvander@2320
|
127 |
sp_tag_t *tag; |
|
dvander@2320
|
128 |
const char *name; |
|
dvander@2320
|
129 |
DeclNode *new_stmt; |
|
dvander@2320
|
130 |
}; |
|
dvander@2320
|
131 |
|
|
dvander@2320
|
132 |
struct FunctionInfo |
|
dvander@2320
|
133 |
{ |
|
dvander@2320
|
134 |
char name[64]; |
|
dvander@2320
|
135 |
sp_fdbg_symbol_t *sym; |
|
dvander@2320
|
136 |
FuncVar known_args[SP_MAX_EXEC_PARAMS]; |
|
dvander@2320
|
137 |
unsigned int num_known_args; |
|
dvander@2320
|
138 |
sp_tag_t *tag; |
|
dvander@2320
|
139 |
uint32_t code_addr; |
|
dvander@2320
|
140 |
uint32_t code_end; |
|
dvander@2320
|
141 |
bool is_public; |
|
dvander@2320
|
142 |
FunctionInfo *next; |
|
dvander@2320
|
143 |
FuncVar *known_vars; |
|
dvander@2320
|
144 |
unsigned int num_known_vars; |
|
dvander@2320
|
145 |
}; |
|
dvander@2320
|
146 |
|
|
dvander@2320
|
147 |
struct sp_decomp_t; |
|
dvander@2320
|
148 |
|
|
dvander@2320
|
149 |
int Sp_DecompFunction(sp_decomp_t *dc, uint32_t code_addr, bool is_public); |
|
dvander@2320
|
150 |
|
|
dvander@2320
|
151 |
#endif //_INCLUDE_SP_DECOMP_CODE_ANALYZER_H_ |