| #ifndef _GSL_PRIVATE_H |
| #define _GSL_PRIVATE_H |
| |
| /* -- internal use -- */ |
| |
| #include "goomsl.h" |
| |
| #ifdef USE_JITC_X86 |
| #include "jitc_x86.h" |
| #endif |
| |
| #include "goomsl_heap.h" |
| |
| /* {{{ type of nodes */ |
| #define EMPTY_NODE 0 |
| #define CONST_INT_NODE 1 |
| #define CONST_FLOAT_NODE 2 |
| #define CONST_PTR_NODE 3 |
| #define VAR_NODE 4 |
| #define PARAM_NODE 5 |
| #define READ_PARAM_NODE 6 |
| #define OPR_NODE 7 |
| /* }}} */ |
| /* {{{ type of operations */ |
| #define OPR_SET 1 |
| #define OPR_IF 2 |
| #define OPR_WHILE 3 |
| #define OPR_BLOCK 4 |
| #define OPR_ADD 5 |
| #define OPR_MUL 6 |
| #define OPR_EQU 7 |
| #define OPR_NOT 8 |
| #define OPR_LOW 9 |
| #define OPR_DIV 10 |
| #define OPR_SUB 11 |
| #define OPR_FUNC_INTRO 12 |
| #define OPR_FUNC_OUTRO 13 |
| #define OPR_CALL 14 |
| #define OPR_EXT_CALL 15 |
| #define OPR_PLUS_EQ 16 |
| #define OPR_SUB_EQ 17 |
| #define OPR_MUL_EQ 18 |
| #define OPR_DIV_EQ 19 |
| #define OPR_CALL_EXPR 20 |
| #define OPR_AFFECT_LIST 21 |
| #define OPR_FOREACH 22 |
| #define OPR_VAR_LIST 23 |
| |
| /* }}} */ |
| |
| typedef struct _ConstIntNodeType { /* {{{ */ |
| int val; |
| } ConstIntNodeType; /* }}} */ |
| typedef struct _ConstFloatNodeType { /* {{{ */ |
| float val; |
| } ConstFloatNodeType; /* }}} */ |
| typedef struct _ConstPtrNodeType { /* {{{ */ |
| int id; |
| } ConstPtrNodeType; /* }}} */ |
| typedef struct _OprNodeType { /* {{{ */ |
| int type; |
| int nbOp; |
| struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ |
| struct _NODE_TYPE *next; |
| } OprNodeType; /* }}} */ |
| typedef struct _NODE_TYPE { /* {{{ */ |
| int type; |
| char *str; |
| GoomHash *vnamespace; |
| int line_number; |
| union { |
| ConstIntNodeType constInt; |
| ConstFloatNodeType constFloat; |
| ConstPtrNodeType constPtr; |
| OprNodeType opr; |
| } unode; |
| } NodeType; /* }}} */ |
| typedef struct _INSTRUCTION_DATA { /* {{{ */ |
| |
| union { |
| void *var; |
| int *var_int; |
| int *var_ptr; |
| float *var_float; |
| int jump_offset; |
| struct _ExternalFunctionStruct *external_function; |
| } udest; |
| |
| union { |
| void *var; |
| int *var_int; |
| int *var_ptr; |
| float *var_float; |
| int value_int; |
| int value_ptr; |
| float value_float; |
| } usrc; |
| } InstructionData; |
| /* }}} */ |
| typedef struct _INSTRUCTION { /* {{{ */ |
| |
| int id; |
| InstructionData data; |
| GoomSL *parent; |
| const char *name; /* name of the instruction */ |
| |
| char **params; /* parametres de l'instruction */ |
| GoomHash **vnamespace; |
| int *types; /* type des parametres de l'instruction */ |
| int cur_param; |
| int nb_param; |
| |
| int address; |
| char *jump_label; |
| char *nop_label; |
| |
| int line_number; |
| |
| } Instruction; |
| /* }}} */ |
| typedef struct _INSTRUCTION_FLOW { /* {{{ */ |
| |
| Instruction **instr; |
| int number; |
| int tabsize; |
| GoomHash *labels; |
| } InstructionFlow; |
| /* }}} */ |
| typedef struct _FAST_INSTRUCTION { /* {{{ */ |
| int id; |
| InstructionData data; |
| Instruction *proto; |
| } FastInstruction; |
| /* }}} */ |
| typedef struct _FastInstructionFlow { /* {{{ */ |
| int number; |
| FastInstruction *instr; |
| void *mallocedInstr; |
| } FastInstructionFlow; |
| /* }}} */ |
| typedef struct _ExternalFunctionStruct { /* {{{ */ |
| GoomSL_ExternalFunction function; |
| GoomHash *vars; |
| int is_extern; |
| } ExternalFunctionStruct; |
| /* }}} */ |
| typedef struct _Block { |
| int data; |
| int size; |
| } Block; |
| typedef struct _GSL_StructField { /* {{{ */ |
| int type; |
| char name[256]; |
| int offsetInStruct; /* Where this field is stored... */ |
| } GSL_StructField; |
| /* }}} */ |
| typedef struct _GSL_Struct { /* {{{ */ |
| int nbFields; |
| GSL_StructField *fields[64]; |
| int size; |
| Block iBlock[64]; |
| Block fBlock[64]; |
| } GSL_Struct; |
| /* }}} */ |
| struct _GoomSL { /* {{{ */ |
| int num_lines; |
| Instruction *instr; /* instruction en cours de construction */ |
| |
| InstructionFlow *iflow; /* flow d'instruction 'normal' */ |
| FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ |
| |
| GoomHash *vars; /* table de variables */ |
| int currentNS; |
| GoomHash *namespaces[16]; |
| |
| GoomHash *functions; /* table des fonctions externes */ |
| |
| GoomHeap *data_heap; /* GSL Heap-like memory space */ |
| |
| int nbStructID; |
| GoomHash *structIDS; |
| GSL_Struct **gsl_struct; |
| int gsl_struct_size; |
| |
| int nbPtr; |
| int ptrArraySize; |
| void **ptrArray; |
| |
| int compilationOK; |
| #ifdef USE_JITC_X86 |
| JitcX86Env *jitc; |
| JitcFunc jitc_func; |
| #endif |
| }; /* }}} */ |
| |
| extern GoomSL *currentGoomSL; |
| |
| Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); |
| void gsl_instr_add_param(Instruction *_this, char *param, int type); |
| void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); |
| |
| void gsl_declare_task(const char *name); |
| void gsl_declare_external_task(const char *name); |
| |
| int gsl_type_of_var(GoomHash *namespace, const char *name); |
| |
| void gsl_enternamespace(const char *name); |
| void gsl_reenternamespace(GoomHash *ns); |
| GoomHash *gsl_leavenamespace(void); |
| GoomHash *gsl_find_namespace(const char *name); |
| |
| void gsl_commit_compilation(void); |
| |
| /* #define TYPE_PARAM 1 */ |
| |
| #define FIRST_RESERVED 0x80000 |
| |
| #define TYPE_INTEGER 0x90001 |
| #define TYPE_FLOAT 0x90002 |
| #define TYPE_VAR 0x90003 |
| #define TYPE_PTR 0x90004 |
| #define TYPE_LABEL 0x90005 |
| |
| #define TYPE_OP_EQUAL 6 |
| #define TYPE_IVAR 0xa0001 |
| #define TYPE_FVAR 0xa0002 |
| #define TYPE_PVAR 0xa0003 |
| #define TYPE_SVAR 0xa0004 |
| |
| #define INSTR_JUMP 6 |
| #define INSTR_JZERO 29 |
| #define INSTR_CALL 36 |
| #define INSTR_RET 37 |
| #define INSTR_EXT_CALL 38 |
| #define INSTR_JNZERO 40 |
| |
| #define INSTR_SET 0x80001 |
| #define INSTR_INT 0x80002 |
| #define INSTR_FLOAT 0x80003 |
| #define INSTR_PTR 0x80004 |
| #define INSTR_LABEL 0x80005 |
| #define INSTR_ISLOWER 0x80006 |
| #define INSTR_ADD 0x80007 |
| #define INSTR_MUL 0x80008 |
| #define INSTR_DIV 0x80009 |
| #define INSTR_SUB 0x80010 |
| #define INSTR_ISEQUAL 0x80011 |
| #define INSTR_NOT 0x80012 |
| |
| |
| #endif |