sourcepawn/decompiler/code_analyzer.h
author David Anderson <dvander@alliedmods.net>
Sat Sep 27 15:34:59 2008 -0500 (2008-09-27)
changeset 2325 7a24ee5557fb
parent 2322 2125ced692ac
permissions -rw-r--r--
Fixed building on GCC and some valgrind warnings. Read .dbg.natives table now.
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@2325
   129
	unsigned int dimcount;
dvander@2320
   130
	DeclNode *new_stmt;
dvander@2320
   131
};
dvander@2320
   132
dvander@2320
   133
struct FunctionInfo
dvander@2320
   134
{
dvander@2320
   135
	char name[64];
dvander@2320
   136
	sp_fdbg_symbol_t *sym;
dvander@2320
   137
	FuncVar known_args[SP_MAX_EXEC_PARAMS];
dvander@2320
   138
	unsigned int num_known_args;
dvander@2320
   139
	sp_tag_t *tag;
dvander@2320
   140
	uint32_t code_addr;
dvander@2320
   141
	uint32_t code_end;
dvander@2320
   142
	bool is_public;
dvander@2320
   143
	FunctionInfo *next;
dvander@2320
   144
	FuncVar *known_vars;
dvander@2320
   145
	unsigned int num_known_vars;
dvander@2320
   146
};
dvander@2320
   147
dvander@2320
   148
struct sp_decomp_t;
dvander@2320
   149
dvander@2320
   150
int Sp_DecompFunction(sp_decomp_t *dc, uint32_t code_addr, bool is_public);
dvander@2320
   151
dvander@2320
   152
#endif //_INCLUDE_SP_DECOMP_CODE_ANALYZER_H_