forked from LeenkxTeam/LNXSDK
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 );
|