You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by dl...@apache.org on 2005/10/19 10:31:42 UTC

svn commit: r326467 - /incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/jvmreg.h

Author: dlydick
Date: Wed Oct 19 01:31:33 2005
New Revision: 326467

URL: http://svn.apache.org/viewcvs?rev=326467&view=rev
Log:
Reversed the definition of local variable storage so that instead
of FP[0] being the first of 'n' local variables, FP[0 - n + 1] is
the first local variable and FP[0] is local 'n - 1'.

Updated ARCH_xxx() macros for better diagnostic support.

Minor documentation adjustments.

Modified:
    incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/jvmreg.h

Modified: incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/jvmreg.h
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/jvmreg.h?rev=326467&r1=326466&r2=326467&view=diff
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/jvmreg.h (original)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/jvmreg.h Wed Oct 19 01:31:33 2005
@@ -16,7 +16,9 @@
  *
  * @section Control
  *
- * \$URL$ \$Id$
+ * \$URL$
+ *
+ * \$Id$
  *
  * Copyright 2005 The Apache Software Foundation
  * or its licensors, as applicable.
@@ -40,13 +42,16 @@
  * @date \$LastChangedDate$
  *
  * @author \$LastChangedBy$
+ *
  *         Original code contributed by Daniel Lydick on 09/28/2005.
  *
  * @section Reference
  *
  */
 
-ARCH_COPYRIGHT_APACHE(jvmreg, h, "$URL$ $Id$");
+ARCH_HEADER_COPYRIGHT_APACHE(jvmreg, h,
+"$URL$",
+"$Id$");
 
 /*!
  * @brief Program counter.
@@ -56,8 +61,9 @@
  * class, method, attribute of code area, and offset in the
  * code array.
  *
- * @todo  Does an @p @b arraydims item need to be added for processing
- *        of array classes, or is the scalar concept sufficient in code?
+ * @todo  HARMONY-6-jvm-jvmreg.h-1 Does an @p @b arraydims item need
+ *        to be added for processing of array classes, or is the
+ *        scalar concept sufficient in code?
  */
 typedef struct
 {
@@ -133,7 +139,7 @@
 
 /*!
  * @warning WATCH OUT! When invoking POP_GC() you are working with a
- * partially torn down frame, so can't use this macro:
+ *          partially torn down frame, so can't use this macro:
  */
 #define JVMREG_STACK_MIN_FRAME_HEIGHT (JVMREG_STACK_GC_HEIGHT + \
                                     JVMREG_STACK_FP_HEIGHT + \
@@ -158,7 +164,7 @@
 
 
 /*!
- * @name Reading and writing to the stack pointer.
+ * @name Reading and writing the stack pointer.
  *
  * @brief Load/store values from/to the stack pointer itself, 
  * not stack memory it points to.
@@ -193,12 +199,12 @@
  * @param thridx  Thread index of thread whose stack it to
  *                be manipulated.
  *
- * @param value   (jint) value to store into stack location.
+ * @param value   (@link #jint jint@endlink) value to store into
+ *                stack location.
  *
  *
  * @returns The @b GET_SP() macros return a (jint) value from
- *          the stack, the others
- *          return @link #rvoid rvoid@endlink.
+ *          the stack, the others return @link #rvoid rvoid@endlink.
  *
  */
 
@@ -212,6 +218,15 @@
 
 /*!
  * @brief Write a word at given depth in stack.
+ *
+ * @warning The @c @b value parameter @e must be of
+ *          type @link #jint jint@endlink.  It will
+ *          be cast as such in order to fit, but if
+ *          it is a @link #jfloat jfloat@endlink or
+ *          wider than this, the wrong value @e will
+ *          be stored without compiler or run-time
+ *          notification.
+ *
  */
 #define PUT_SP_WORD(thridx, idx, value) \
     STACK(thridx, GET_SP(thridx) - idx) = (jint) (value)
@@ -220,7 +235,7 @@
 
 
 /*!
- * @name Reading and writing to the stack pointer.
+ * @name Reading and writing the frame pointer.
  *
  * @brief Load/store values from/to the frame pointer.
  *
@@ -228,7 +243,8 @@
  * @param thridx  Thread index of thread whose frame pointer
  *                is to be referenced.
  *
- * @param value   (jvm_sp) value to store into frame pointer.
+ * @param value   (@link #jvm_sp jvm_sp@endlink) value to store
+ *                into frame pointer.
  *
  *
  * @returns The @b GET_FP() macros return a (jvm_sp) value of
@@ -368,13 +384,13 @@
  * it is cast here as a simple @link #rvoid rvoid@endlink pointer so as
  * to support all of them.
  *
- * @todo  Verify that the 64-bit real pointer
+ * @todo  HARMONY-6-jvm-jvmreg.h-2 Verify that the 64-bit real pointer
  *        calculations work properly for @b PUSH_GC() and @b POP_GC()
  *        (namely, where use fo JVMREG_STACK_GC_HEIGHT is involved)
  *
  * @warning WATCH OUT! When invoking @b POP_GC() you are working with a
- * partially torn down frame, so can't use standard macros
- * to calculate stack offsets!
+ *          partially torn down frame, so can't use standard macros
+ *          to calculate stack offsets!
  *
  *
  * @param thridx  Thread index of thread whose stack pointer
@@ -415,7 +431,8 @@
  * @param thridx  Thread index of thread whose stack pointer
  *                is to be referenced.
  *
- * @param value   (jint) value to change stack pointer by.
+ * @param value   (@link #jint jint@endlink) value to change
+ *                stack pointer by.
  *
  *
  * @returns @link #rvoid rvoid@endlink
@@ -446,6 +463,11 @@
  *
  * @returns (jvm_sp) stack offset value of requested item.
  *
+ * @todo  HARMONY-6-jvm-jvmreg.h-3 Verify that
+ *        @link #JVMREG_FRAME_CURRENT_LOCAL_VAR_AREA()
+          JVMREG_FRAME_CURRENT_LOCAL_VAR_AREA()@endlink does not
+ *        need a '+1' addition.
+ *
  */
 
 /*@{ */ /* Begin grouped definitions */
@@ -459,7 +481,9 @@
 #define JVMREG_FRAME_PREVIOUS_FP(thridx) \
     (GET_FP(thridx) + JVMREG_STACK_FP_OFFSET)
 
-#define JVMREG_FRAME_CURRENT_SCRATCH_AREA(thridx) GET_FP(thridx)
+#define JVMREG_FRAME_CURRENT_LOCAL_VAR_AREA(thridx) \
+    (GET_FP(thridx) /* + 1 */ - \
+     STACK(thridx, JVMREG_FRAME_CURRENT_LOCAL_STORAGE_SIZE(thridx)))
 
 /*@} */ /* End of grouped definitions */
 
@@ -475,26 +499,32 @@
  * @param _thridx      Thread index of thread whose stack pointer
  *                     is to be referenced.
  *
- * @param _source      (jvm_pc) value to be loaded
+ * @param _source      (@link #jvm_pc jvm_pc@endlink) value to be loaded
  *                     into program counter.
  *
- * @param _clsidx      (jvm_class_index) value to be loaded
- *                     into program counter class index
+ * @param _clsidx      (@link #jvm_class_index jvm_class_index@endlink)
+ *                     value to be loaded into program counter class
+ *                     index
  *
- * @param _mthidx      (jvm_method_index) value to be loaded
+ * @param _mthidx      (@link #jvm_method_index
+                       jvm_method_index@endlink) value to be loaded
  *                     into program counter class index
  *
- * @param _codeatridx  (jvm_attribute_index) value to be loaded
+ * @param _codeatridx  (@link #jvm_attribute_index
+                       jvm_attribute_index@endlink) value to be loaded
  *                     into program counter class index
  *
- * @param _excpatridx  (jvm_attribute_index) value to be loaded
+ * @param _excpatridx  (@link #jvm_attribute_index
+                       jvm_attribute_index@endlink) value to be loaded
  *                     into program counter class index
  *
- * @param _excpatridx  (jvm_attribute_index) value to be loaded
+ * @param _excpatridx  (@link #jvm_attribute_index
+                       jvm_attribute_index@endlink) value to be loaded
  *                     into program counter class index
  *
- * @param _offset      (jvm_pc_offset) value to be loaded
- *                     into program counter class index
+ * @param _offset      (@link #jvm_pc_offset jvm_pc_offset@endlink)
+ *                     value to be loaded into program counter class
+ *                     index
  *
  * @param _field       Field from program counter to extract.
  *
@@ -556,7 +586,6 @@
 /*!
  * @name Location of the old program counter in the current stack frame.
  *
- * @warning  Notice NEGATIVE INDEX used to address the stack frame.
  */
 
 /*@{ */ /* Begin grouped definitions */
@@ -629,11 +658,11 @@
  *
  *
  * @param thridx  Thread table index of class to locate for
- * current program counter.
+ *                current program counter.
  *
  *
  * @returns address of ClassFile structure containing code at
- * current program counter on this thread.
+ *          current program counter on this thread.
  *
  */
 #define THIS_PCFS(thridx) \
@@ -647,19 +676,22 @@
  * counter on a given thread.
  *
  *
- * @param thridx  Thread table index of attribute to locate for
- * current program counter.
+ * @param thridx    Thread table index of attribute to locate for
+ *                  current program counter.
  *
  * @param pc_member jvm_pc member index in current program counter to
- * pick out and examine.
+ *                  pick out and examine.
  *
  *
  * @returns Plain attribute address (no special attribute type)
- * of an attribute in method area of the current program counter
- * on this thread, or @link #rnull rnull@endlink if a @b BAD attribute .
+ *          of an attribute in method area of the current program
+ *          counter on this thread, or @link #rnull rnull@endlink if
+ *          a @b BAD attribute .
  *
- * @todo Watch out for when @p @b codeatridx is a BAD index, namely
- * @link #jvm_attribute_index_bad jvm_attribute_index_bad@endlink
+ *
+ * @todo HARMONY-6-jvm-jvmreg.h-4 Watch out for when @p @b codeatridx
+ *       is a BAD index, namely
+ *       @link #jvm_attribute_index_bad jvm_attribute_index_bad@endlink
  *
  */
 #define DEREFERENCE_PC_GENERIC_ATTRIBUTE(thridx, pc_member) \
@@ -678,11 +710,11 @@
  *
  *
  * @param thridx  Thread table index of @b Exceptions attribute to
- * locate for current program counter.
+ *                locate for current program counter.
  *
  *
  * @returns Address of @b Exceptions attribute in method area of
- * the current program counter on this thread.
+ *          the current program counter on this thread.
  *
  */
 #define DEREFERENCE_PC_EXCEPTIONS_ATTRIBUTE(thridx) \
@@ -698,12 +730,12 @@
  *
  *
  * @param thridx  Thread table index of @b Code attribute to locate for
- * current program counter.
+ *                current program counter.
  *
  *
  * @returns Address of @b Code attribute in method area of
- * the current program counter on this thread, or
- * @link #rnull rnull@endlink if not present in class file.
+ *          the current program counter on this thread, or
+ *          @link #rnull rnull@endlink if not present in class file.
  *
  */
 #define DEREFERENCE_PC_CODE_ATTRIBUTE(thridx) \
@@ -722,7 +754,7 @@
  *
  *
  * @returns address of program counter in this thread table, or
- * @link #rnull rnull@endlink if not present in class file.
+ *          @link #rnull rnull@endlink if not present in class file.
  *
  */
 #define DEREFERENCE_PC_EXCEPTION_TABLE(thridx) \
@@ -737,11 +769,11 @@
  *
  *
  * @param thridx  Thread table index of opcode to locate for
- * current program counter.
+ *                current program counter.
  *
  *
  * @returns Real machine address of @e first opcode in current
- * program counter on this thread.
+ *          program counter on this thread.
  *
  */
 #define DEREFERENCE_PC_CODE_BASE(thridx) \
@@ -756,11 +788,11 @@
  *
  *
  * @param thridx  Thread table index of opcode to locate for
- * current program counter.
+ *                current program counter.
  *
  *
  * @returns Real machine address of @e current opcode in current
- * program counter on this thread.
+ *          program counter on this thread.
  *
  */
 #define DEREFERENCE_PC_CODE_CURRENT_OPCODE(thridx) \
@@ -787,21 +819,21 @@
   
    @endverbatim
  *
- * During @b PUSH_FRAME(n), there are a@b n words of local storage
+ * During @b PUSH_FRAME(n), there are @b n words of local storage
  * allocated for JVM method scratch area, where @b n >= 0, up to
  * the maximum stack size less the top few words:
  *
  * @verbatim
   
-   new SP -->  [PC of next JVM instruction]           ... high address
+   new SP -->  [PC of next JVM instruction]           ... higher address
                [old FP]                                     ...
                [GC pointer for this NEW frame]              ...
                [value 'n', size of LS (local storage) area beneath]
-   new FP -->  [local 0]                                    ...
-               [local 1]                                    ...
-               [local 2]                                    ...
+   new FP -->  [local n-1]                                  ...
                  ...                                        ...
-               [local n-1]                                  ...
+               [local 2]                                    ...
+               [local 1]                                    ...
+               [local 0]                                    ...
   
    --- end of NEW frame ---
   
@@ -809,7 +841,7 @@
                  ...                                        ...
                [scratch]                                    ...
                [top of previous frame]                      ...
-   old FP ->   [locals of previous frame]             ... low address
+   old FP ->   [locals of previous frame]             ... lower address
   
    --- end of OLD frame ---
   
@@ -833,6 +865,30 @@
  *
  * @returns @link #rvoid rvoid@endlink.
  *
+ *
+ * @note The original layout of the local variable area was from
+ *       <b><code>FP[0]</code></b> to
+ *       <b><code>FP[0 - n + 1]</code></b>.  However, that would
+ *       mean that in order to perform a virtual method call, the
+ *       method's parameter block of @c @b p parameters would
+ *       have to be popped off the JVM stack, stored somewhere, a
+ *       new frame of @c @b n locals built with
+ *       @link #PUSH_FRAME() PUSH_FRAME@endlink, and the parm block
+ *       put into the local variables.  Even if the frame was built
+ *       with <b><code>n - p</code></b> locals on top of that block,
+ *       it would @e still have to be reversed so that
+ *       <b><code>parm[0]</code></b> would reside in
+ *       <b><code>FP[0]</code></b>. This overhead can be avoided by
+ *       reversing the order of the local variable index to correspond
+ *       directly to the parameters as they are found on the stack
+ *       at @link #PUSH_FRAME PUSH_FRAME@endlink time.  This will
+ *       correspond to the first @c @b p of the @c @b n local
+ *       variables, where <b><code>n \>= p + m</code></b> at all times.
+ *       Remember that for static methods, <b><code>m := 0</code></b>,
+ *       namely, no @c @b this object hash is supplied, but for object
+ *       instance methods, <b><code>m := 1</code></b> for the @c @b this
+ *       object hash.
+ *
  */
 
 /*@{ */ /* Begin grouped definitions */
@@ -863,24 +919,6 @@
  * Accesses are @e always as (jint), casting is performed
  * outside of these macros.
  *
- * @todo  This implementation is being changed to point local variable
- * zero to the _last_ word of the local variable area instead of the
- * _first_ word.  This will create a run-time tradeoff between reversing
- * the stack frame for method calls and a slightly longer expression
- * needed to access local variables.  The former (current way) makes
- * for a somewhat more complex method invocation procedure, while the
- * latter (to be done) provides an easy method invocation with a bit
- * more work to access locals.  The following warning notice will go
- * away when this is done:
- *
- * NOTICE THE INDEX IS ***NEGATIVE*** in this implementation!
- * This allows FP to use constant values to each and every element of
- * the frame, including a constant value to point to the @e first of
- * the local variables.  By inverting the frame to have the locals on
- * top, this same thing could be done and the FP could point either
- * to its corresponding inverse location or to the first word of the
- * frame above the old stack contents.
- *
  *
  * @param thridx  Thread index of thread whose stack pointer
  *                is to be referenced.
@@ -899,18 +937,19 @@
  * @brief Read a local variable from the stack frame
  *
  * @note For (jlong) and (jdouble) local variables, there are
- * @e two accesses required per JVM spec to retrieve the two
- * (jint) words of such a data type.  Use bytegames_combine_long()
- * and bytegames_combine_double(), respectively, to combine the
- * two words into a single variable.  The parameters may be
- * read directly from the stack frame with this macro.
+ *       @e two accesses required per JVM spec to retrieve the two
+ *       (jint) words of such a data type.  Use bytegames_combine_long()
+ *       and bytegames_combine_double(), respectively, to combine the
+ *       two words into a single variable.  The parameters may be
+ *       read directly from the stack frame with this macro.
  *
  *
  * @returns (jint) value of a local variable in the stack frame.
  *
  */
 #define GET_LOCAL_VAR(thridx, frmidx) \
-    ((jint) (STACK(thridx, GET_FP(thridx) - frmidx)))
+    ((jint) (STACK(thridx, \
+                 JVMREG_FRAME_CURRENT_LOCAL_VAR_AREA(thridx) + frmidx)))
 
 /*!
  * @brief Cast a @link #GET_LOCAL_VAR() GET_LOCAL_VAR()@endlink
@@ -936,18 +975,19 @@
  *
  */
 #define JINT_ADDRESS_LOCAL_VAR(thridx, frmidx) \
-    ((jint *) &STACK(thridx, GET_FP(thridx) - frmidx))
+    ((jint *) &STACK(thridx, \
+                  JVMREG_FRAME_CURRENT_LOCAL_VAR_AREA(thridx) + frmidx))
 
 
 /*!
  * @brief Write a local variable from the stack frame
  *
  * @note For (jlong) and (jdouble) local variables, there are
- * @e two accesses required per JVM spec to store the two
- * (jint) words of such a data type.  Use bytegames_split_long()
- * and bytegames_split_double(), respectively, to split
- * a single variable into its two words.  The parameters may be
- * written directly into the stack frame with this macro.
+ *       @e two accesses required per JVM spec to store the two
+ *       (jint) words of such a data type.  Use bytegames_split_long()
+ *       and bytegames_split_double(), respectively, to split
+ *       a single variable into its two words.  The parameters may be
+ *       written directly into the stack frame with this macro.
  *
  *
  * @returns (jint) value of a local variable in the stack frame.