method_print. Fixed typo.
* src/vm/jit/powerpc/md.c (md_codegen_findmethod): Handle 2
instruction returns properly.
- $Id: md.c 4357 2006-01-22 23:33:38Z twisti $
+ $Id: md.c 4368 2006-01-24 10:30:42Z twisti $
#include "vm/types.h"
#include "md-abi.h"
#include "vm/types.h"
#include "md-abi.h"
- 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
*******************************************************************************/
*******************************************************************************/
- pv = ra;
-
- /* get offset of first instruction (addi) */
+ /* get first instruction word after jump */
mcode = *((u4 *) (ra + 1 * 4));
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;
+
Changes: Christian Thalinger
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 $
#if PRINTMETHODS
printf("ra=%p sp=%p, ", ra, sp);
#if PRINTMETHODS
printf("ra=%p sp=%p, ", ra, sp);
- utf_display_classname(m->class->name);
- printf(".");
- utf_display(m->name);
- utf_display(m->descriptor);
printf(": native stub\n");
fflush(stdout);
#endif
printf(": native stub\n");
fflush(stdout);
#endif
if (m != NULL) {
#if PRINTMETHODS
printf("ra=%p sp=%p, ", ra, sp);
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);
printf(": inline stub parent");
fflush(stdout);
#endif
printf(": inline stub parent");
fflush(stdout);
#endif
framesize = *((u4 *) (pv + FrameSize));
#if PRINTMETHODS
framesize = *((u4 *) (pv + FrameSize));
#if PRINTMETHODS
- printf(", framsize=%d\n", framesize);
+ printf(", framesize=%d\n", framesize);
} else {
#if PRINTMETHODS
printf("ra=%p sp=%p, ", ra, sp);
} 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);
printf(": JIT");
fflush(stdout);
#endif
printf(": JIT");
fflush(stdout);
#endif
framesize = *((u4 *) (pv + FrameSize));
#if PRINTMETHODS
framesize = *((u4 *) (pv + FrameSize));
#if PRINTMETHODS
- printf(", framsize=%d\n", framesize);
+ printf(", framesize=%d\n", framesize);