* src/vm/jit/linenumbertable.c: New file.
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Mon, 22 Oct 2007 13:57:35 +0000 (15:57 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Mon, 22 Oct 2007 13:57:35 +0000 (15:57 +0200)
* 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.

30 files changed:
src/vm/jit/Makefile.am
src/vm/jit/alpha/asmpart.S
src/vm/jit/alpha/codegen.c
src/vm/jit/arm/asmpart.S
src/vm/jit/arm/codegen.c
src/vm/jit/code.h
src/vm/jit/codegen-common.c
src/vm/jit/codegen-common.h
src/vm/jit/dseg.c
src/vm/jit/dseg.h
src/vm/jit/i386/asmpart.S
src/vm/jit/i386/codegen.c
src/vm/jit/linenumbertable.c [new file with mode: 0644]
src/vm/jit/linenumbertable.h [new file with mode: 0644]
src/vm/jit/m68k/asmpart.S
src/vm/jit/m68k/codegen.c
src/vm/jit/methodheader.h
src/vm/jit/mips/asmpart.S
src/vm/jit/mips/codegen.c
src/vm/jit/powerpc/asmpart.S
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc64/asmpart.S
src/vm/jit/powerpc64/codegen.c
src/vm/jit/s390/asmpart.S
src/vm/jit/s390/codegen.c
src/vm/jit/sparc64/asmpart.S
src/vm/jit/sparc64/codegen.c
src/vm/jit/stacktrace.c
src/vm/jit/x86_64/asmpart.S
src/vm/jit/x86_64/codegen.c

index 28c233be43052934dc3d38aec62246f665e00610..4e6da4e88583155cc311b201e700580da244f65a 100644 (file)
@@ -155,6 +155,8 @@ libjit_la_SOURCES = \
        icmdtable.inc \
        jit.c \
        jit.h \
+       linenumbertable.c \
+       linenumbertable.h \
        parse.c \
        parse.h \
        patcher-common.c \
index ddbee57b7eecb9cafdcdb09b620a3ce81deb88cb..41981513db6c6c053b79bbf38cc9063f7e6e7ce0 100644 (file)
@@ -79,8 +79,6 @@
 
        .align  3
 
-       .quad   0                           /* line number table start            */
-       .quad   0                           /* line number table size             */
        .long   0                           /* fltsave                            */
        .long   1                           /* intsave                            */
        .long   0                           /* isleaf                             */
index 893cdce70d0a8c24a7e6622dab6089eeb351e4b7..b39fba8cbc62dfd88fd0a58275439f4ba3d6419f 100644 (file)
@@ -57,6 +57,7 @@
 #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"
@@ -152,8 +153,6 @@ bool codegen_emit(jitdata *jd)
        (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)
@@ -350,7 +349,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -370,14 +369,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -3047,8 +3046,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate traps */
 
        emit_patcher_traps(jd);
@@ -3100,12 +3097,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */
 
index 46ef04431f513b24514eb7d27f8bdd5efc7b94d0..065f2de79dd66746ef5f1ee77a3ac88afaa807c5 100644 (file)
@@ -71,8 +71,6 @@
 
        .align  2
 
-       .word   0                           /* line number table start            */
-       .word   0                           /* line number table size             */
        .word   0                           /* FltSave                            */
        .word   0                           /* IntSave                            */
        .word   0                           /* IsLeaf                             */
index d27d81e61a7cab2a4d375d1e389392ee036ed809..8fd10e98aa255c88e8f1d07b51c58ec10d43878a 100644 (file)
@@ -55,6 +55,7 @@
 #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"
@@ -158,8 +159,6 @@ bool codegen_emit(jitdata *jd)
        (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;
@@ -379,7 +378,7 @@ bool codegen_emit(jitdata *jd)
 
                        /* add line number */
                        if (iptr->line != currentline) {
-                               dseg_addlinenumber(cd, iptr->line);
+                               linenumbertable_list_entry_add(cd, iptr->line);
                                currentline = iptr->line;
                        }
 
@@ -2819,9 +2818,6 @@ bool codegen_emit(jitdata *jd)
 
        } /* for all basic blocks */
 
-       dseg_createlinenumbertable(cd);
-
-
        /* generate traps */
 
        emit_patcher_traps(jd);
@@ -2898,12 +2894,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */
 
index 201702b1e8822e2717a5b744fb4d72e0ad1e33b9..dd0a390858f544a0c6ecefe77fb1d9a1657791b1 100644 (file)
@@ -39,6 +39,7 @@
 #include "vm/global.h"
 
 #include "vm/jit/exceptiontable.h"
+#include "vm/jit/linenumbertable.h"
 #include "vm/jit/replace.h"
 
 #include "vmcore/method.h"
@@ -78,7 +79,8 @@ struct codeinfo {
        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;
index 4cb5fa49adbae51da955c8fab344911190efc03c..f7561c55137b353084d18272bc1e6b9dce8ee69a 100644 (file)
@@ -89,6 +89,7 @@
 #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"
@@ -210,11 +211,7 @@ void codegen_setup(jitdata *jd)
 
        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));
 }
 
 
@@ -256,11 +253,7 @@ static void codegen_reset(jitdata *jd)
 
        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. */
@@ -1004,36 +997,16 @@ void codegen_finish(jitdata *jd)
 
        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);
index c6a37a08cc71817473713af6cf27bb9b4342492d..893ad7f9815ea1cf18d655fb9a89e59c65bc496d 100644 (file)
@@ -134,13 +134,7 @@ struct codegendata {
 
        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;
 
index 449e5ba3ba751485d981c6fad28062209659c7fa..7d80a965f4c7550660bee4e085887a7f5cc075a3 100644 (file)
    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"
 
 
@@ -585,260 +578,6 @@ void dseg_add_target(codegendata *cd, basicblock *target)
 }
 
 
-/* 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.
index d641a2c55cc23464d9bcca5b5ba00aa29be6ff40..68c1564ae3c17a359bab30594b6a274eb9baf61a 100644 (file)
@@ -30,8 +30,7 @@
 
 /* forward typedefs ***********************************************************/
 
-typedef struct dsegentry             dsegentry;
-typedef struct linenumbertable_entry linenumbertable_entry;
+typedef struct dsegentry dsegentry;
 
 
 #include "config.h"
@@ -65,17 +64,6 @@ struct dsegentry {
 };
 
 
-/* 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);
@@ -95,15 +83,6 @@ s4 dseg_add_address(codegendata *cd, void *value);
 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);
index 3ceb233fceec2e67295d67e598789cb187a85763..a2c27e00754fd506a4e0e3f319243380bc538e96 100644 (file)
@@ -110,8 +110,6 @@ asm_md_init:
 
        .align  8
 
-       .long   0                           /* line number table start            */
-       .long   0                           /* line number table size             */
        .long   0                           /* fltsave                            */
        .long   0                           /* intsave                            */
        .long   0                           /* isleaf                             */
index e9c3815b67b61c664e38cd59c2b3783050fbcb1b..1291a13f7dc3691fb912820f2bfd33364281cd15 100644 (file)
@@ -57,6 +57,7 @@
 #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"
@@ -166,13 +167,6 @@ bool codegen_emit(jitdata *jd)
        (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 */
 
@@ -482,7 +476,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -502,14 +496,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -3447,8 +3441,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate stubs */
 
        emit_patcher_traps(jd);
@@ -3504,12 +3496,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */
diff --git a/src/vm/jit/linenumbertable.c b/src/vm/jit/linenumbertable.c
new file mode 100644 (file)
index 0000000..7f18bbc
--- /dev/null
@@ -0,0 +1,314 @@
+/* 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:
+ */
diff --git a/src/vm/jit/linenumbertable.h b/src/vm/jit/linenumbertable.h
new file mode 100644 (file)
index 0000000..62d3015
--- /dev/null
@@ -0,0 +1,112 @@
+/* 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:
+ */
index fa4d52bd554885d4a8e3d6e3e84de348f1f6dcb9..c964ffdbdc08cff53200c800bcfeec8588a94e75 100644 (file)
@@ -63,8 +63,6 @@
 
        .align  4
 
-       .long   0                           /* line number table start            */
-       .long   0                           /* line number table size             */
        .long   0                           /* fltsave                            */
        .long   0                           /* intsave                            */
        .long   0                           /* isleaf                             */
index 02c79329c2baf28a20bef93f16da9ff015a0fb22..6af41617af404b83fe71227651b0751ce36b5a32 100644 (file)
@@ -57,6 +57,7 @@
 #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"
@@ -152,8 +153,6 @@ bool codegen_emit(jitdata *jd)
                (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
@@ -321,7 +320,7 @@ bool codegen_emit(jitdata *jd)
 
        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;
                }
 
@@ -341,14 +340,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -2369,8 +2368,6 @@ nowperformreturn:
        } /* if (btpre->flags >= BBREACHED) */
        } /* for each basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate stubs */
        emit_patcher_traps(jd);
 
@@ -2433,14 +2430,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
                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)
index bb617633398a8c08346bf0a3f1270816fc613aa3..4ea64d73dbec91ce81be1283bbc35e6e33742746 100644 (file)
@@ -40,8 +40,6 @@
 #define IsLeaf                  -16
 #define IntSave                 -20
 #define FltSave                 -24
-#define LineNumberTableSize     -32
-#define LineNumberTableStart    -40
        
 #else /* SIZEOF_VOID_P == 8 */
 
@@ -50,8 +48,6 @@
 #define IsLeaf                  -12
 #define IntSave                 -16
 #define FltSave                 -20
-#define LineNumberTableSize     -24
-#define LineNumberTableStart    -28
 
 #endif /* SIZEOF_VOID_P == 8 */
 
index 43128d32182c58e6722d7e989f1d116c75cf473b..d8dc09cac354fccc6fb1106402308a3a88a59f90 100644 (file)
@@ -83,8 +83,6 @@
 
 #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                             */
@@ -93,8 +91,6 @@
 
 #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                             */
index 99e9e67a58b31e6387917adbd01585385882a9c6..4f36a54869a2e14f778a4aeb92b2b0a0099ead4b 100644 (file)
@@ -54,6 +54,7 @@
 #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"
@@ -161,8 +162,6 @@ bool codegen_emit(jitdata *jd)
        (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)
@@ -393,7 +392,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -414,14 +413,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -3587,8 +3586,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate traps */
 
        emit_patcher_traps(jd);
@@ -3673,12 +3670,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */
 
index 5a99629258799f1e26bac4f5fd24a125a89a7486..6356ef8613644fe2ee4184d26f4bec4526257a2d 100644 (file)
@@ -77,8 +77,6 @@
 
        .align 2
 
-       .long   0                         /* line number table start              */
-       .long   0                         /* line number table size               */
        .long   0                         /* fltsave                              */
        .long   0                         /* intsave                              */
        .long   0                         /* IsLeaf                               */
index 081f8b4fc837022baf33f7fecdc53c0fee7769d5..d164016bea0218f011434c8bf377a4eb217c2964 100644 (file)
@@ -58,6 +58,7 @@
 #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"
@@ -165,8 +166,6 @@ bool codegen_emit(jitdata *jd)
        (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 */
 
@@ -425,7 +424,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -445,14 +444,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -2766,8 +2765,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate traps */
 
        emit_patcher_traps(jd);
@@ -2826,8 +2823,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        (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 */
 
index 0dda5cf7f79e13371e9e8646e9fb01c97d09135c..1fea8c0c131a93fd5b92bf52753fae5eb533621d 100644 (file)
@@ -66,8 +66,6 @@
 
        .align  3
 
-       .quad   0                           /* line number table  start           */
-       .quad   0                           /* line number table  size            */
        .long   0                           /* fltsave                            */
        .long   0                           /* intsave                            */
        .long   0                           /* isleaf                             */
index a8e5e66bebe3a80ce0dd3a58fe9b85e2a156c12a..0bc598658875e1e99ae526f8c87ebb63640e68e7 100644 (file)
@@ -60,6 +60,7 @@
 #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"
@@ -167,8 +168,6 @@ bool codegen_emit(jitdata *jd)
        (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)) {
@@ -371,7 +370,7 @@ bool codegen_emit(jitdata *jd)
                        
                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;
                        }
 
@@ -391,14 +390,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -2558,8 +2557,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate traps */
 
        emit_patcher_traps(jd);
@@ -2612,12 +2609,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */
 
@@ -2802,8 +2796,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 }
 
 
-
-
 /*
  * 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
index dabb45c74148288512e152458a3c58d3b3f2b835..9026e5236199dd0b36d3318e7e555627b64c6534 100644 (file)
@@ -103,8 +103,6 @@ L_bras_##tag:
 *                                                                              *
 *******************************************************************************/
 
-       .long   0                         /* line number table start              */
-       .long   0                         /* line number table size               */
        .long   0                         /* fltsave                              */
        .long   0                         /* intsave                              */
        .long   0                         /* IsLeaf                               */
index 5ff7c051cc81488f45e87c37b16c77446be11fe4..79001bdbf2ecda9cdf437634dcc6129c414f545a 100644 (file)
@@ -57,6 +57,7 @@
 #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"
@@ -221,8 +222,6 @@ bool codegen_emit(jitdata *jd)
        (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);
@@ -502,7 +501,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -522,14 +521,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -3450,8 +3449,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* generate stubs */
 
        emit_patcher_traps(jd);
@@ -3556,12 +3553,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */
 
index 6634d4c27488c24b40097ecee168a878d3235b71..3f5a74b1f25f7a7c747c321ac38560060d9d0dd9 100644 (file)
@@ -72,8 +72,6 @@
 
        .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 */
index 8411ff30aa2006ff51bcb70b9dbb54b55a6868de..42a0ee98f7afe5b9420a8986b5cbd0a892f6caca 100644 (file)
@@ -37,6 +37,7 @@
 
 /* #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"
 
@@ -200,8 +202,6 @@ bool codegen_emit(jitdata *jd)
        (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) {
@@ -446,7 +446,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -3025,8 +3025,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
        
-       dseg_createlinenumbertable(cd);
-
        /* generate stubs */
 
        emit_patcher_stubs(jd);
@@ -3102,16 +3100,12 @@ void codegen_emit_stub_builtin(jitdata *jd, builtintable_entry *bte)
        /* 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
@@ -3283,12 +3277,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        (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 */
 
index 3df7342283dd98e63829a00a47915547448402af..b8847deb3ad31d9638d5ffd242b252900d2a8437 100644 (file)
@@ -65,6 +65,7 @@
 
 #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"
@@ -333,7 +334,7 @@ static inline stacktracebuffer *stacktrace_method_add(stacktracebuffer *stb, sta
 
        /* 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. */
 
index 3a56808b3472934eb4281b08f733c96023ca797d..c83eb000bc98129ab89b2b191cbc9a995708fb16 100644 (file)
@@ -78,8 +78,6 @@
 
        .align  8
 
-       .quad   0                           /* line number table  start           */
-       .quad   0                           /* line number table  size            */
        .long   0                           /* fltsave                            */
        .long   0                           /* intsave                            */
        .long   0                           /* isleaf                             */
index 8ae9e5c4d84b74155841e242946bb1f1a2e064e7..e53ccd6c41fd83ceec365f4bfa8ca518a635dcf3 100644 (file)
@@ -60,6 +60,7 @@
 #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"
@@ -161,8 +162,6 @@ bool codegen_emit(jitdata *jd)
        (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 */
 
@@ -384,7 +383,7 @@ bool codegen_emit(jitdata *jd)
 
                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;
                        }
 
@@ -404,14 +403,14 @@ bool codegen_emit(jitdata *jd)
                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           */
@@ -2848,8 +2847,6 @@ gen_method:
        } /* if (bptr -> flags >= BBREACHED) */
        } /* for basic block */
 
-       dseg_createlinenumbertable(cd);
-
        /* Generate patcher traps. */
 
        emit_patcher_traps(jd);
@@ -2905,12 +2902,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        (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 */