sourcepawn/decompiler/code_analyzer.h
author David Anderson <dvander@alliedmods.net>
Tue Sep 23 22:00:47 2008 -0700 (2008-09-23)
changeset 2322 2125ced692ac
parent 2320 88550c031d23
child 2325 7a24ee5557fb
permissions -rw-r--r--
Added some notion of def-use to unfold copy propagation across registers and the eval stack.
At some point we will need to walk the expr tree to fold this back where appropriate, i.e. single use for calls.
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_