162 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			162 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (C)2005-2016 Haxe Foundation
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Permission is hereby granted, free of charge, to any person obtaining a
							 | 
						||
| 
								 | 
							
								 * copy of this software and associated documentation files (the "Software"),
							 | 
						||
| 
								 | 
							
								 * to deal in the Software without restriction, including without limitation
							 | 
						||
| 
								 | 
							
								 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
							 | 
						||
| 
								 | 
							
								 * and/or sell copies of the Software, and to permit persons to whom the
							 | 
						||
| 
								 | 
							
								 * Software is furnished to do so, subject to the following conditions:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The above copyright notice and this permission notice shall be included in
							 | 
						||
| 
								 | 
							
								 * all copies or substantial portions of the Software.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						||
| 
								 | 
							
								 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						||
| 
								 | 
							
								 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
							 | 
						||
| 
								 | 
							
								 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
							 | 
						||
| 
								 | 
							
								 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
							 | 
						||
| 
								 | 
							
								 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
							 | 
						||
| 
								 | 
							
								 * DEALINGS IN THE SOFTWARE.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#include <hl.h>
							 | 
						||
| 
								 | 
							
								#include "opcodes.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									const char *lib;
							 | 
						||
| 
								 | 
							
									const char *name;
							 | 
						||
| 
								 | 
							
									hl_type *t;
							 | 
						||
| 
								 | 
							
									int findex;
							 | 
						||
| 
								 | 
							
								} hl_native;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									hl_op op;
							 | 
						||
| 
								 | 
							
									int p1;
							 | 
						||
| 
								 | 
							
									int p2;
							 | 
						||
| 
								 | 
							
									int p3;
							 | 
						||
| 
								 | 
							
									int *extra;
							 | 
						||
| 
								 | 
							
								} hl_opcode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct hl_function hl_function;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct hl_function {
							 | 
						||
| 
								 | 
							
									int findex;
							 | 
						||
| 
								 | 
							
									int nregs;
							 | 
						||
| 
								 | 
							
									int nops;
							 | 
						||
| 
								 | 
							
									int ref;
							 | 
						||
| 
								 | 
							
									hl_type *type;
							 | 
						||
| 
								 | 
							
									hl_type **regs;
							 | 
						||
| 
								 | 
							
									hl_opcode *ops;
							 | 
						||
| 
								 | 
							
									int *debug;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									hl_type_obj *obj;
							 | 
						||
| 
								 | 
							
									union {
							 | 
						||
| 
								 | 
							
										const uchar *name;
							 | 
						||
| 
								 | 
							
										hl_function *ref; // obj = NULL
							 | 
						||
| 
								 | 
							
									} field;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define fun_obj(f) ((f)->obj ? (f)->obj : (f)->field.ref ? (f)->field.ref->obj : NULL)
							 | 
						||
| 
								 | 
							
								#define fun_field_name(f) ((f)->obj ? (f)->field.name : (f)->field.ref ? (f)->field.ref->field.name : NULL)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									int global;
							 | 
						||
| 
								 | 
							
									int nfields;
							 | 
						||
| 
								 | 
							
									int *fields;
							 | 
						||
| 
								 | 
							
								} hl_constant;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									int version;
							 | 
						||
| 
								 | 
							
									int nints;
							 | 
						||
| 
								 | 
							
									int nfloats;
							 | 
						||
| 
								 | 
							
									int nstrings;
							 | 
						||
| 
								 | 
							
									int nbytes;
							 | 
						||
| 
								 | 
							
									int ntypes;
							 | 
						||
| 
								 | 
							
									int nglobals;
							 | 
						||
| 
								 | 
							
									int nnatives;
							 | 
						||
| 
								 | 
							
									int nfunctions;
							 | 
						||
| 
								 | 
							
									int nconstants;
							 | 
						||
| 
								 | 
							
									int entrypoint;
							 | 
						||
| 
								 | 
							
									int ndebugfiles;
							 | 
						||
| 
								 | 
							
									bool hasdebug;
							 | 
						||
| 
								 | 
							
									int*		ints;
							 | 
						||
| 
								 | 
							
									double*		floats;
							 | 
						||
| 
								 | 
							
									char**		strings;
							 | 
						||
| 
								 | 
							
									int*		strings_lens;
							 | 
						||
| 
								 | 
							
									char*		bytes;
							 | 
						||
| 
								 | 
							
									int*		bytes_pos;
							 | 
						||
| 
								 | 
							
									char**		debugfiles;
							 | 
						||
| 
								 | 
							
									int*		debugfiles_lens;
							 | 
						||
| 
								 | 
							
									uchar**		ustrings;
							 | 
						||
| 
								 | 
							
									hl_type*	types;
							 | 
						||
| 
								 | 
							
									hl_type**	globals;
							 | 
						||
| 
								 | 
							
									hl_native*	natives;
							 | 
						||
| 
								 | 
							
									hl_function*functions;
							 | 
						||
| 
								 | 
							
									hl_constant*constants;
							 | 
						||
| 
								 | 
							
									hl_alloc	alloc;
							 | 
						||
| 
								 | 
							
									hl_alloc	falloc;
							 | 
						||
| 
								 | 
							
								} hl_code;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									void *offsets;
							 | 
						||
| 
								 | 
							
									int start;
							 | 
						||
| 
								 | 
							
									bool large;
							 | 
						||
| 
								 | 
							
								} hl_debug_infos;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct jit_ctx jit_ctx;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									hl_code *code;
							 | 
						||
| 
								 | 
							
									int *types_hashes;
							 | 
						||
| 
								 | 
							
									int *globals_signs;
							 | 
						||
| 
								 | 
							
									int *functions_signs;
							 | 
						||
| 
								 | 
							
									int *functions_hashes;
							 | 
						||
| 
								 | 
							
									int *functions_indexes;
							 | 
						||
| 
								 | 
							
								} hl_code_hash;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									hl_code *code;
							 | 
						||
| 
								 | 
							
									int codesize;
							 | 
						||
| 
								 | 
							
									int globals_size;
							 | 
						||
| 
								 | 
							
									int *globals_indexes;
							 | 
						||
| 
								 | 
							
									unsigned char *globals_data;
							 | 
						||
| 
								 | 
							
									void **functions_ptrs;
							 | 
						||
| 
								 | 
							
									int *functions_indexes;
							 | 
						||
| 
								 | 
							
									void *jit_code;
							 | 
						||
| 
								 | 
							
									hl_code_hash *hash;
							 | 
						||
| 
								 | 
							
									hl_debug_infos *jit_debug;
							 | 
						||
| 
								 | 
							
									jit_ctx *jit_ctx;
							 | 
						||
| 
								 | 
							
									hl_module_context ctx;
							 | 
						||
| 
								 | 
							
								} hl_module;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								hl_code *hl_code_read( const unsigned char *data, int size, char **error_msg );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								hl_code_hash *hl_code_hash_alloc( hl_code *c );
							 | 
						||
| 
								 | 
							
								void hl_code_hash_finalize( hl_code_hash *h );
							 | 
						||
| 
								 | 
							
								void hl_code_hash_free( hl_code_hash *h );
							 | 
						||
| 
								 | 
							
								void hl_code_free( hl_code *c );
							 | 
						||
| 
								 | 
							
								int hl_code_hash_type( hl_code_hash *h, hl_type *t );
							 | 
						||
| 
								 | 
							
								void hl_code_hash_remap_globals( hl_code_hash *hnew, hl_code_hash *hold );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const uchar *hl_get_ustring( hl_code *c, int index );
							 | 
						||
| 
								 | 
							
								const char* hl_op_name( int op );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef unsigned char h_bool;
							 | 
						||
| 
								 | 
							
								hl_module *hl_module_alloc( hl_code *code );
							 | 
						||
| 
								 | 
							
								int hl_module_init( hl_module *m, h_bool hot_reload );
							 | 
						||
| 
								 | 
							
								h_bool hl_module_patch( hl_module *m, hl_code *code );
							 | 
						||
| 
								 | 
							
								void hl_module_free( hl_module *m );
							 | 
						||
| 
								 | 
							
								h_bool hl_module_debug( hl_module *m, int port, h_bool wait );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void hl_profile_setup( int sample_count );
							 | 
						||
| 
								 | 
							
								void hl_profile_end();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								jit_ctx *hl_jit_alloc();
							 | 
						||
| 
								 | 
							
								void hl_jit_free( jit_ctx *ctx, h_bool can_reset );
							 | 
						||
| 
								 | 
							
								void hl_jit_reset( jit_ctx *ctx, hl_module *m );
							 | 
						||
| 
								 | 
							
								void hl_jit_init( jit_ctx *ctx, hl_module *m );
							 | 
						||
| 
								 | 
							
								int hl_jit_function( jit_ctx *ctx, hl_module *m, hl_function *f );
							 | 
						||
| 
								 | 
							
								void *hl_jit_code( jit_ctx *ctx, hl_module *m, int *codesize, hl_debug_infos **debug, hl_module *previous );
							 | 
						||
| 
								 | 
							
								void hl_jit_patch_method( void *old_fun, void **new_fun_table );
							 |