* src/vm/jit/stacktrace.c (cacao_stacktrace_fillInStackTrace): Use
authortwisti <none@none>
Tue, 24 Jan 2006 10:30:42 +0000 (10:30 +0000)
committertwisti <none@none>
Tue, 24 Jan 2006 10:30:42 +0000 (10:30 +0000)
method_print. Fixed typo.
* src/vm/jit/powerpc/md.c (md_codegen_findmethod): Handle 2
instruction returns properly.

src/vm/jit/powerpc/md.c
src/vm/jit/stacktrace.c

index dc7ea181cb554cb2117ae510b40766390334a741..f599defe76e28e5b2303e1a32786812f91fdfabd 100644 (file)
 
    Changes:
 
-   $Id: md.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: md.c 4368 2006-01-24 10:30:42Z twisti $
 
 */
 
 #include "config.h"
+
+#include <assert.h>
+
 #include "vm/types.h"
 
 #include "md-abi.h"
@@ -75,8 +78,14 @@ u1 *md_stacktrace_get_returnaddress(u1 *sp, u4 framesize)
 
    Machine code:
 
-   7d6802a6    mflr  r11
-   39abffe0    addi  r13,r11,-32
+   7d6802a6    mflr    r11
+   39abffe0    addi    r13,r11,-32
+
+   or
+
+   7d6802a6    mflr    r11
+   3dabffff    addis   r13,r11,-1
+   39ad68b0    addi    r13,r13,26800
 
 *******************************************************************************/
 
@@ -84,25 +93,43 @@ u1 *md_codegen_findmethod(u1 *ra)
 {
        u1 *pv;
        u4  mcode;
-       s2  offset;
+       s4  offset;
 
-       pv = ra;
-
-       /* get offset of first instruction (addi) */
+       /* get first instruction word after jump */
 
        mcode = *((u4 *) (ra + 1 * 4));
-       offset = (s2) (mcode & 0x0000ffff);
-       pv += offset;
 
-       /* check for second instruction (addis) */
+       /* check if we have 2 instructions (addis, addi) */
+
+       if ((mcode >> 16) == 0x3dab) {
+               /* get displacement of first instruction (addis) */
+
+               offset = (s4) (mcode << 16);
+
+               /* get displacement of second instruction (addi) */
 
-       mcode = *((u4 *) (ra + 2 * 4));
+               mcode = *((u4 *) (ra + 2 * 4));
 
-       if ((mcode >> 16) == 0x3dad) {
-               offset = (s2) (mcode << 16);
-               pv += offset;
+               /* check for addi instruction */
+
+               assert((mcode >> 16) == 0x39ad);
+
+               offset += (s2) (mcode & 0x0000ffff);
+
+       } else {
+               /* check for addi instruction */
+
+               assert((mcode >> 16) == 0x39ab);
+
+               /* get offset of first instruction (addi) */
+
+               offset = (s2) (mcode & 0x0000ffff);
        }
 
+       /* calculate PV via RA + offset */
+
+       pv = ra + offset;
+
        return pv;
 }
 
index 5f61ff78ee2e9887b7a11b9b5283460701cb379a..8a7f58bb082b5358a654af61581f0e910ae15f1c 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: stacktrace.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: stacktrace.c 4368 2006-01-24 10:30:42Z twisti $
 
 */
 
@@ -816,10 +816,7 @@ static bool cacao_stacktrace_fillInStackTrace(void **target,
 
 #if PRINTMETHODS
                                printf("ra=%p sp=%p, ", ra, sp);
-                               utf_display_classname(m->class->name);
-                               printf(".");
-                               utf_display(m->name);
-                               utf_display(m->descriptor);
+                               method_print(m);
                                printf(": native stub\n");
                                fflush(stdout);
 #endif
@@ -871,10 +868,7 @@ static bool cacao_stacktrace_fillInStackTrace(void **target,
                                if (m != NULL) {
 #if PRINTMETHODS
                                        printf("ra=%p sp=%p, ", ra, sp);
-                                       utf_display_classname(m->class->name);
-                                       printf(".");
-                                       utf_display(m->name);
-                                       utf_display(m->descriptor);
+                                       method_print(m);
                                        printf(": inline stub parent");
                                        fflush(stdout);
 #endif
@@ -893,7 +887,7 @@ static bool cacao_stacktrace_fillInStackTrace(void **target,
                                        framesize = *((u4 *) (pv + FrameSize));
 
 #if PRINTMETHODS
-                                       printf(", framsize=%d\n", framesize);
+                                       printf(", framesize=%d\n", framesize);
                                        fflush(stdout);
 #endif
 
@@ -935,10 +929,7 @@ static bool cacao_stacktrace_fillInStackTrace(void **target,
                } else {
 #if PRINTMETHODS
                        printf("ra=%p sp=%p, ", ra, sp);
-                       utf_display_classname(m->class->name);
-                       printf(".");
-                       utf_display(m->name);
-                       utf_display(m->descriptor);
+                       method_print(m);
                        printf(": JIT");
                        fflush(stdout);
 #endif
@@ -955,7 +946,7 @@ static bool cacao_stacktrace_fillInStackTrace(void **target,
                        framesize = *((u4 *) (pv + FrameSize));
 
 #if PRINTMETHODS
-                       printf(", framsize=%d\n", framesize);
+                       printf(", framesize=%d\n", framesize);
                        fflush(stdout);
 #endif