X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fvm%2Fjit%2Fcodegen.inc.h;h=2d60e0306b7638ea98ca38fea29f4c90c41f2de0;hb=bc21650c967b161e3a86e67baae5b63ee7b30189;hp=18a1d5ee76a2d9598a1e5c4a198ba44e740bbc26;hpb=2958f4e2a3befe927e444cabf5de57eaaeaf0970;p=cacao.git diff --git a/src/vm/jit/codegen.inc.h b/src/vm/jit/codegen.inc.h index 18a1d5ee7..2d60e0306 100644 --- a/src/vm/jit/codegen.inc.h +++ b/src/vm/jit/codegen.inc.h @@ -26,7 +26,7 @@ Authors: Christian Thalinger - $Id: codegen.inc.h 1429 2004-11-02 08:58:26Z jowenn $ + $Id: codegen.inc.h 1634 2004-12-01 09:57:34Z twisti $ */ @@ -34,86 +34,94 @@ #ifndef _CODEGEN_INC_H #define _CODEGEN_INC_H +/* We typedef these structures before #includes to resolve circular */ +/* dependencies. */ + +typedef struct codegendata codegendata; +typedef struct branchref branchref; +typedef struct jumpref jumpref; +typedef struct dataref dataref; +typedef struct clinitref clinitref; +typedef struct linenumberref linenumberref; +typedef struct threadcritnodetemp threadcritnodetemp; -#include "types.h" -#include "global.h" +#include "types.h" +#include "vm/global.h" +#include "vm/jit/jit.h" +#include "vm/jit/reg.h" +#include "vm/jit/inline/inline.h" -struct t_inlining_globals; #define MCODEINITSIZE (1<<15) /* 32 Kbyte code area initialization size */ #define DSEGINITSIZE (1<<12) /* 4 Kbyte data area initialization size */ #if POINTERSIZE == 8 -#define dseg_addaddress(m, value) dseg_adds8((m), (s8) (value)) +#define dseg_addaddress(cd,value) dseg_adds8((cd), (s8) (value)) #else -#define dseg_addaddress(m, value) dseg_adds4((m), (s4) (value)) +#define dseg_addaddress(cd,value) dseg_adds4((cd), (s4) (value)) #endif -typedef struct codegendata codegendata; -typedef struct branchref branchref; -typedef struct jumpref jumpref; -typedef struct dataref dataref; -typedef struct linenumberref linenumberref; -typedef struct threadcritnodetemp threadcritnodetemp; - - /************************* critical sections *********************************/ struct threadcritnodetemp { threadcritnodetemp *next; - s4 mcodebegin; - s4 mcodeend; - s4 mcoderestart; + s4 mcodebegin; + s4 mcodeend; + s4 mcoderestart; }; struct codegendata { - u1 *mcodebase; /* base pointer of code area */ - s4 *mcodeend; /* pointer to end of code area */ - s4 mcodesize; /* complete size of code area (bytes) */ + u1 *mcodebase; /* base pointer of code area */ + s4 *mcodeend; /* pointer to end of code area */ + s4 mcodesize; /* complete size of code area (bytes) */ - u1 *mcodeptr; /* code generation pointer */ +#if defined(__I386__) || defined(__X86_64__) + u1 *mcodeptr; /* code generation pointer */ +#endif - u1 *dsegtop; /* pointer to top (end) of data area */ - s4 dsegsize; /* complete size of data area (bytes) */ - s4 dseglen; /* used size of data area (bytes) */ + u1 *dsegtop; /* pointer to top (end) of data area */ + s4 dsegsize; /* complete size of data area (bytes) */ + s4 dseglen; /* used size of data area (bytes) */ /* data area grows from top to bottom */ - jumpref *jumpreferences; /* list of jumptable target addresses */ - dataref *datareferences; /* list of data segment references */ - branchref *xboundrefs; /* list of bound check branches */ - branchref *xcheckarefs; /* list of array size check branches */ - branchref *xnullrefs; /* list of null check branches */ - branchref *xcastrefs; /* list of cast check branches */ - branchref *xdivrefs; /* list of divide by zero branches */ - branchref *xexceptionrefs; /* list of exception branches */ - - linenumberref *linenumberreferences; /* list of line numbers and the */ + jumpref *jumpreferences; /* list of jumptable target addresses */ + dataref *datareferences; /* list of data segment references */ + branchref *xboundrefs; /* list of bound check branches */ + branchref *xcheckarefs; /* list of array size check branches */ + branchref *xnullrefs; /* list of null check branches */ + branchref *xcastrefs; /* list of cast check branches */ + branchref *xdivrefs; /* list of divide by zero branches */ + branchref *xexceptionrefs; /* list of exception branches */ + clinitref *clinitrefs; + + linenumberref *linenumberreferences; /* list of line numbers and the */ /* program counters of their first */ /* instruction */ - s4 linenumbertablesizepos; - s4 linenumbertablestartpos; - s4 linenumbertab; + s4 linenumbertablesizepos; + s4 linenumbertablestartpos; + s4 linenumbertab; - methodinfo *method; - s4 exceptiontablelength;/* exceptiontable length */ - exceptiontable *exceptiontable; /* the exceptiontable */ + methodinfo *method; + s4 exceptiontablelength; /* exceptiontable length */ + exceptiontable *exceptiontable; /* the exceptiontable */ threadcritnodetemp *threadcrit; /* List of critical code regions */ threadcritnodetemp threadcritcurrent; - s4 threadcritcount; /* Number of critical regions */ - int maxstack; - int maxlocals; + s4 threadcritcount; /* Number of critical regions */ + + s4 maxstack; + s4 maxlocals; }; /***************** forward references in branch instructions ******************/ struct branchref { - s4 branchpos; /* patching position in code segment */ - s4 reg; /* used for ArrayIndexOutOfBounds index reg */ + s4 branchpos; /* patching position in code segment */ + s4 reg; /* used for ArrayIndexOutOfBounds index reg */ branchref *next; /* next element in branchref list */ }; @@ -121,23 +129,30 @@ struct branchref { /******************** forward references in tables ***************************/ struct jumpref { - s4 tablepos; /* patching position in data segment */ - struct basicblock *target; /* target basic block */ - jumpref *next; /* next element in jumpref list */ + s4 tablepos; /* patching position in data segment */ + basicblock *target; /* target basic block */ + jumpref *next; /* next element in jumpref list */ }; struct dataref { - u1 *pos; /* patching position in generated code */ + u1 *pos; /* patching position in generated code */ dataref *next; /* next element in dataref list */ }; +struct clinitref { + s4 branchpos; + classinfo *class; + clinitref *next; +}; + + struct linenumberref { - s4 tablepos; /* patching position in data segment */ - int targetmpc; /* machine code program counter of first */ + s4 tablepos; /* patching position in data segment */ + s4 targetmpc; /* machine code program counter of first */ /* instruction for given line */ - u2 linenumber; /* line number, used for inserting into the */ + u2 linenumber; /* line number, used for inserting into the */ /* table and for validty checking */ linenumberref *next; /* next element in linenumberref list */ }; @@ -147,25 +162,26 @@ struct linenumberref { typedef struct _methodtree_element methodtree_element; struct _methodtree_element { - void *startpc; - void *endpc; + functionptr startpc; + functionptr endpc; }; #endif -/* function prototypes */ +/* function prototypes ********************************************************/ void codegen_init(); -void codegen_setup(methodinfo *m, struct t_inlining_globals *e); /* allocates code and data area */ -void codegen(methodinfo *m); -void codegen_close(methodinfo *m); /* releases temporary storage */ -void codegen_insertmethod(void *startpc, void *endpc); +void codegen_setup(methodinfo *m, codegendata *cd, t_inlining_globals *e); +void codegen(methodinfo *m, codegendata *cd, registerdata *rd); +void codegen_free(methodinfo *m, codegendata *cd); +void codegen_close(); +void codegen_insertmethod(functionptr startpc, functionptr endpc); #if defined(__I386__) || defined(__X86_64__) -void codegen_addreference(methodinfo *m, struct basicblock *target, void *branchptr); +void codegen_addreference(codegendata *cd, struct basicblock *target, void *branchptr); #endif -void dseg_display(methodinfo *m); +void dseg_display(methodinfo *m, codegendata *cd); void init_exceptions();