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