Merge to subtype-trunk (manually: src/vm/linker.hpp, src/vm/vftbl.hpp)
authorStefan Ring <stefan@complang.tuwien.ac.at>
Fri, 31 Oct 2008 17:25:13 +0000 (18:25 +0100)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Fri, 31 Oct 2008 17:25:13 +0000 (18:25 +0100)
--HG--
branch : subtype-trunk
rename : src/vmcore/class.c => src/vm/class.cpp
rename : src/vm/builtin.c => src/vm/jit/builtin.cpp
rename : src/vm/builtin.h => src/vm/jit/builtin.hpp
rename : src/vmcore/linker.c => src/vm/linker.cpp
rename : src/vmcore/linker.h => src/vm/linker.hpp

src/vm/class.cpp
src/vm/jit/alpha/arch.h
src/vm/jit/builtin.cpp
src/vm/jit/builtin.hpp
src/vm/jit/i386/arch.h
src/vm/jit/x86_64/arch.h
src/vm/linker.cpp
src/vm/linker.hpp
src/vm/vftbl.hpp

index 1305fc0a288a9d401a55ab8f1d9577a375fdacdf..0aa5f21233972cf757f8f2f0f4b8c7285d38a7a7 100644 (file)
@@ -1471,7 +1471,16 @@ bool class_isanysubclass(classinfo *sub, classinfo *super)
                if (sub->flags & ACC_INTERFACE)
                        return (super == class_java_lang_Object);
 
+#if USES_NEW_SUBTYPE
                result = fast_subtype_check(sub->vftbl, super->vftbl);
+#else
+               LOCK_CLASSRENUMBER_LOCK;
+
+               diffval = sub->vftbl->baseval - super->vftbl->baseval;
+               result  = diffval <= (uint32_t) super->vftbl->diffval;
+
+               UNLOCK_CLASSRENUMBER_LOCK;
+#endif
        }
 
        return result;
index f14e210acf05f3e19e6b6863cd19253aad7143d3..186f1d1b98948fe7d76b125eda96bf85562cc4bb 100644 (file)
 
 #define REPLACEMENT_PATCH_SIZE           4 /* bytes */
 
+/* subtype ********************************************************************/
+
+#define USES_NEW_SUBTYPE                 1
+
 #endif /* _ARCH_H */
 
 
index 100ad48d6c55c23c6b43eaec535c99211517d3d3..b4d8f9c77ad2c816edbf10ea6c17155b898b36c8 100644 (file)
@@ -640,6 +640,27 @@ bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
        return result;
 }
 
+#if USES_NEW_SUBTYPE
+/* fast_subtype_check **********************************************************
+
+   Checks if s is a subtype of t, using the restricted subtype relation (see
+   Cliff Click and John Rose: Fast subtype checking in the Hotspot JVM.)
+
+   RETURN VALUE:
+      1......s is a subtype of t.
+      0......otherwise
+
+*******************************************************************************/
+
+bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t)
+{
+   if (s->subtype_display[t->subtype_depth] == t)
+       return true;
+   if (t->subtype_offset != OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]))
+       return false;
+   return s->subtype_depth >= t->subtype_depth && s->subtype_overflow[t->subtype_depth - DISPLAY_SIZE] == t;
+}
+#endif
 
 /* builtin_fast_canstore *******************************************************
 
@@ -653,15 +674,6 @@ bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
 
 *******************************************************************************/
 
-bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t)
-{
-       if (s->subtype_display[t->subtype_depth] == t)
-               return true;
-       if (t->subtype_offset != OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]))
-               return false;
-       return s->subtype_depth >= t->subtype_depth && s->subtype_overflow[t->subtype_depth - DISPLAY_SIZE] == t;
-}
-
 bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
 {
        arraydescriptor *desc;
@@ -694,6 +706,8 @@ bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                if (valuevftbl == componentvftbl)
                        return 1;
 
+               LOCK_CLASSRENUMBER_LOCK;
+
                baseval = componentvftbl->baseval;
 
                if (baseval <= 0) {
@@ -703,8 +717,15 @@ bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                                          (valuevftbl->interfacetable[baseval] != NULL));
                }
                else {
+#if USES_NEW_SUBTYPE
                        result = fast_subtype_check(valuevftbl, componentvftbl);
+#else
+                       diffval = valuevftbl->baseval - componentvftbl->baseval;
+                       result  = diffval <= (uint32_t) componentvftbl->diffval;
+#endif
                }
+
+               UNLOCK_CLASSRENUMBER_LOCK;
        }
        else if (valuedesc == NULL) {
                /* {oa has dimension > 1} */
@@ -756,6 +777,8 @@ bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
+       LOCK_CLASSRENUMBER_LOCK;
+
        baseval = elementvftbl->baseval;
 
        if (baseval <= 0) {
@@ -764,9 +787,16 @@ bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
                                  (valuevftbl->interfacetable[baseval] != NULL));
        }
        else {
+#if USES_NEW_SUBTYPE
                result = fast_subtype_check(valuevftbl, elementvftbl);
+#else
+               diffval = valuevftbl->baseval - elementvftbl->baseval;
+               result  = diffval <= (uint32_t) elementvftbl->diffval;
+#endif
        }
 
+       UNLOCK_CLASSRENUMBER_LOCK;
+
        return result;
 }
 
@@ -800,7 +830,16 @@ bool builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
+       LOCK_CLASSRENUMBER_LOCK;
+
+#if USES_NEW_SUBTYPE
        result = fast_subtype_check(valuevftbl, elementvftbl);
+#else
+       diffval = valuevftbl->baseval - elementvftbl->baseval;
+       result  = diffval <= (uint32_t) elementvftbl->diffval;
+#endif
+
+       UNLOCK_CLASSRENUMBER_LOCK;
 
        return result;
 }
index becb10858e060860736edfc4ecbed268d97920e3..eb2d80e1c79138804eb221c8b89451024646a638 100644 (file)
@@ -125,7 +125,9 @@ bool builtintable_replace_function(void *iptr);
  * ICMD_BUILTIN3.)
  */
 
+#if USES_NEW_SUBTYPE
 bool fast_subtype_check(struct _vftbl *, struct _vftbl *);
+#endif
 
 bool builtin_instanceof(java_handle_t *obj, classinfo *c);
 /* NOT AN OP */
index d5d71e803b16127c5de2c7b5e152dedb7c7b0073..a154f54cc6b8ba2eb0d6b5795ccfb8f04a915348 100644 (file)
 
 #define REPLACEMENT_PATCH_SIZE           2       /* bytes */
 
+/* subtype ********************************************************************/
+
+#define USES_NEW_SUBTYPE                 1
+
 #endif /* _ARCH_H */
 
 
index f31db1429f5303040e48e65a2f63d290f562d365..7bd7d809de65cc93262764c3d4cd06506cf60d7e 100644 (file)
 
 #define REPLACEMENT_PATCH_SIZE           2             /* bytes */
 
+/* subtype ********************************************************************/
+
+#define USES_NEW_SUBTYPE                 1
+
 #endif /* _ARCH_H */
 
 
index 5fd4869b6598cbe249a2bcd595e35056b73adebc..701fc4db0d2c0dc5b37ab694bfaa1bafa23c4a05 100644 (file)
@@ -94,6 +94,10 @@ classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool c
 static s4 interfaceindex;       /* sequential numbering of interfaces         */
 static s4 classvalue;
 
+#if !USES_NEW_SUBTYPE
+java_object_t *linker_classrenumber_lock;
+#endif
+
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -123,6 +127,14 @@ void linker_preinit(void)
 
        interfaceindex = 0;
 
+#if defined(ENABLE_THREADS) && !USES_NEW_SUBTYPE
+       /* create the global lock object */
+
+       linker_classrenumber_lock = NEW(java_object_t);
+
+       LOCK_INIT_OBJECT_LOCK(linker_classrenumber_lock);
+#endif
+
        /* Link the most basic classes. */
 
        if (!link_class(class_java_lang_Object))
@@ -519,6 +531,7 @@ static bool linker_overwrite_method(methodinfo *mg,
        
 *******************************************************************************/
 
+#if USES_NEW_SUBTYPE
 static int build_display_inner(classinfo *topc, classinfo *c, int i)
 {
        int depth;
@@ -580,6 +593,7 @@ static void build_display(classinfo *c)
                        c->vftbl->subtype_display[i] = NULL;
        }
 }
+#endif
 
 static classinfo *link_class_intern(classinfo *c)
 {
@@ -978,7 +992,9 @@ static classinfo *link_class_intern(classinfo *c)
        /* FIXME: this is completely useless now */
        RT_TIMING_GET_TIME(time_subclasses);
 
+#if USES_NEW_SUBTYPE
        build_display(c);
+#endif
 
        /* revert the linking state and class is linked */
 
@@ -1180,10 +1196,14 @@ static arraydescriptor *link_array(classinfo *c)
 static void linker_compute_subclasses(classinfo *c)
 {
 
+       LOCK_CLASSRENUMBER_LOCK;
+
        if (!(c->flags & ACC_INTERFACE)) {
                c->nextsub = NULL;
                c->sub     = NULL;
+#if USES_NEW_SUBTYPE
                c->vftbl->baseval = 1; /* so it does not look like an interface */
+#endif
        }
 
        if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) {
@@ -1193,6 +1213,14 @@ static void linker_compute_subclasses(classinfo *c)
 
        classvalue = 0;
 
+#if !USES_NEW_SUBTYPE
+       /* compute class values */
+
+       linker_compute_class_values(class_java_lang_Object);
+#endif
+
+       UNLOCK_CLASSRENUMBER_LOCK;
+
 }
 
 
index 7f4c6326f675eff953952ab5d0234d083265b967..10355d0a6096bb499702303d9f51d78727d28a65 100644 (file)
@@ -61,6 +61,25 @@ struct arraydescriptor {
 };
 
 
+/* global variables ***********************************************************/
+
+/* This lock must be taken while renumbering classes or while atomically      */
+/* accessing classes.                                                         */
+
+#if USES_NEW_SUBTYPE
+
+#define LOCK_CLASSRENUMBER_LOCK   /* nothing */
+#define UNLOCK_CLASSRENUMBER_LOCK /* nothing */
+
+#else
+extern java_object_t *linker_classrenumber_lock;
+
+#define LOCK_CLASSRENUMBER_LOCK   LOCK_MONITOR_ENTER(linker_classrenumber_lock)
+#define UNLOCK_CLASSRENUMBER_LOCK LOCK_MONITOR_EXIT(linker_classrenumber_lock)
+
+#endif
+
+
 /* function prototypes ********************************************************/
 
 #ifdef __cplusplus
index 6f5bed5f53fb5fd41b929e675f5fa8e4496371c9..0d47ad10f948e79c65fde6a0841761a7b7256b08 100644 (file)
@@ -94,7 +94,9 @@ typedef struct _vftbl vftbl_t;
 #include "vm/class.hpp"
 #include "vm/references.h"
 
+#if USES_NEW_SUBTYPE
 #define DISPLAY_SIZE 4
+#endif
 
 struct _vftbl {
        methodptr   *interfacetable[1];    /* interface table (access via macro)  */
@@ -106,10 +108,12 @@ struct _vftbl {
                                           /* (-index for interfaces)             */
        s4           diffval;              /* high - base for runtime type check  */
 
+#if USES_NEW_SUBTYPE
        s4 subtype_depth;
        s4 subtype_offset;
        struct _vftbl *subtype_display[DISPLAY_SIZE+1];  /* the last one is cache */
        struct _vftbl **subtype_overflow;
+#endif
 
        s4          *interfacevftbllength; /* length of interface vftbls          */
        methodptr    table[1];             /* class vftbl                         */