* src/vm/jit/i386/codegen.h (vm/jit/i386/emit.h): Added.
[cacao.git] / src / vm / jit / dseg.h
index 0b567704118b3ae9b9ace1911ea6e8a8186fb447..133521b92f510fc389c6643884b2eedc71dd5d48 100644 (file)
 
    Authors: Reinhard Grafl
             Andreas  Krall
-
-   Changes: Christian Thalinger
+            Christian Thalinger
             Joseph Wenninger
 
-   $Id: dseg.h 4445 2006-02-05 15:26:34Z edwin $
+   $Id: dseg.h 6046 2006-11-22 20:24:55Z twisti $
 
 */
 
 
 /* forward typedefs ***********************************************************/
 
-typedef struct jumpref jumpref;
-typedef struct dataref dataref;
-typedef struct patchref patchref;
-typedef struct linenumberref linenumberref;
+typedef struct dsegentry             dsegentry;
+typedef struct jumpref               jumpref;
+typedef struct dataref               dataref;
+typedef struct exceptionref          exceptionref;
+typedef struct patchref              patchref;
+typedef struct linenumberref         linenumberref;
+typedef struct linenumbertable_entry linenumbertable_entry;
+typedef struct dseg_exception_entry  dseg_exception_entry;
 
 
 #include "config.h"
 
 #include "vm/types.h"
 
+#include "toolbox/list.h"
 #include "vm/jit/jit.h"
 #include "vm/jit/codegen-common.h"
 
 
-/* global macros **************************************************************/
+/* convenience macros *********************************************************/
 
-#if SIZEOF_VOID_P == 8
-# define dseg_addaddress(cd,value)    dseg_adds8((cd), (s8) (value))
-#else
-# define dseg_addaddress(cd,value)    dseg_adds4((cd), (s4) (value))
-#endif
+#define dseg_add_functionptr(cd,value) \
+    dseg_add_address((cd), (void *) (ptrint) (value))
+
+
+/* dataentry ******************************************************************/
+
+#define DSEG_FLAG_UNIQUE      0x0001
+#define DSEG_FLAG_READONLY    0x0002
+
+struct dsegentry {
+       u2         type;
+       u2         flags;
+       s4         disp;
+       imm_union  val;
+       dsegentry *next;
+};
 
 
 /* jumpref ********************************************************************/
@@ -80,14 +95,25 @@ struct dataref {
 };
 
 
+/* exceptionref ***************************************************************/
+
+struct exceptionref {
+       s4            branchpos;    /* patching position in code segment          */
+       s4            reg;          /* used for ArrayIndexOutOfBounds index reg   */
+       functionptr   function;     /* function pointer to generate exception     */
+       exceptionref *next;         /* next element in exceptionref list          */
+};
+
+
 /* patchref *******************************************************************/
 
 struct patchref {
-       s4           branchpos;
-       functionptr  patcher;
-       voidptr      ref;
+       s4           branchpos;     /* relative offset to method entrypoint       */
+       s4           disp;          /* displacement of ref in the data segment    */
+       functionptr  patcher;       /* patcher function to call                   */
+       voidptr      ref;           /* reference passed                           */
+/*     listnode     linkage; */
        patchref    *next;
-       s4           disp;
 };
 
 
@@ -109,38 +135,67 @@ struct linenumberref {
 };
 
 
-/* function prototypes ********************************************************/
+/* linenumbertable_entry ******************************************************/
 
-void dseg_increase(codegendata *cd);
+/* Keep the type of line the same as the pointer type, otherwise we
+   run into alignment troubles (like on MIPS64). */
 
-s4 dseg_adds4_increase(codegendata *cd, s4 value);
-s4 dseg_adds4(codegendata *cd, s4 value);
+struct linenumbertable_entry {
+       ptrint  line;               /* NOTE: see doc/inlining_stacktrace.txt for  */
+       u1     *pc;                 /*       special meanings of line and pc.     */
+};
+
+
+/* dseg_exception_entry ********************************************************
 
-s4 dseg_adds8_increase(codegendata *cd, s8 value);
-s4 dseg_adds8(codegendata *cd, s8 value);
+   Datastructure which represents an exception entry in the exception
+   table residing in the data segment.
 
-s4 dseg_addfloat_increase(codegendata *cd, float value);
-s4 dseg_addfloat(codegendata *cd, float value);
+*******************************************************************************/
+
+struct dseg_exception_entry {
+       classref_or_classinfo  catchtype;
+       u1                    *handlerpc;
+       u1                    *endpc;
+       u1                    *startpc;
+};
 
-s4 dseg_adddouble_increase(codegendata *cd, double value);
-s4 dseg_adddouble(codegendata *cd, double value);
 
-void dseg_addtarget(codegendata *cd, basicblock *target);
+/* function prototypes ********************************************************/
+
+void dseg_finish(jitdata *jd);
+
+s4 dseg_add_unique_s4(codegendata *cd, s4 value);
+s4 dseg_add_unique_s8(codegendata *cd, s8 value);
+s4 dseg_add_unique_float(codegendata *cd, float value);
+s4 dseg_add_unique_double(codegendata *cd, double value);
+s4 dseg_add_unique_address(codegendata *cd, void *value);
+
+s4 dseg_add_s4(codegendata *cd, s4 value);
+s4 dseg_add_s8(codegendata *cd, s8 value);
+s4 dseg_add_float(codegendata *cd, float value);
+s4 dseg_add_double(codegendata *cd, double value);
+s4 dseg_add_address(codegendata *cd, void *value);
+
+void dseg_add_unique_target(codegendata *cd, basicblock *target);
+void dseg_add_target(codegendata *cd, basicblock *target);
 
 void dseg_addlinenumbertablesize(codegendata *cd);
-void dseg_addlinenumber(codegendata *cd, u2 linenumber, u1 *ptr);
-void dseg_addlinenumber_inline_start(codegendata *cd, instruction *iptr, u1 *ptr);
+void dseg_addlinenumber(codegendata *cd, u2 linenumber);
+void dseg_addlinenumber_inline_start(codegendata *cd, instruction *iptr);
 void dseg_addlinenumber_inline_end(codegendata *cd, instruction *iptr);
 
 void dseg_createlinenumbertable(codegendata *cd);
 
+s4 dseg_get_linenumber_from_pc(methodinfo **pm, u1 *pv, u1 *pc);
+
 #if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(ENABLE_INTRP)
-void dseg_adddata(codegendata *cd, u1 *ptr);
-void dseg_resolve_datareferences(codegendata *cd, methodinfo *m);
+void dseg_adddata(codegendata *cd);
+void dseg_resolve_datareferences(jitdata *jd);
 #endif
 
 #if !defined(NDEBUG)
-void dseg_display(methodinfo *m, codegendata *cd);
+void dseg_display(jitdata *jd);
 #endif
 
 #endif /* _DSEG_H */