sourcepawn/decompiler/code_analyzer.h
author David Anderson <dvander@alliedmods.net>
Tue Sep 23 21:20:40 2008 -0700 (2008-09-23)
changeset 2320 88550c031d23
child 2322 2125ced692ac
permissions -rw-r--r--
Initial import/sketch of opcode analyzer (bug 3279).
Uses single static assignment to recover expression trees from straight-line byte code.
     1 #ifndef _INCLUDE_SP_DECOMP_CODE_ANALYZER_H_
     2 #define _INCLUDE_SP_DECOMP_CODE_ANALYZER_H_
     3 
     4 #include <sp_vm_types.h>
     5 
     6 enum Opcode
     7 {
     8 	_OP_VAR		= -1,
     9 	_OP_STMT	= -2,
    10 	_OP_CONST	= -3,
    11 	_OP_STORE	= -4,
    12 	_OP_NEW		= -5,
    13 	_OP_MODULO	= -6,
    14 	_OP_EMPTY	= -7,
    15 #define OPDEF(num,name,str,params) \
    16 	OP_##name = num,
    17 #include "opcodes.tbl"
    18 #undef OPDEF
    19 };
    20 
    21 struct sp_opdef_t
    22 {
    23 	const char *name;
    24 	int params;
    25 };
    26 
    27 struct FuncVar;
    28 
    29 struct BaseNode
    30 {
    31 	BaseNode(cell_t _op) : op(_op)
    32 	{
    33 	}
    34 	cell_t op;
    35 };
    36 
    37 struct ConstNode : public BaseNode
    38 {
    39 	ConstNode(cell_t _val) : BaseNode(_OP_CONST), val(_val)
    40 	{
    41 	}
    42 	cell_t val;
    43 };
    44 
    45 struct StmtNode : public BaseNode
    46 {
    47 	StmtNode(cell_t _op, BaseNode *_node, StmtNode *_next) : BaseNode(_op)
    48 		, node(_node)
    49 		, next(_next)
    50 	{
    51 	}
    52 	BaseNode *node;
    53 	StmtNode *next;
    54 };
    55 
    56 struct FunctionInfo;
    57 
    58 struct CallNode : public BaseNode
    59 {
    60 	CallNode(FunctionInfo *f, BaseNode **t, unsigned int c) : BaseNode(OP_CALL)
    61 		, func(f)
    62 		, args(t)
    63 		, argc(c)
    64 	{
    65 	}
    66 	FunctionInfo *func;
    67 	BaseNode **args;
    68 	unsigned int argc;
    69 };
    70 
    71 struct DefineNode : public BaseNode
    72 {
    73 	TempNode(const char *name
    74 	char name[32];
    75 };
    76 
    77 struct UnaryNode : public BaseNode
    78 {
    79 	UnaryNode(cell_t _op, BaseNode *_node) : BaseNode(_op), node(_node)
    80 	{
    81 	}
    82 	BaseNode *node;
    83 };
    84 
    85 struct VarNode : public BaseNode
    86 {
    87 	VarNode(FuncVar *_var) : BaseNode(_OP_VAR), var(_var)
    88 	{
    89 	}
    90 	FuncVar *var;
    91 };
    92 
    93 struct BinOpNode : public BaseNode
    94 {
    95 	BinOpNode(cell_t _op, BaseNode *_left, BaseNode *_right) : BaseNode(_op)
    96 		,left(_left)
    97 		,right(_right)
    98 	{
    99 	}
   100 	BaseNode *left;
   101 	BaseNode *right;
   102 };
   103 
   104 struct DeclNode : public BaseNode
   105 {
   106 	DeclNode(VarNode *_var, BaseNode *_expr) : BaseNode(_OP_NEW), var(_var), expr(_expr)
   107 	{
   108 	}
   109 	VarNode *var;
   110 	BaseNode *expr;
   111 };
   112 
   113 struct FuncVar
   114 {
   115 	sp_fdbg_symbol_t *sym;
   116 	sp_fdbg_arraydim_t *dims;
   117 	sp_tag_t *tag;
   118 	const char *name;
   119 	DeclNode *new_stmt;
   120 };
   121 
   122 struct FunctionInfo
   123 {
   124 	char name[64];
   125 	sp_fdbg_symbol_t *sym;
   126 	FuncVar known_args[SP_MAX_EXEC_PARAMS];
   127 	unsigned int num_known_args;
   128 	sp_tag_t *tag;
   129 	uint32_t code_addr;
   130 	uint32_t code_end;
   131 	bool is_public;
   132 	FunctionInfo *next;
   133 	FuncVar *known_vars;
   134 	unsigned int num_known_vars;
   135 };
   136 
   137 struct sp_decomp_t;
   138 
   139 int Sp_DecompFunction(sp_decomp_t *dc, uint32_t code_addr, bool is_public);
   140 
   141 #endif //_INCLUDE_SP_DECOMP_CODE_ANALYZER_H_