dvander@2320: #ifndef _INCLUDE_SP_DECOMP_CODE_ANALYZER_H_ dvander@2320: #define _INCLUDE_SP_DECOMP_CODE_ANALYZER_H_ dvander@2320: dvander@2320: #include dvander@2320: dvander@2320: enum Opcode dvander@2320: { dvander@2322: _OP_VAR = -1, /* Variable container */ dvander@2322: _OP_STMT = -2, /* Statement contained */ dvander@2322: _OP_CONST = -3, /* Constant value */ dvander@2322: _OP_STORE = -4, /* Store operation (binary assignment) */ dvander@2322: _OP_NEW = -5, /* Variable declaration */ dvander@2322: _OP_MODULO = -6, /* Binary modulo operator */ dvander@2322: _OP_DEFINE = -7, /* "define" node for SSA */ dvander@2322: _OP_USE = -8, /* "use" node for SSA */ dvander@2320: #define OPDEF(num,name,str,params) \ dvander@2320: OP_##name = num, dvander@2320: #include "opcodes.tbl" dvander@2320: #undef OPDEF dvander@2320: }; dvander@2320: dvander@2320: struct sp_opdef_t dvander@2320: { dvander@2320: const char *name; dvander@2320: int params; dvander@2320: }; dvander@2320: dvander@2320: struct FuncVar; dvander@2320: dvander@2320: struct BaseNode dvander@2320: { dvander@2320: BaseNode(cell_t _op) : op(_op) dvander@2320: { dvander@2320: } dvander@2320: cell_t op; dvander@2320: }; dvander@2320: dvander@2320: struct ConstNode : public BaseNode dvander@2320: { dvander@2320: ConstNode(cell_t _val) : BaseNode(_OP_CONST), val(_val) dvander@2320: { dvander@2320: } dvander@2320: cell_t val; dvander@2320: }; dvander@2320: dvander@2320: struct StmtNode : public BaseNode dvander@2320: { dvander@2320: StmtNode(cell_t _op, BaseNode *_node, StmtNode *_next) : BaseNode(_op) dvander@2320: , node(_node) dvander@2320: , next(_next) dvander@2320: { dvander@2320: } dvander@2320: BaseNode *node; dvander@2320: StmtNode *next; dvander@2320: }; dvander@2320: dvander@2320: struct FunctionInfo; dvander@2320: dvander@2320: struct CallNode : public BaseNode dvander@2320: { dvander@2320: CallNode(FunctionInfo *f, BaseNode **t, unsigned int c) : BaseNode(OP_CALL) dvander@2320: , func(f) dvander@2320: , args(t) dvander@2320: , argc(c) dvander@2320: { dvander@2320: } dvander@2320: FunctionInfo *func; dvander@2320: BaseNode **args; dvander@2320: unsigned int argc; dvander@2320: }; dvander@2320: dvander@2320: struct DefineNode : public BaseNode dvander@2320: { dvander@2322: DefineNode(BaseNode *o, const char *fmt, ...); dvander@2320: char name[32]; dvander@2322: BaseNode *other; dvander@2322: }; dvander@2322: dvander@2322: struct UseNode : public BaseNode dvander@2322: { dvander@2322: UseNode(DefineNode *n) : BaseNode(_OP_USE), def(n) dvander@2322: { dvander@2322: } dvander@2322: DefineNode *def; dvander@2320: }; dvander@2320: dvander@2320: struct UnaryNode : public BaseNode dvander@2320: { dvander@2320: UnaryNode(cell_t _op, BaseNode *_node) : BaseNode(_op), node(_node) dvander@2320: { dvander@2320: } dvander@2320: BaseNode *node; dvander@2320: }; dvander@2320: dvander@2320: struct VarNode : public BaseNode dvander@2320: { dvander@2320: VarNode(FuncVar *_var) : BaseNode(_OP_VAR), var(_var) dvander@2320: { dvander@2320: } dvander@2320: FuncVar *var; dvander@2320: }; dvander@2320: dvander@2320: struct BinOpNode : public BaseNode dvander@2320: { dvander@2320: BinOpNode(cell_t _op, BaseNode *_left, BaseNode *_right) : BaseNode(_op) dvander@2320: ,left(_left) dvander@2320: ,right(_right) dvander@2320: { dvander@2320: } dvander@2320: BaseNode *left; dvander@2320: BaseNode *right; dvander@2320: }; dvander@2320: dvander@2320: struct DeclNode : public BaseNode dvander@2320: { dvander@2320: DeclNode(VarNode *_var, BaseNode *_expr) : BaseNode(_OP_NEW), var(_var), expr(_expr) dvander@2320: { dvander@2320: } dvander@2320: VarNode *var; dvander@2320: BaseNode *expr; dvander@2320: }; dvander@2320: dvander@2320: struct FuncVar dvander@2320: { dvander@2320: sp_fdbg_symbol_t *sym; dvander@2320: sp_fdbg_arraydim_t *dims; dvander@2320: sp_tag_t *tag; dvander@2320: const char *name; dvander@2320: DeclNode *new_stmt; dvander@2320: }; dvander@2320: dvander@2320: struct FunctionInfo dvander@2320: { dvander@2320: char name[64]; dvander@2320: sp_fdbg_symbol_t *sym; dvander@2320: FuncVar known_args[SP_MAX_EXEC_PARAMS]; dvander@2320: unsigned int num_known_args; dvander@2320: sp_tag_t *tag; dvander@2320: uint32_t code_addr; dvander@2320: uint32_t code_end; dvander@2320: bool is_public; dvander@2320: FunctionInfo *next; dvander@2320: FuncVar *known_vars; dvander@2320: unsigned int num_known_vars; dvander@2320: }; dvander@2320: dvander@2320: struct sp_decomp_t; dvander@2320: dvander@2320: int Sp_DecompFunction(sp_decomp_t *dc, uint32_t code_addr, bool is_public); dvander@2320: dvander@2320: #endif //_INCLUDE_SP_DECOMP_CODE_ANALYZER_H_