mirror of https://github.com/ademakov/libjit
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
7.5 KiB
226 lines
7.5 KiB
/*
|
|
* jit-interp.h - Bytecode interpreter for platforms without native support.
|
|
*
|
|
* Copyright (C) 2004 Southern Storm Software, Pty Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef _JIT_INTERP_H
|
|
#define _JIT_INTERP_H
|
|
|
|
#include "jit-internal.h"
|
|
#include "jit-apply-rules.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* Structure of a stack item.
|
|
*/
|
|
typedef union
|
|
{
|
|
jit_int int_value;
|
|
jit_uint uint_value;
|
|
jit_long long_value;
|
|
jit_ulong ulong_value;
|
|
jit_float32 float32_value;
|
|
jit_float64 float64_value;
|
|
jit_nfloat nfloat_value;
|
|
void *ptr_value;
|
|
#if JIT_APPLY_MAX_STRUCT_IN_REG != 0
|
|
char struct_value[JIT_APPLY_MAX_STRUCT_IN_REG];
|
|
#endif
|
|
|
|
} jit_item;
|
|
|
|
/*
|
|
* Number of items that make up a struct or union value on the stack.
|
|
*/
|
|
#define JIT_NUM_ITEMS_IN_STRUCT(size) \
|
|
(((size) + (sizeof(jit_item) - 1)) / sizeof(jit_item))
|
|
|
|
/*
|
|
* Information that is prefixed to a function that describes
|
|
* its interpretation context. The code starts just after this.
|
|
*/
|
|
typedef struct jit_function_interp *jit_function_interp_t;
|
|
struct jit_function_interp
|
|
{
|
|
/* The function that this structure is associated with */
|
|
jit_function_t func;
|
|
|
|
/* Size of the argument area to allocate, in bytes */
|
|
unsigned int args_size;
|
|
|
|
/* Size of the local stack frame to allocate, in bytes */
|
|
unsigned int frame_size;
|
|
|
|
/* Size of the working stack area of the frame, in items */
|
|
unsigned int working_area;
|
|
};
|
|
|
|
/*
|
|
* Get the size of the "jit_function_interp" structure, rounded
|
|
* up to a multiple of "void *".
|
|
*/
|
|
#define jit_function_interp_size \
|
|
((sizeof(struct jit_function_interp) + sizeof(void *) - 1) & \
|
|
~(sizeof(void *) - 1))
|
|
|
|
/*
|
|
* Get the entry point for a function, from its "jit_function_interp_t" block.
|
|
*/
|
|
#define jit_function_interp_entry_pc(info) \
|
|
((void **)(((unsigned char *)(info)) + jit_function_interp_size))
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
/*
|
|
* The JIT exception class. Instances of this object are thrown
|
|
* to simulate a JIT-level exception.
|
|
*/
|
|
class jit_exception
|
|
{
|
|
public:
|
|
jit_exception(void *object) { this->object = object; }
|
|
|
|
void *object;
|
|
};
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
/*
|
|
* Argument variable access opcodes.
|
|
*/
|
|
#define JIT_OP_LDARG_SBYTE (JIT_OP_NUM_OPCODES + 0x0000)
|
|
#define JIT_OP_LDARG_UBYTE (JIT_OP_NUM_OPCODES + 0x0001)
|
|
#define JIT_OP_LDARG_SHORT (JIT_OP_NUM_OPCODES + 0x0002)
|
|
#define JIT_OP_LDARG_USHORT (JIT_OP_NUM_OPCODES + 0x0003)
|
|
#define JIT_OP_LDARG_INT (JIT_OP_NUM_OPCODES + 0x0004)
|
|
#define JIT_OP_LDARG_LONG (JIT_OP_NUM_OPCODES + 0x0005)
|
|
#define JIT_OP_LDARG_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0006)
|
|
#define JIT_OP_LDARG_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0007)
|
|
#define JIT_OP_LDARG_NFLOAT (JIT_OP_NUM_OPCODES + 0x0008)
|
|
#define JIT_OP_LDARG_STRUCT (JIT_OP_NUM_OPCODES + 0x0009)
|
|
#define JIT_OP_LDARGA (JIT_OP_NUM_OPCODES + 0x000A)
|
|
#define JIT_OP_STARG_BYTE (JIT_OP_NUM_OPCODES + 0x000B)
|
|
#define JIT_OP_STARG_SHORT (JIT_OP_NUM_OPCODES + 0x000C)
|
|
#define JIT_OP_STARG_INT (JIT_OP_NUM_OPCODES + 0x000D)
|
|
#define JIT_OP_STARG_LONG (JIT_OP_NUM_OPCODES + 0x000E)
|
|
#define JIT_OP_STARG_FLOAT32 (JIT_OP_NUM_OPCODES + 0x000F)
|
|
#define JIT_OP_STARG_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0010)
|
|
#define JIT_OP_STARG_NFLOAT (JIT_OP_NUM_OPCODES + 0x0011)
|
|
#define JIT_OP_STARG_STRUCT (JIT_OP_NUM_OPCODES + 0x0012)
|
|
|
|
/*
|
|
* Local variable frame access opcodes.
|
|
*/
|
|
#define JIT_OP_LDLOC_SBYTE (JIT_OP_NUM_OPCODES + 0x0013)
|
|
#define JIT_OP_LDLOC_UBYTE (JIT_OP_NUM_OPCODES + 0x0014)
|
|
#define JIT_OP_LDLOC_SHORT (JIT_OP_NUM_OPCODES + 0x0015)
|
|
#define JIT_OP_LDLOC_USHORT (JIT_OP_NUM_OPCODES + 0x0016)
|
|
#define JIT_OP_LDLOC_INT (JIT_OP_NUM_OPCODES + 0x0017)
|
|
#define JIT_OP_LDLOC_LONG (JIT_OP_NUM_OPCODES + 0x0018)
|
|
#define JIT_OP_LDLOC_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0019)
|
|
#define JIT_OP_LDLOC_FLOAT64 (JIT_OP_NUM_OPCODES + 0x001A)
|
|
#define JIT_OP_LDLOC_NFLOAT (JIT_OP_NUM_OPCODES + 0x001B)
|
|
#define JIT_OP_LDLOC_STRUCT (JIT_OP_NUM_OPCODES + 0x001C)
|
|
#define JIT_OP_LDLOCA (JIT_OP_NUM_OPCODES + 0x001D)
|
|
#define JIT_OP_STLOC_BYTE (JIT_OP_NUM_OPCODES + 0x001E)
|
|
#define JIT_OP_STLOC_SHORT (JIT_OP_NUM_OPCODES + 0x001F)
|
|
#define JIT_OP_STLOC_INT (JIT_OP_NUM_OPCODES + 0x0020)
|
|
#define JIT_OP_STLOC_LONG (JIT_OP_NUM_OPCODES + 0x0021)
|
|
#define JIT_OP_STLOC_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0022)
|
|
#define JIT_OP_STLOC_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0023)
|
|
#define JIT_OP_STLOC_NFLOAT (JIT_OP_NUM_OPCODES + 0x0024)
|
|
#define JIT_OP_STLOC_STRUCT (JIT_OP_NUM_OPCODES + 0x0025)
|
|
|
|
/*
|
|
* Pointer check opcodes (interpreter only).
|
|
*/
|
|
#define JIT_OP_CHECK_NULL_N (JIT_OP_NUM_OPCODES + 0x0026)
|
|
|
|
/*
|
|
* Stack management.
|
|
*/
|
|
#define JIT_OP_POP (JIT_OP_NUM_OPCODES + 0x0027)
|
|
#define JIT_OP_POP_2 (JIT_OP_NUM_OPCODES + 0x0028)
|
|
#define JIT_OP_POP_3 (JIT_OP_NUM_OPCODES + 0x0029)
|
|
#define JIT_OP_PUSH_RETURN_INT (JIT_OP_NUM_OPCODES + 0x002A)
|
|
#define JIT_OP_PUSH_RETURN_LONG (JIT_OP_NUM_OPCODES + 0x002B)
|
|
#define JIT_OP_PUSH_RETURN_FLOAT32 (JIT_OP_NUM_OPCODES + 0x002C)
|
|
#define JIT_OP_PUSH_RETURN_FLOAT64 (JIT_OP_NUM_OPCODES + 0x002D)
|
|
#define JIT_OP_PUSH_RETURN_NFLOAT (JIT_OP_NUM_OPCODES + 0x002E)
|
|
#define JIT_OP_PUSH_RETURN_SMALL_STRUCT (JIT_OP_NUM_OPCODES + 0x002F)
|
|
#define JIT_OP_PUSH_RETURN_AREA_PTR (JIT_OP_NUM_OPCODES + 0x0030)
|
|
|
|
/*
|
|
* Nested function call handling.
|
|
*/
|
|
#define JIT_OP_IMPORT_LOCAL (JIT_OP_NUM_OPCODES + 0x0031)
|
|
#define JIT_OP_IMPORT_ARG (JIT_OP_NUM_OPCODES + 0x0032)
|
|
|
|
/*
|
|
* Push constant values onto the stack.
|
|
*/
|
|
#define JIT_OP_PUSH_CONST_INT (JIT_OP_NUM_OPCODES + 0x0033)
|
|
#define JIT_OP_PUSH_CONST_LONG (JIT_OP_NUM_OPCODES + 0x0034)
|
|
#define JIT_OP_PUSH_CONST_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0035)
|
|
#define JIT_OP_PUSH_CONST_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0036)
|
|
#define JIT_OP_PUSH_CONST_NFLOAT (JIT_OP_NUM_OPCODES + 0x0037)
|
|
|
|
/*
|
|
* Exception handling (interpreter-only).
|
|
*/
|
|
#define JIT_OP_CALL_FINALLY (JIT_OP_NUM_OPCODES + 0x0038)
|
|
|
|
/*
|
|
* Marker opcode for the end of the interpreter-specific opcodes.
|
|
*/
|
|
#define JIT_OP_END_MARKER (JIT_OP_NUM_OPCODES + 0x003B)
|
|
|
|
/*
|
|
* Number of interpreter-specific opcodes.
|
|
*/
|
|
#define JIT_OP_NUM_INTERP_OPCODES \
|
|
(JIT_OP_END_MARKER + 1 - JIT_OP_NUM_OPCODES)
|
|
|
|
/*
|
|
* Opcode version. Should be increased whenever new opcodes
|
|
* are added to this list or the public list in "jit-opcode.h".
|
|
* This value is written to ELF binaries, to ensure that code
|
|
* for one version of libjit is not inadvertantly used in another.
|
|
*/
|
|
#define JIT_OPCODE_VERSION 0
|
|
|
|
/*
|
|
* Additional opcode definition flags.
|
|
*/
|
|
#define JIT_OPCODE_INTERP_ARGS_MASK 0x7E000000
|
|
#define JIT_OPCODE_NINT_ARG 0x02000000
|
|
#define JIT_OPCODE_NINT_ARG_TWO 0x04000000
|
|
#define JIT_OPCODE_CONST_LONG 0x06000000
|
|
#define JIT_OPCODE_CONST_FLOAT32 0x08000000
|
|
#define JIT_OPCODE_CONST_FLOAT64 0x0A000000
|
|
#define JIT_OPCODE_CONST_NFLOAT 0x0C000000
|
|
#define JIT_OPCODE_CALL_INDIRECT_ARGS 0x0E000000
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif /* _JIT_INTERP_H */
|
|
|