* src/vm/jit/linenumbertable.h: Likewise.
* src/vm/jit/Makefile.am (libjit_la_SOURCES): Added
linenumbertable.[ch].
* src/vm/jit/code.h (vm/jit/linenumbertable.h): Added.
(codeinfo): Added linenumbertable.
* src/vm/jit/codegen-common.c (vm/jit/linenumbertable.h): Added.
(codegen_setup): Create linenumbers list.
(codegen_reset): Likewise.
(codegen_finish): Removed old linenumber-resolving code and call
linenumbertable_create instead.
* src/vm/jit/codegen-common.h (codegendata): Removed
linenumberreferences, linenumbertablesizepos, linenumbertablestartpos,
linenumbertab, added linenumbers.
* src/vm/jit/dseg.c (dseg_addlinenumbertablesize): Removed.
(dseg_addlinenumber): Likewise.
(dseg_addlinenumber_inline_start): Likewise.
(dseg_addlinenumber_inline_end): Likewise.
(dseg_createlinenumbertable): Likewise.
(dseg_get_linenumber_from_pc_intern): Likewise.
(dseg_get_linenumber_from_pc): Likewise.
* src/vm/jit/dseg.h: Likewise
(linenumbertable_entry): Removed.
* src/vm/jit/methodheader.h (LineNumberTableSize)
(LineNumberTableStart): Removed.
* src/vm/jit/stacktrace.c (vm/jit/linenumbertable.h): Added.
(stacktrace_method_add): Renamed dseg_get_linenumber_from_pc to
linenumbertable_linenumber_for_pc.
* src/vm/jit/alpha/asmpart.S,
src/vm/jit/arm/asmpart.S,
src/vm/jit/i386/asmpart.S,
src/vm/jit/m68k/asmpart.S,
src/vm/jit/mips/asmpart.S,
src/vm/jit/powerpc/asmpart.S,
src/vm/jit/powerpc64/asmpart.S,
src/vm/jit/s390/asmpart.S,
src/vm/jit/sparc64/asmpart.S,
src/vm/jit/x86_64/asmpart.S (asm_vm_call_method): Removed obsolete
method-header entries.
* src/vm/jit/alpha/codegen.c,
src/vm/jit/arm/codegen.c,
src/vm/jit/i386/codegen.c,
src/vm/jit/m68k/codegen.c,
src/vm/jit/mips/codegen.c,
src/vm/jit/powerpc/codegen.c,
src/vm/jit/powerpc64/codegen.c,
src/vm/jit/s390/codegen.c,
src/vm/jit/sparc64/codegen.c,
src/vm/jit/x86_64/codegen.c (vm/jit/linenumbertable.h): Added.
(codegen_emit): Removed dseg_addlinenumbertablesize call, use new
linenumbertable functions, removed dseg_createlinenumbertable.
(codegen_emit_stub_native): Removed obsolete method-header entries.
icmdtable.inc \
jit.c \
jit.h \
+ linenumbertable.c \
+ linenumbertable.h \
parse.c \
parse.h \
patcher-common.c \
.align 3
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
.long 0 /* fltsave */
.long 1 /* intsave */
.long 0 /* isleaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/parse.h"
#include "vm/jit/patcher-common.h"
#include "vm/jit/reg.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- dseg_addlinenumbertablesize(cd);
-
/* create stack frame (if necessary) */
if (cd->stackframesize)
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate traps */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate stub code */
.align 2
- .word 0 /* line number table start */
- .word 0 /* line number table size */
.word 0 /* FltSave */
.word 0 /* IntSave */
.word 0 /* IsLeaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/md.h"
#include "vm/jit/methodheader.h"
#include "vm/jit/parse.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
-
/* save return address and used callee saved registers */
savedregs_bitmask = 0;
/* add line number */
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
} /* for all basic blocks */
- dseg_createlinenumbertable(cd);
-
-
/* generate traps */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate stub code */
#include "vm/global.h"
#include "vm/jit/exceptiontable.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/replace.h"
#include "vmcore/method.h"
u1 *entrypoint; /* machine code entry point */
s4 mcodelength; /* length of generated machine code */
- exceptiontable_t *exceptiontable;
+ exceptiontable_t *exceptiontable;
+ linenumbertable_t *linenumbertable;
/* patcher list */
list_t *patchers;
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/md.h"
#include "vm/jit/methodheader.h"
#include "vm/jit/patcher-common.h"
cd->brancheslabel = list_create_dump(OFFSET(branch_label_ref_t, linkage));
cd->listcritical = list_create_dump(OFFSET(critical_section_ref_t, linkage));
-
- cd->linenumberreferences = NULL;
- cd->linenumbertablesizepos = 0;
- cd->linenumbertablestartpos = 0;
- cd->linenumbertab = 0;
+ cd->linenumbers = list_create_dump(OFFSET(linenumbertable_list_entry_t, linkage));
}
cd->brancheslabel = list_create_dump(OFFSET(branch_label_ref_t, linkage));
cd->listcritical = list_create_dump(OFFSET(critical_section_ref_t, linkage));
-
- cd->linenumberreferences = NULL;
- cd->linenumbertablesizepos = 0;
- cd->linenumbertablestartpos = 0;
- cd->linenumbertab = 0;
+ cd->linenumbers = list_create_dump(OFFSET(linenumbertable_list_entry_t, linkage));
/* We need to clear the mpc and the branch references from all
basic blocks as they will definitely change. */
exceptiontable_create(jd);
+ /* Create the linenumber table. */
+
+ linenumbertable_create(jd);
+
/* jump table resolving */
for (jr = cd->jumpreferences; jr != NULL; jr = jr->next)
*((functionptr *) ((ptrint) epoint + jr->tablepos)) =
(functionptr) ((ptrint) epoint + (ptrint) jr->target->mpc);
- /* line number table resolving */
- {
- linenumberref *lr;
- ptrint lrtlen = 0;
- ptrint target;
-
- for (lr = cd->linenumberreferences; lr != NULL; lr = lr->next) {
- lrtlen++;
- target = lr->targetmpc;
- /* if the entry contains an mcode pointer (normal case), resolve it */
- /* (see doc/inlining_stacktrace.txt for details) */
- if (lr->linenumber >= -2) {
- target += (ptrint) epoint;
- }
- *((functionptr *) ((ptrint) epoint + (ptrint) lr->tablepos)) =
- (functionptr) target;
- }
-
- *((functionptr *) ((ptrint) epoint + cd->linenumbertablestartpos)) =
- (functionptr) ((ptrint) epoint + cd->linenumbertab);
-
- *((ptrint *) ((ptrint) epoint + cd->linenumbertablesizepos)) = lrtlen;
- }
-
/* patcher resolving */
pr = list_first_unsynced(code->patchers);
list_t *brancheslabel;
list_t *listcritical; /* list of critical sections */
-
- linenumberref *linenumberreferences; /* list of line numbers and the */
- /* program counters of their first */
- /* instruction */
- s4 linenumbertablesizepos;
- s4 linenumbertablestartpos;
- s4 linenumbertab;
+ list_t *linenumbers; /* list of line numbers */
methodinfo *method;
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Reinhard Grafl
- Andreas Krall
- Christian Thalinger
- Joseph Wenninger
- Edwin Steiner
-
-
*/
#include "vm/types.h"
#include "mm/memory.h"
+
#include "vm/jit/codegen-common.h"
#include "vm/jit/methodheader.h"
+
#include "vmcore/options.h"
}
-/* dseg_addlinenumbertablesize *************************************************
-
- XXX
-
-*******************************************************************************/
-
-void dseg_addlinenumbertablesize(codegendata *cd)
-{
- cd->linenumbertablesizepos = dseg_add_unique_address(cd, NULL);
- cd->linenumbertablestartpos = dseg_add_unique_address(cd, NULL);
-}
-
-
-/* dseg_addlinenumber **********************************************************
-
- Add a line number reference.
-
- IN:
- cd.............current codegen data
- linenumber.....number of line that starts with the given mcodeptr
- mcodeptr.......start mcodeptr of line
-
-*******************************************************************************/
-
-void dseg_addlinenumber(codegendata *cd, u2 linenumber)
-{
- linenumberref *lr;
-
- lr = DNEW(linenumberref);
-
- lr->linenumber = linenumber;
- lr->tablepos = 0;
- lr->targetmpc = cd->mcodeptr - cd->mcodebase;
- lr->next = cd->linenumberreferences;
-
- cd->linenumberreferences = lr;
-}
-
-
-/* dseg_addlinenumber_inline_start *********************************************
-
- Add a marker to the line number table indicating the start of an inlined
- method body. (see doc/inlining_stacktrace.txt)
-
- IN:
- cd.............current codegen data
- iptr...........the ICMD_INLINE_BODY instruction
- mcodeptr.......start mcodeptr of inlined body
-
-*******************************************************************************/
-
-void dseg_addlinenumber_inline_start(codegendata *cd, instruction *iptr)
-{
- linenumberref *lr;
- insinfo_inline *insinfo;
- ptrint mpc;
-
- lr = DNEW(linenumberref);
-
- lr->linenumber = (-2); /* marks start of inlined method */
- lr->tablepos = 0;
- lr->targetmpc = (mpc = (u1 *) cd->mcodeptr - cd->mcodebase);
- lr->next = cd->linenumberreferences;
-
- cd->linenumberreferences = lr;
-
- insinfo = iptr->sx.s23.s3.inlineinfo;
-
- insinfo->startmpc = mpc; /* store for corresponding INLINE_END */
-}
-
-
-/* dseg_addlinenumber_inline_end ***********************************************
-
- Add a marker to the line number table indicating the end of an inlined
- method body. (see doc/inlining_stacktrace.txt)
-
- IN:
- cd.............current codegen data
- iptr...........the ICMD_INLINE_END instruction
-
- Note:
- iptr->method must point to the inlined callee.
-
-*******************************************************************************/
-
-void dseg_addlinenumber_inline_end(codegendata *cd, instruction *iptr)
-{
- linenumberref *lr;
- linenumberref *prev;
- insinfo_inline *insinfo;
-
- insinfo = iptr->sx.s23.s3.inlineinfo;
-
- assert(insinfo);
-
- lr = DNEW(linenumberref);
-
- /* special entry containing the methodinfo * */
- lr->linenumber = (-3) - iptr->line;
- lr->tablepos = 0;
- lr->targetmpc = (ptrint) insinfo->method;
- lr->next = cd->linenumberreferences;
-
- prev = lr;
- lr = DNEW(linenumberref);
-
- /* end marker with PC of start of body */
- lr->linenumber = (-1);
- lr->tablepos = 0;
- lr->targetmpc = insinfo->startmpc;
- lr->next = prev;
-
- cd->linenumberreferences = lr;
-}
-
-
-/* dseg_createlinenumbertable **************************************************
-
- Creates a line number table in the data segment from the created
- entries in linenumberreferences.
-
-*******************************************************************************/
-
-void dseg_createlinenumbertable(codegendata *cd)
-{
- linenumberref *lr;
-
- for (lr = cd->linenumberreferences; lr != NULL; lr = lr->next) {
- lr->tablepos = dseg_add_unique_address(cd, NULL);
-
- if (cd->linenumbertab == 0)
- cd->linenumbertab = lr->tablepos;
-
-#if SIZEOF_VOID_P == 8
- /* This is for alignment and easier usage. */
- (void) dseg_add_unique_s8(cd, lr->linenumber);
-#else
- (void) dseg_add_unique_s4(cd, lr->linenumber);
-#endif
- }
-}
-
-
-/* dseg_get_linenumber_from_pc_intern ******************************************
-
- This function search the line number table for the line
- corresponding to a given pc. The function recurses for inlined
- methods.
-
-*******************************************************************************/
-
-static s4 dseg_get_linenumber_from_pc_intern(methodinfo **pm, linenumbertable_entry *lntentry, s4 lntsize, u1 *pc)
-{
- linenumbertable_entry *lntinline; /* special entry for inlined method */
-
- for (; lntsize > 0; lntsize--, lntentry--) {
- /* Note: In case of inlining this may actually compare the pc
- against a methodinfo *, yielding a non-sensical
- result. This is no problem, however, as we ignore such
- entries in the switch below. This way we optimize for the
- common case (ie. a real pc in lntentry->pc). */
-
- if (pc >= lntentry->pc) {
- /* did we reach the current line? */
-
- if ((s4) lntentry->line >= 0)
- return (s4) lntentry->line;
-
- /* we found a special inline entry (see
- doc/inlining_stacktrace.txt for details */
-
- switch (lntentry->line) {
- case -1:
- /* begin of inlined method (ie. INLINE_END
- instruction) */
-
- lntinline = --lntentry;/* get entry with methodinfo * */
- lntentry--; /* skip the special entry */
- lntsize -= 2;
-
- /* search inside the inlined method */
-
- if (dseg_get_linenumber_from_pc_intern(pm, lntentry, lntsize,
- pc))
- {
- /* the inlined method contained the pc */
-
- *pm = (methodinfo *) lntinline->pc;
-
- assert(lntinline->line <= -3);
-
- return (-3) - lntinline->line;
- }
-
- /* pc was not in inlined method, continue search.
- Entries inside the inlined method will be skipped
- because their lntentry->pc is higher than pc. */
- break;
-
- case -2:
- /* end of inlined method */
-
- return 0;
-
- /* default: is only reached for an -3-line entry after
- a skipped -2 entry. We can safely ignore it and
- continue searching. */
- }
- }
- }
-
- /* not found, return 0 */
-
- return 0;
-}
-
-
-/* dseg_get_linenumber_from_pc *************************************************
-
- A wrapper for dseg_get_linenumber_from_pc_intern, so we don't have
- to evaluate the method header on every call.
-
-*******************************************************************************/
-
-s4 dseg_get_linenumber_from_pc(methodinfo **pm, u1 *pv, u1 *pc)
-{
- ptrint lntsize; /* size of line number table */
- u1 *lntstart; /* start of line number table */
- linenumbertable_entry *lntentry; /* points to last entry in the table */
- s4 linenumber;
-
-#if defined(__S390__)
- pc = (u1 *)((intptr_t)pc & 0x7FFFFFFF);
-#endif
-
- /* get size of line number table */
-
- lntsize = *((ptrint *) (pv + LineNumberTableSize));
- lntstart = *((u1 **) (pv + LineNumberTableStart));
-
- /* Subtract the size of the line number entry of the structure,
- since the line number table start points to the pc. */
-
- lntentry = (linenumbertable_entry *) (lntstart - SIZEOF_VOID_P);
-
- /* get the line number */
-
- linenumber = dseg_get_linenumber_from_pc_intern(pm, lntentry, lntsize, pc);
-
- return linenumber;
-}
-
-
/* dseg_adddata ****************************************************************
Adds a data segment reference to the codegendata.
/* forward typedefs ***********************************************************/
-typedef struct dsegentry dsegentry;
-typedef struct linenumbertable_entry linenumbertable_entry;
+typedef struct dsegentry dsegentry;
#include "config.h"
};
-/* linenumbertable_entry ******************************************************/
-
-/* Keep the type of line the same as the pointer type, otherwise we
- run into alignment troubles (like on MIPS64). */
-
-struct linenumbertable_entry {
- ptrint line; /* NOTE: see doc/inlining_stacktrace.txt for */
- u1 *pc; /* special meanings of line and pc. */
-};
-
-
/* function prototypes ********************************************************/
void dseg_finish(jitdata *jd);
void dseg_add_unique_target(codegendata *cd, basicblock *target);
void dseg_add_target(codegendata *cd, basicblock *target);
-void dseg_addlinenumbertablesize(codegendata *cd);
-void dseg_addlinenumber(codegendata *cd, u2 linenumber);
-void dseg_addlinenumber_inline_start(codegendata *cd, instruction *iptr);
-void dseg_addlinenumber_inline_end(codegendata *cd, instruction *iptr);
-
-void dseg_createlinenumbertable(codegendata *cd);
-
-s4 dseg_get_linenumber_from_pc(methodinfo **pm, u1 *pv, u1 *pc);
-
#if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(__M68K__) || defined(ENABLE_INTRP)
void dseg_adddata(codegendata *cd);
void dseg_resolve_datareferences(jitdata *jd);
.align 8
- .long 0 /* line number table start */
- .long 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/parse.h"
#include "vm/jit/patcher-common.h"
#include "vm/jit/reg.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- /* adds a reference for the length of the line number counter. We don't
- know the size yet, since we evaluate the information during code
- generation, to save one additional iteration over the whole
- instructions. During code optimization the position could have changed
- to the information gotten from the class file */
- (void) dseg_addlinenumbertablesize(cd);
-
#if defined(ENABLE_PROFILING)
/* generate method profiling code */
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate stubs */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
#if defined(ENABLE_PROFILING)
/* generate native method profiling code */
--- /dev/null
+/* src/vm/jit/linenumbertable.c - linenumber handling stuff
+
+ Copyright (C) 2007
+ CACAOVM - Verein zu Foerderung der freien virtuellen Machine CACAO
+
+ This file is part of CACAO.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+*/
+
+
+#include "config.h"
+
+#include <assert.h>
+#include <stdint.h>
+
+#include "mm/memory.h"
+
+#include "vm/jit/code.h"
+#include "vm/jit/codegen-common.h"
+#include "vm/jit/linenumbertable.h"
+
+
+/* linenumbertable_create ******************************************************
+
+ Creates the linenumber table. We allocate an array and store the
+ linenumber entry in reverse-order, so we can search the correct
+ linenumber more easily.
+
+*******************************************************************************/
+
+void linenumbertable_create(jitdata *jd)
+{
+ codeinfo *code;
+ codegendata *cd;
+ linenumbertable_t *lnt;
+ linenumbertable_entry_t *lnte;
+ list_t *l;
+ linenumbertable_list_entry_t *le;
+ uint8_t *pv;
+ void *pc;
+
+ /* Get required compiler data. */
+
+ code = jd->code;
+ cd = jd->cd;
+
+ /* Don't allocate a linenumber table if we don't need one. */
+
+ l = cd->linenumbers;
+
+ if (l->size == 0)
+ return;
+
+ /* Allocate the linenumber table and the entries array. */
+
+ lnt = NEW(linenumbertable_t);
+ lnte = MNEW(linenumbertable_entry_t, l->size);
+
+ /* Fill the linenumber table. */
+
+ lnt->length = l->size;
+ lnt->entries = lnte;
+
+ /* Fill the linenumber table entries in reverse order, so the
+ search can be forward. */
+
+ pv = code->entrypoint;
+
+ for (le = list_last_unsynced(l); le != NULL;
+ le = list_prev_unsynced(l, le), lnte++) {
+ /* If the entry contains an mcode pointer (normal case),
+ resolve it (see doc/inlining_stacktrace.txt for
+ details). */
+
+ if (le->linenumber >= -2)
+ pc = pv + le->mpc;
+ else
+ pc = (void *) le->mpc;
+
+ /* Fill the linenumber table entry. */
+
+ lnte->linenumber = le->linenumber;
+ lnte->pc = pc;
+ }
+
+ /* Store the linenumber table in the codeinfo. */
+
+ code->linenumbertable = lnt;
+}
+
+
+/* linenumbertable_list_entry_add **********************************************
+
+ Add a line number reference.
+
+ IN:
+ cd.............current codegen data
+ linenumber.....number of line that starts with the given mcodeptr
+
+*******************************************************************************/
+
+void linenumbertable_list_entry_add(codegendata *cd, int32_t linenumber)
+{
+ linenumbertable_list_entry_t *le;
+
+ le = DNEW(linenumbertable_list_entry_t);
+
+ le->linenumber = linenumber;
+ le->mpc = cd->mcodeptr - cd->mcodebase;
+
+ list_add_last_unsynced(cd->linenumbers, le);
+}
+
+
+/* linenumbertable_list_entry_add_inline_start *********************************
+
+ Add a marker to the line number table indicating the start of an
+ inlined method body. (see doc/inlining_stacktrace.txt)
+
+ IN:
+ cd ..... current codegen data
+ iptr ... the ICMD_INLINE_BODY instruction
+
+*******************************************************************************/
+
+void linenumbertable_list_entry_add_inline_start(codegendata *cd, instruction *iptr)
+{
+ linenumbertable_list_entry_t *le;
+ insinfo_inline *insinfo;
+ uintptr_t mpc;
+
+ le = DNEW(linenumbertable_list_entry_t);
+
+ le->linenumber = (-2); /* marks start of inlined method */
+ le->mpc = (mpc = cd->mcodeptr - cd->mcodebase);
+
+ list_add_last_unsynced(cd->linenumbers, le);
+
+ insinfo = iptr->sx.s23.s3.inlineinfo;
+
+ insinfo->startmpc = mpc; /* store for corresponding INLINE_END */
+}
+
+
+/* linenumbertable_list_entry_add_inline_end ***********************************
+
+ Add a marker to the line number table indicating the end of an
+ inlined method body. (see doc/inlining_stacktrace.txt)
+
+ IN:
+ cd ..... current codegen data
+ iptr ... the ICMD_INLINE_END instruction
+
+ Note:
+ iptr->method must point to the inlined callee.
+
+*******************************************************************************/
+
+void linenumbertable_list_entry_add_inline_end(codegendata *cd, instruction *iptr)
+{
+ linenumbertable_list_entry_t *le;
+ insinfo_inline *insinfo;
+
+ insinfo = iptr->sx.s23.s3.inlineinfo;
+
+ assert(insinfo);
+
+ le = DNEW(linenumbertable_list_entry_t);
+
+ /* special entry containing the methodinfo * */
+ le->linenumber = (-3) - iptr->line;
+ le->mpc = (uintptr_t) insinfo->method;
+
+ list_add_last_unsynced(cd->linenumbers, le);
+
+ le = DNEW(linenumbertable_list_entry_t);
+
+ /* end marker with PC of start of body */
+ le->linenumber = (-1);
+ le->mpc = insinfo->startmpc;
+
+ list_add_last_unsynced(cd->linenumbers, le);
+}
+
+
+/* linenumbertable_linenumber_for_pc_intern ************************************
+
+ This function search the line number table for the line
+ corresponding to a given pc. The function recurses for inlined
+ methods.
+
+*******************************************************************************/
+
+static s4 linenumbertable_linenumber_for_pc_intern(methodinfo **pm, linenumbertable_entry_t *lnte, int32_t lntsize, void *pc)
+{
+ linenumbertable_entry_t *lntinline; /* special entry for inlined method */
+
+ for (; lntsize > 0; lntsize--, lnte++) {
+ /* Note: In case of inlining this may actually compare the pc
+ against a methodinfo *, yielding a non-sensical
+ result. This is no problem, however, as we ignore such
+ entries in the switch below. This way we optimize for the
+ common case (ie. a real pc in lntentry->pc). */
+
+ if (pc >= lnte->pc) {
+ /* did we reach the current line? */
+
+ if (lnte->linenumber >= 0)
+ return lnte->linenumber;
+
+ /* we found a special inline entry (see
+ doc/inlining_stacktrace.txt for details */
+
+ switch (lnte->linenumber) {
+ case -1:
+ /* begin of inlined method (ie. INLINE_END
+ instruction) */
+
+ lntinline = --lnte; /* get entry with methodinfo * */
+ lnte--; /* skip the special entry */
+ lntsize -= 2;
+
+ /* search inside the inlined method */
+
+ if (linenumbertable_linenumber_for_pc_intern(pm, lnte, lntsize, pc)) {
+ /* the inlined method contained the pc */
+
+ *pm = (methodinfo *) lntinline->pc;
+
+ assert(lntinline->linenumber <= -3);
+
+ return (-3) - lntinline->linenumber;
+ }
+
+ /* pc was not in inlined method, continue search.
+ Entries inside the inlined method will be skipped
+ because their lntentry->pc is higher than pc. */
+ break;
+
+ case -2:
+ /* end of inlined method */
+
+ return 0;
+
+ /* default: is only reached for an -3-line entry after
+ a skipped -2 entry. We can safely ignore it and
+ continue searching. */
+ }
+ }
+ }
+
+ /* PC not found. */
+
+ return 0;
+}
+
+
+/* linenumbertable_linenumber_for_pc *******************************************
+
+ A wrapper for linenumbertable_linenumber_for_pc_intern.
+
+ NOTE: We have a intern version because the function is called
+ recursively for inlined methods.
+
+*******************************************************************************/
+
+int32_t linenumbertable_linenumber_for_pc(methodinfo **pm, codeinfo *code, void *pc)
+{
+ linenumbertable_t *lnt;
+ int32_t linenumber;
+
+ /* Get line number table. */
+
+ lnt = code->linenumbertable;
+
+ if (lnt == NULL)
+ return 0;
+
+ /* Get the line number. */
+
+ linenumber = linenumbertable_linenumber_for_pc_intern(pm, lnt->entries, lnt->length, pc);
+
+ return linenumber;
+}
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
--- /dev/null
+/* src/vm/jit/linenumbertable.h - linenumber table
+
+ Copyright (C) 2007
+ CACAOVM - Verein zu Foerderung der freien virtuellen Machine CACAO
+
+ This file is part of CACAO.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+*/
+
+
+#ifndef _LINENUMBERTABLE_H
+#define _LINENUMBERTABLE_H
+
+/* forward typedefs ***********************************************************/
+
+typedef struct linenumbertable_t linenumbertable_t;
+typedef struct linenumbertable_entry_t linenumbertable_entry_t;
+typedef struct linenumbertable_list_entry_t linenumbertable_list_entry_t;
+
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include "toolbox/list.h"
+
+#include "vm/jit/jit.h"
+#include "vm/jit/code.h"
+#include "vm/jit/codegen-common.h"
+
+#include "vmcore/method.h"
+
+
+/* linenumbertable_t **********************************************************/
+
+struct linenumbertable_t {
+ int32_t length; /* length of the entries array */
+ linenumbertable_entry_t *entries; /* actual linenumber entries */
+};
+
+
+/* linenumbertable_entry_t *****************************************************
+
+ NOTE: See doc/inlining_stacktrace.txt for special meanings of line
+ and pc.
+
+*******************************************************************************/
+
+struct linenumbertable_entry_t {
+ int32_t linenumber; /* linenumber of this entry */
+ void *pc; /* PC where this linenumber starts */
+};
+
+
+/* linenumbertable_list_entry_t ***********************************************/
+
+struct linenumbertable_list_entry_t {
+ int32_t linenumber; /* line number, used for inserting into the */
+ /* table and for validity checking */
+ /* -1......start of inlined body */
+ /* -2......end of inlined body */
+ /* <= -3...special entry with methodinfo * */
+ /* (see doc/inlining_stacktrace.txt) */
+ ptrint mpc; /* machine code program counter of first */
+ /* instruction for given line */
+ /* NOTE: for linenumber <= -3 this is a the */
+ /* (methodinfo *) of the inlined method */
+ listnode_t linkage;
+};
+
+
+/* function prototypes ********************************************************/
+
+void linenumbertable_create(jitdata *jd);
+
+void linenumbertable_list_entry_add(codegendata *cd, int32_t linenumber);
+void linenumbertable_list_entry_add_inline_start(codegendata *cd, instruction *iptr);
+void linenumbertable_list_entry_add_inline_end(codegendata *cd, instruction *iptr);
+
+int32_t linenumbertable_linenumber_for_pc(methodinfo **pm, codeinfo *code, void *pc);
+
+#endif /* _LINENUMBERTABLE_H */
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
.align 4
- .long 0 /* line number table start */
- .long 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
#include "vm/jit/abi.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/parse.h"
#include "vm/jit/reg.h"
#include "vm/jit/replace.h"
(void) dseg_add_unique_s4(cd, (ADR_SAV_CNT - rd->savadrreguse) << 16 | (INT_SAV_CNT - rd->savintreguse)); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- dseg_addlinenumbertablesize(cd);
-
#if defined(ENABLE_PROFILING)
assert(0);
#endif
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (btpre->flags >= BBREACHED) */
} /* for each basic block */
- dseg_createlinenumbertable(cd);
-
/* generate stubs */
emit_patcher_traps(jd);
4; /* args for codegen_start_native_call */
/* create method header */
- (void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
- (void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
- (void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
- (void) dseg_add_unique_s4(cd, 0); /* IntSave */
- (void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
+ (void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
+ (void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize */
+ (void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
+ (void) dseg_add_unique_s4(cd, 0); /* IntSave */
+ (void) dseg_add_unique_s4(cd, 0); /* FltSave */
/* print call trace */
#if !defined(NDEBUG)
#define IsLeaf -16
#define IntSave -20
#define FltSave -24
-#define LineNumberTableSize -32
-#define LineNumberTableStart -40
#else /* SIZEOF_VOID_P == 8 */
#define IsLeaf -12
#define IntSave -16
#define FltSave -20
-#define LineNumberTableSize -24
-#define LineNumberTableStart -28
#endif /* SIZEOF_VOID_P == 8 */
#if SIZEOF_VOID_P == 8
- .dword 0 /* line number table start */
- .dword 0 /* line number table size */
.word 0 /* fltsave */
.word 0 /* intsave */
.word 0 /* isleaf */
#else /* SIZEOF_VOID_P == 8 */
- .word 0 /* line number table start */
- .word 0 /* line number table size */
.word 0 /* fltsave */
.word 0 /* intsave */
.word 0 /* isleaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/md.h"
#include "vm/jit/patcher-common.h"
#include "vm/jit/reg.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- dseg_addlinenumbertablesize(cd);
-
/* create stack frame (if necessary) */
if (cd->stackframesize)
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate traps */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate stub code */
.align 2
- .long 0 /* line number table start */
- .long 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* IsLeaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/md.h"
#include "vm/jit/methodheader.h"
#include "vm/jit/parse.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- dseg_addlinenumbertablesize(cd);
-
#if defined(ENABLE_PROFILING)
/* generate method profiling code */
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate traps */
emit_patcher_traps(jd);
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate code */
.align 3
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/parse.h"
#include "vm/jit/patcher-common.h"
#include "vm/jit/reg.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- dseg_addlinenumbertablesize(cd);
-
/* create stack frame (if necessary) */
if (!code_is_leafmethod(code)) {
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate traps */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate code */
}
-
-
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where
* *
*******************************************************************************/
- .long 0 /* line number table start */
- .long 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* IsLeaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/methodheader.h"
#include "vm/jit/parse.h"
#include "vm/jit/patcher-common.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
-
/* Offset PV */
M_AADD_IMM(N_PV_OFFSET, REG_PV);
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate stubs */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate code */
.align 8 /* v9: All data types are aligned to their size */
- .xword 0 /* line number table start */
- .xword 0 /* line number table size */
.word 0 /* fltsave */
.word 1 /* intsave */
.word 0 /* isleaf */
/* #include "vm/jit/sparc64/arch.h" */
#include "vm/jit/sparc64/codegen.h"
+#include "vm/jit/sparc64/emit.h"
#include "mm/memory.h"
#include "vm/jit/codegen-common.h"
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
-#include "vm/jit/sparc64/emit.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/parse.h"
#include "vm/jit/patcher.h"
#include "vm/jit/reg.h"
#include "vm/jit/replace.h"
#include "vm/jit/stacktrace.h"
+
#include "vmcore/loader.h"
#include "vmcore/options.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- dseg_addlinenumbertablesize(cd);
-
/* save register window and create stack frame (if necessary) */
if (cd->stackframesize) {
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* generate stubs */
emit_patcher_stubs(jd);
/* create method header */
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
-
/* generate stub code */
- M_SAVE(REG_SP, -cd->stackframesize * 8, REG_SP); /* build up stackframe */
+ M_SAVE(REG_SP, -cd->stackframesize * 8, REG_SP); /* build up stackframe */
#if defined(ENABLE_GC_CACAO)
/* Save callee saved integer registers in stackframeinfo (GC may
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
/* generate stub code */
#include "vm/jit/asmpart.h"
#include "vm/jit/codegen-common.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/methodheader.h"
#include "vmcore/class.h"
/* Search the line number table. */
- linenumber = dseg_get_linenumber_from_pc(&m, pv, xpc);
+ linenumber = linenumbertable_linenumber_for_pc(&m, code, xpc);
/* Add a new entry to the staktrace. */
.align 8
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
#include "vm/jit/dseg.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
+#include "vm/jit/linenumbertable.h"
#include "vm/jit/methodheader.h"
#include "vm/jit/parse.h"
#include "vm/jit/patcher-common.h"
(void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
(void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
-
#if defined(ENABLE_PROFILING)
/* generate method profiling code */
for (iptr = bptr->iinstr; len > 0; len--, iptr++) {
if (iptr->line != currentline) {
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add(cd, iptr->line);
currentline = iptr->line;
}
case ICMD_INLINE_BODY:
REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
- dseg_addlinenumber_inline_start(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_start(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_INLINE_END:
- dseg_addlinenumber_inline_end(cd, iptr);
- dseg_addlinenumber(cd, iptr->line);
+ linenumbertable_list_entry_add_inline_end(cd, iptr);
+ linenumbertable_list_entry_add(cd, iptr->line);
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
} /* if (bptr -> flags >= BBREACHED) */
} /* for basic block */
- dseg_createlinenumbertable(cd);
-
/* Generate patcher traps. */
emit_patcher_traps(jd);
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
(void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
- (void) dseg_add_unique_s4(cd, 0); /* IsSync */
(void) dseg_add_unique_s4(cd, 0); /* IsLeaf */
(void) dseg_add_unique_s4(cd, 0); /* IntSave */
(void) dseg_add_unique_s4(cd, 0); /* FltSave */
- (void) dseg_addlinenumbertablesize(cd);
- (void) dseg_add_unique_s4(cd, 0); /* ExTableSize */
#if defined(ENABLE_PROFILING)
/* generate native method profiling code */