fi
+dnl check for replacement
+AC_MSG_CHECKING(whether on-stack replacement should be supported)
+AC_ARG_ENABLE([replacement],
+ [AS_HELP_STRING(--enable-replacement,enable on-stack replacement [[default=no]])],
+ [case "${enableval}" in
+ yes) ENABLE_REPLACEMENT=yes;;
+ *) ENABLE_REPLACEMENT=no;;
+ esac],
+ [ENABLE_REPLACEMENT=no])
+AC_MSG_RESULT(${ENABLE_REPLACEMENT})
+AM_CONDITIONAL([ENABLE_REPLACEMENT], test x"${ENABLE_REPLACEMENT}" = "xyes")
+
+if test x"${ENABLE_REPLACEMENT}" = "xyes"; then
+ AC_DEFINE([ENABLE_REPLACEMENT], 1, [use on-stack replacement])
+fi
+
+
dnl check for loop optimization
AC_MSG_CHECKING(whether loop optimization should be supported)
AC_ARG_ENABLE([loop],
##
## Changes: Edwin Steiner
##
-## $Id: Makefile.am 5895 2006-11-03 14:03:40Z twisti $
+## $Id: Makefile.am 6265 2007-01-02 20:40:57Z edwin $
## Process this file with automake to produce Makefile.in
schedule/libschedule.la
endif
+REPLACE_SOURCES =
+
if ENABLE_JIT
REG_SOURCES = \
reg.c \
reg.h
-REPLACE_SOURCES = \
- replace.c \
+REPLACE_SOURCES += \
replace.h
STACK_SOURCES = \
stack.h
endif
+if ENABLE_REPLACEMENT
+REPLACE_SOURCES += \
+ replace.c
+endif
+
if WITH_BINUTILS_DISASSEMBLER
DISASS_SOURCES = disass-common.c
else
Christian Thalinger
Edwin Steiner
- $Id: asmpart.S 6147 2006-12-07 23:54:40Z edwin $
+ $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
*/
.globl asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl asm_replacement_in
+#endif
.globl asm_criticalsections
.globl asm_getclassvalues_atomic
.end asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
+
/* asm_replacement_out *********************************************************
This code is jumped to from the replacement-out stubs that are executed
.end asm_replacement_in
+#endif /* defined(ENABLE_REPLACEMENT) */
+
.ent asm_getclassvalues_atomic
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void emit_replacement_stubs(jitdata *jd)
{
codegendata *cd;
assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
}
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* emit_verbosecall_enter ******************************************************
Christian Thalinger
Edwin Steiner
- $Id: md.c 6142 2006-12-07 23:02:52Z edwin $
+ $Id: md.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
{
s4 disp;
/* flush instruction cache */
md_icacheflush(rp->pc,4);
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.
Changes: Christian Thalinger
Edwin Steiner
- $Id: asmpart.h 6147 2006-12-07 23:54:40Z edwin $
+ $Id: asmpart.h 6265 2007-01-02 20:40:57Z edwin $
*/
void asm_patcher_wrapper(void);
/* functions for on-stack replacement */
+#if defined(ENABLE_REPLACEMENT)
void asm_replacement_out(void);
void asm_replacement_in(executionstate_t *es, replace_safestack_t *st);
+#endif
#if defined(ENABLE_THREADS)
extern critical_section_node_t asm_criticalsections;
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
int code_get_sync_slot_count(codeinfo *code)
{
#ifdef ENABLE_THREADS
#endif /* ENABLE_THREADS */
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* code_get_stack_frame_size ***************************************************
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
int code_get_stack_frame_size(codeinfo *code)
{
#if 0
return code->stackframesize;
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* code_codeinfo_free **********************************************************
if (code->mcode != NULL)
CFREE((void *) (ptrint) code->mcode, code->mcodelength);
+#if defined(ENABLE_REPLACEMENT)
replace_free_replacement_points(code);
+#endif
FREE(code, codeinfo);
s4 mcodelength; /* length of generated machine code */
/* replacement */
+#if defined(ENABLE_REPLACEMENT)
rplpoint *rplpoints; /* replacement points */
rplalloc *regalloc; /* register allocation info */
u1 *replacementstubs; /* beginning of replacement stubs */
u1 savedintcount; /* number of callee saved int regs */
u1 savedfltcount; /* number of callee saved flt regs */
u1 *savedmcode; /* saved code under patches */
+#endif /* defined(ENABLE_REPLACEMENT) */
u4 frequency; /* number of method invocations */
u4 *bbfrequency;
codeinfo *code_find_codeinfo_for_pc(u1 *pc);
+#if defined(ENABLE_REPLACEMENT)
int code_get_sync_slot_count(codeinfo *code);
int code_get_stack_frame_size(codeinfo *code);
+#endif /* defined(ENABLE_REPLACEMENT) */
void code_free_code_of_method(methodinfo *m);
memory. All functions writing values into the data area return the offset
relative the begin of the code area (start of procedure).
- $Id: codegen-common.c 6251 2006-12-27 23:15:56Z twisti $
+ $Id: codegen-common.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
#if !defined(NDEBUG)
void codegen_set_replacement_point_notrap(codegendata *cd, s4 type)
#else
cd->replacementpoint++;
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* codegen_set_replacement_point ***********************************************
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
#if !defined(NDEBUG)
void codegen_set_replacement_point(codegendata *cd, s4 type)
#else
cd->lastmcodeptr = cd->mcodeptr + PATCHER_CALL_SIZE;
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* codegen_finish **************************************************************
*((ptrint *) ((ptrint) epoint + cd->linenumbertablesizepos)) = lrtlen;
}
+#if defined(ENABLE_REPLACEMENT)
/* replacement point resolving */
{
int i;
rp->pc = (u1*) ((ptrint) epoint + (ptrint) rp->pc);
}
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* add method into methodtree to find the entrypoint */
Christian Ullrich
Edwin Steiner
- $Id: codegen-common.h 6091 2006-11-29 20:44:10Z twisti $
+ $Id: codegen-common.h 6265 2007-01-02 20:40:57Z edwin $
*/
s4 maxstack;
s4 stackframesize; /* stackframe size of this method */
+#if defined(ENABLE_REPLACEMENT)
rplpoint *replacementpoint; /* current replacement point */
+#endif
};
u1 *codegen_get_pv_from_pc(u1 *pc);
u1 *codegen_get_pv_from_pc_nocheck(u1 *pc);
+#if defined(ENABLE_REPLACEMENT)
#if !defined(NDEBUG)
void codegen_set_replacement_point_notrap(codegendata *cd, s4 type);
void codegen_set_replacement_point(codegendata *cd, s4 type);
void codegen_set_replacement_point_notrap(codegendata *cd);
void codegen_set_replacement_point(codegendata *cd);
#endif
+#endif /* defined(ENABLE_REPLACEMENT) */
void codegen_finish(jitdata *jd);
Changes: Joseph Wenninger
Edwin Steiner
- $Id: asmpart.S 6155 2006-12-08 00:17:11Z edwin $
+ $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
*/
.globl asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl asm_replacement_in
+#endif
.globl asm_builtin_f2i
.globl asm_builtin_f2l
pop xpc /* get and remove return address */
jmp L_asm_handle_exception
+#if defined(ENABLE_REPLACEMENT)
/* asm_replacement_out *********************************************************
/* jump to new code, hold your thumbs! ;) */
ret
+#endif /* defined(ENABLE_REPLACEMENT) */
+
/************************ function asm_builtin_x2x *****************************
* *
Authors: Christian Thalinger
- $Id: emit.c 6171 2006-12-11 11:47:42Z twisti $
+ $Id: emit.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void emit_replacement_stubs(jitdata *jd)
{
codegendata *cd;
assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE);
}
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* emit_verbosecall_enter ******************************************************
Authors: Christian Thalinger
Edwin Steiner
- $Id: md.c 6142 2006-12-07 23:02:52Z edwin $
+ $Id: md.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
{
s4 disp;
/* XXX if required asm_cacheflush(rp->pc,8); */
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.
Christian Thalinger
Edwin Steiner
- $Id: jit.h 6211 2006-12-16 22:53:24Z edwin $
+ $Id: jit.h 6265 2007-01-02 20:40:57Z edwin $
*/
s4 *javalocals_end; /* javalocals after inlined body */
/* fields set by replacement point creation ------------------------------*/
+#if defined(ENABLE_REPLACEMENT)
rplpoint *rp; /* replacement point at INLINE_START */
+#endif
/* fields set by the codegen ---------------------------------------------*/
s4 startmpc; /* machine code offset of start of inlining */
Changes: Christian Thalinger
Edwin Steiner
- $Id: asmpart.S 5930 2006-11-06 21:12:52Z twisti $
+ $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
*/
.globl asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl asm_replacement_in
+#endif
.globl asm_getclassvalues_atomic
.globl asm_criticalsections
.end asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
/* asm_replacement_out *********************************************************
.end asm_replacement_in
+#endif /* defined(ENABLE_REPLACEMENT) */
+
.ent asm_getclassvalues_atomic
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void emit_replacement_stubs(jitdata *jd)
{
codegendata *cd;
assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
}
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* emit_verbosecall_enter ******************************************************
Authors: Christian Thalinger
Edwin Steiner
- $Id: md.c 6180 2006-12-11 23:29:26Z twisti $
+ $Id: md.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp,
u1 *savedmcode)
{
/* flush instruction cache */
md_icacheflush(rp->pc,2*4);
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.
Changes: Christian Thalinger
Edwin Steiner
- $Id: asmpart.S 6182 2006-12-12 21:12:23Z twisti $
+ $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
*/
.globl asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl asm_replacement_in
+#endif
.globl asm_cacheflush
.globl asm_criticalsections
addi sp,sp,8*4+LA_SIZE+(5+58)*4
b L_asm_handle_exception
+#if defined(ENABLE_REPLACEMENT)
/* asm_replacement_out *********************************************************
mtctr itmp3
bctr
+#endif /* defined(ENABLE_REPLACEMENT) */
+
/*********************************************************************/
asm_cacheflush:
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void emit_replacement_stubs(jitdata *jd)
{
codegendata *cd;
assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
}
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* emit_verbosecall_enter ******************************************************
Authors: Christian Thalinger
Edwin Steiner
- $Id: md.c 6142 2006-12-07 23:02:52Z edwin $
+ $Id: md.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
{
s4 disp;
/* flush instruction cache */
md_icacheflush(rp->pc,4);
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.
Changes: Christian Thalinger
Edwin Steiner
- $Id: asmpart.S 6100 2006-12-01 11:38:47Z tbfg $
+ $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
*/
.globl asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl .asm_replacement_in
+#endif
.globl .asm_cacheflush /* no function descriptor needed, only called direct */
.globl asm_criticalsections
addi sp,sp,LA_SIZE+PA_SIZE+ARG_CNT*8+TMP_CNT*8+4*8+8*8
b L_asm_handle_exception
+#if defined(ENABLE_REPLACEMENT)
/* asm_replacement_out *********************************************************
mtctr itmp3
bctr
+#endif /* defined(ENABLE_REPLACEMENT) */
+
/* asm_cacheflush **************************************************************
copied from linux/arch/ppc64/kernel/vdso64/cacheflush.S
assumes 128 byte cache line size.
Changes: Edwin Steiner
- $Id: md.c 6142 2006-12-07 23:02:52Z edwin $
+ $Id: md.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
{
s4 disp;
/* flush instruction cache */
md_icacheflush(rp->pc,4);
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.
#ifndef _REPLACE_H
#define _REPLACE_H
+#include "config.h"
+#include "vm/types.h"
+
+#if defined(ENABLE_REPLACEMENT)
+
/* forward typedefs ***********************************************************/
typedef struct rplpoint rplpoint;
typedef struct replace_safestack_t replace_safestack_t;
typedef union replace_val_t replace_val_t;
-#include "config.h"
-#include "vm/types.h"
-
#include "arch.h"
#include "md-abi.h"
u1 *savedmcode);
#endif
+#else /* !defined(ENABLE_REPLACEMENT) */
+
+/*** macros for the codegens (disabled version) ************************/
+
+#define REPLACEMENT_POINTS_INIT(cd, jd)
+#define REPLACEMENT_POINTS_RESET(cd, jd)
+#define REPLACEMENT_POINT_BLOCK_START(cd, bptr)
+#define REPLACEMENT_POINT_INLINE_START(cd, iptr)
+#define REPLACEMENT_POINT_INLINE_BODY(cd, iptr)
+#define REPLACEMENT_POINT_RETURN(cd, iptr)
+#define REPLACEMENT_POINT_INVOKE(cd, iptr)
+#define REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr)
+#define REPLACEMENT_EMIT_STUBS(jd)
+
+#endif /* defined(ENABLE_REPLACEMENT) */
+
#endif
/*
printf("\n");
}
+#if defined(ENABLE_REPLACEMENT)
if (code->rplpoints) {
printf("Replacement Points:\n");
replace_show_replacement_points(code);
printf("\n");
}
+#endif /* defined(ENABLE_REPLACEMENT) */
#if defined(ENABLE_DISASSEMBLER)
/* show code before first basic block */
}
printf("======== %sL%03d ======== %s(flags: %d, bitflags: %01x, next: %d, type: ",
- (bptr->bitflags & BBFLAG_REPLACEMENT) ? "<REPLACE> " : "",
+#if defined(ENABLE_REPLACEMENT)
+ (bptr->bitflags & BBFLAG_REPLACEMENT) ? "<REPLACE> " :
+#endif
+ "",
bptr->nr,
(deadcode && stage >= SHOW_STACK) ? "DEADCODE! " : "",
bptr->flags, bptr->bitflags,
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void emit_replacement_stubs(jitdata *jd)
{
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* emit_verbosecall_enter ******************************************************
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
{
s4 disp;
/* flush instruction cache */
/* md_icacheflush(rp->pc,4); */
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.
Changes: Edwin Steiner
- $Id: genoffsets.c 5950 2006-11-11 17:08:14Z edwin $
+ $Id: genoffsets.c 6265 2007-01-02 20:40:57Z edwin $
*/
printf("#define sizevmarg %3d\n", (s4) sizeof(vm_arg));
printf("#define sizestackframeinfo %3d\n", (s4) sizeof(stackframeinfo));
+
+#if defined(ENABLE_REPLACEMENT)
printf("#define sizeexecutionstate %3d\n", (s4) sizeof(executionstate_t));
+#endif
printf("\n\n/* define some offsets */\n\n");
printf("#define offcast_super_diffval %3d\n", (s4) OFFSET(castinfo, super_diffval));
printf("#define offcast_sub_baseval %3d\n", (s4) OFFSET(castinfo, sub_baseval));
+#if defined(ENABLE_REPLACEMENT)
printf("#define offes_pc %3d\n", (s4) OFFSET(executionstate_t, pc));
printf("#define offes_sp %3d\n", (s4) OFFSET(executionstate_t, sp));
printf("#define offes_pv %3d\n", (s4) OFFSET(executionstate_t, pv));
printf("#define offes_intregs %3d\n", (s4) OFFSET(executionstate_t, intregs));
printf("#define offes_fltregs %3d\n", (s4) OFFSET(executionstate_t, fltregs));
+#endif /* defined(ENABLE_REPLACEMENT) */
/* everything is ok */
Changes: Edwin Steiner
- $Id: asmpart.S 6147 2006-12-07 23:54:40Z edwin $
+ $Id: asmpart.S 6265 2007-01-02 20:40:57Z edwin $
*/
.globl asm_patcher_wrapper
+#if defined(ENABLE_REPLACEMENT)
.globl asm_replacement_out
.globl asm_replacement_in
+#endif
.globl asm_builtin_f2i
.globl asm_builtin_f2l
pop xpc /* get and remove return address */
jmp L_asm_handle_exception
+#if defined(ENABLE_REPLACEMENT)
/* asm_replacement_out *********************************************************
/* jump to new code */
ret
+#endif /* defined(ENABLE_REPLACEMENT) */
+
/* asm_builtin_x2x *************************************************************
* *
Authors: Christian Thalinger
- $Id: emit.c 6171 2006-12-11 11:47:42Z twisti $
+ $Id: emit.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void emit_replacement_stubs(jitdata *jd)
{
codegendata *cd;
assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE);
}
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/* emit_verbosecall_enter ******************************************************
Changes: Edwin Steiner
- $Id: md.c 6142 2006-12-07 23:02:52Z edwin $
+ $Id: md.c 6265 2007-01-02 20:40:57Z edwin $
*/
*******************************************************************************/
+#if defined(ENABLE_REPLACEMENT)
void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
{
s4 disp;
/* XXX if required asm_cacheflush(rp->pc,8); */
}
+#endif /* defined(ENABLE_REPLACEMENT) */
/*
* These are local overrides for various environment variables in Emacs.