sourcepawn/jit/x86/jit_x86.h
author Scott Ehlert <ds@alliedmods.net>
Sun Jul 15 08:00:26 2007 +0000 (2007-07-15)
changeset 1116 40cc5e9f0f1b
parent 831 1995c0dd5c04
child 1330 ab94316bb52b
permissions -rw-r--r--
Removed strange debugging code
dvander@367
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@371
     3
 * ================================================================
dvander@371
     4
 * SourcePawn (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@371
     5
 * ================================================================
dvander@367
     6
 *
dvander@367
     7
 * This file is not open source and may not be copied without explicit
dvander@367
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@367
     9
 * in whole or significant part.
dvander@367
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@367
    11
 *
dvander@367
    12
 * Version: $Id$
dvander@367
    13
 */
dvander@367
    14
dvander@157
    15
#ifndef _INCLUDE_SOURCEPAWN_JIT_X86_H_
dvander@157
    16
#define _INCLUDE_SOURCEPAWN_JIT_X86_H_
dvander@157
    17
dvander@157
    18
#include <sp_vm_types.h>
dvander@157
    19
#include <sp_vm_api.h>
dvander@706
    20
#include <jit_helpers.h>
dvander@157
    21
dvander@157
    22
using namespace SourcePawn;
dvander@157
    23
dvander@157
    24
#define JIT_INLINE_ERRORCHECKS		(1<<0)
dvander@157
    25
#define JIT_INLINE_NATIVES			(1<<1)
dvander@175
    26
#define STACK_MARGIN				64			//8 parameters of safety, I guess
dvander@175
    27
#define JIT_FUNCMAGIC				0x214D4148	//magic function offset
dvander@157
    28
dvander@157
    29
#define JITVARS_TRACKER				0		//important: don't change this to avoid trouble
dvander@175
    30
#define JITVARS_FUNCINFO			1		//important: don't change this aWOAWOGJQG I LIKE HAM
dvander@344
    31
#define JITVARS_REBASE				2		//important: hi, i'm bail
dvander@157
    32
dvander@157
    33
typedef struct tracker_s
dvander@157
    34
{
dvander@157
    35
	size_t size; 
dvander@157
    36
	ucell_t *pBase; 
dvander@157
    37
	ucell_t *pCur;
dvander@157
    38
} tracker_t;
dvander@157
    39
dvander@175
    40
typedef struct funcinfo_s
dvander@175
    41
{
dvander@175
    42
	unsigned int magic;
dvander@175
    43
	unsigned int index;
dvander@175
    44
} funcinfo_t;
dvander@175
    45
dvander@175
    46
typedef struct functracker_s
dvander@175
    47
{
dvander@175
    48
	unsigned int num_functions;
dvander@175
    49
	unsigned int code_size;
dvander@175
    50
} functracker_t;
dvander@175
    51
faluco@831
    52
struct floattbl_t
faluco@831
    53
{
faluco@831
    54
	floattbl_t()
faluco@831
    55
	{
faluco@831
    56
		found = false;
faluco@831
    57
		index = 0;
faluco@831
    58
	}
faluco@831
    59
	bool found;
faluco@831
    60
	unsigned int index;
faluco@831
    61
};
faluco@831
    62
dvander@157
    63
class CompData : public ICompilation
dvander@157
    64
{
dvander@157
    65
public:
dvander@157
    66
	CompData() : plugin(NULL), 
dvander@157
    67
		debug(false), inline_level(0), rebase(NULL),
dvander@175
    68
		error_set(SP_ERROR_NONE), func_idx(0)
dvander@157
    69
	{
dvander@157
    70
	};
dvander@157
    71
public:
dvander@157
    72
	sp_plugin_t *plugin;			/* plugin handle */
dvander@350
    73
	bool debug;						/* whether to compile debug mode */
dvander@350
    74
	int inline_level;				/* inline optimization level */
dvander@157
    75
	jitcode_t rebase;				/* relocation map */
dvander@350
    76
	int error_set;					/* error code to halt process */
dvander@350
    77
	unsigned int func_idx;			/* current function index */
dvander@157
    78
	jitoffs_t jit_return;			/* point in main call to return to */
dvander@157
    79
	jitoffs_t jit_verify_addr_eax;
dvander@157
    80
	jitoffs_t jit_verify_addr_edx;
dvander@157
    81
	jitoffs_t jit_break;			/* call to op.break */
dvander@157
    82
	jitoffs_t jit_sysreq_n;			/* call version of op.sysreq.n */
dvander@157
    83
	jitoffs_t jit_genarray;			/* call to genarray intrinsic */
dvander@157
    84
	jitoffs_t jit_error_bounds;
dvander@157
    85
	jitoffs_t jit_error_divzero;
dvander@157
    86
	jitoffs_t jit_error_stacklow;
dvander@157
    87
	jitoffs_t jit_error_stackmin;
dvander@157
    88
	jitoffs_t jit_error_memaccess;
dvander@157
    89
	jitoffs_t jit_error_heaplow;
dvander@157
    90
	jitoffs_t jit_error_heapmin;
dvander@157
    91
	jitoffs_t jit_error_array_too_big;
dvander@157
    92
	jitoffs_t jit_extern_error;		/* returning generic error */
dvander@157
    93
	jitoffs_t jit_sysreq_c;			/* old version! */
faluco@831
    94
	jitoffs_t jit_rounding_table;
faluco@831
    95
	floattbl_t *jit_float_table;
dvander@157
    96
	uint32_t codesize;				/* total codesize */
dvander@157
    97
};
dvander@157
    98
dvander@157
    99
class JITX86 : public IVirtualMachine
dvander@157
   100
{
dvander@157
   101
public:
dvander@157
   102
	const char *GetVMName();
dvander@157
   103
	ICompilation *StartCompilation(sp_plugin_t *plugin);
dvander@157
   104
	bool SetCompilationOption(ICompilation *co, const char *key, const char *val);
dvander@157
   105
	sp_context_t *CompileToContext(ICompilation *co, int *err);
dvander@157
   106
	void AbortCompilation(ICompilation *co);
dvander@157
   107
	void FreeContext(sp_context_t *ctx);
dvander@157
   108
	int ContextExecute(sp_context_t *ctx, uint32_t code_idx, cell_t *result);
dvander@175
   109
	unsigned int GetAPIVersion();
dvander@175
   110
	bool FunctionLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result);
dvander@344
   111
	bool FunctionPLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result);
dvander@175
   112
	unsigned int FunctionCount(const sp_context_t *ctx);
dvander@253
   113
	const char *GetVersionString();
dvander@253
   114
	const char *GetCPUOptimizations();
dvander@601
   115
	SPVM_NATIVE_FUNC CreateFakeNative(SPVM_FAKENATIVE_FUNC callback, void *pData);
dvander@605
   116
	void DestroyFakeNative(SPVM_NATIVE_FUNC func);
dvander@157
   117
};
dvander@157
   118
dvander@157
   119
cell_t NativeCallback(sp_context_t *ctx, ucell_t native_idx, cell_t *params);
dvander@157
   120
cell_t NativeCallback_Debug(sp_context_t *ctx, ucell_t native_idx, cell_t *params);
dvander@157
   121
jitoffs_t RelocLookup(JitWriter *jit, cell_t pcode_offs, bool relative=false);
dvander@157
   122
dvander@157
   123
#define AMX_REG_PRI		REG_EAX
dvander@157
   124
#define AMX_REG_ALT		REG_EDX
dvander@157
   125
#define AMX_REG_STK		REG_EDI
dvander@157
   126
#define AMX_REG_DAT		REG_EBP
dvander@157
   127
#define AMX_REG_TMP		REG_ECX
dvander@157
   128
#define AMX_REG_INFO	REG_ESI
dvander@157
   129
#define AMX_REG_FRM		REG_EBX
dvander@157
   130
dvander@157
   131
#define AMX_INFO_FRM		AMX_REG_INFO	//not relocated
dvander@157
   132
#define AMX_INFO_FRAME		0				//(same thing as above) 
dvander@157
   133
#define AMX_INFO_HEAP		4				//not relocated
dvander@157
   134
#define AMX_INFO_RETVAL		8				//physical
dvander@157
   135
#define AMX_INFO_CONTEXT	12				//physical
dvander@157
   136
#define AMX_INFO_STACKTOP	16				//relocated
dvander@157
   137
dvander@157
   138
extern ISourcePawnEngine *engine;
dvander@157
   139
dvander@157
   140
#endif //_INCLUDE_SOURCEPAWN_JIT_X86_H_