* src/vm/jit/i386/darwin/md-os.c (md_replace_executionstate_read):
[cacao.git] / src / vm / jit / linenumbertable.c
index 7f18bbc6de5794f3e088b283f51d456f276dfe09..2005f878bceae6532eed4db48a8f0d76fd51d990 100644 (file)
@@ -1,7 +1,7 @@
 /* src/vm/jit/linenumbertable.c - linenumber handling stuff
 
    Copyright (C) 2007
-   CACAOVM - Verein zu Foerderung der freien virtuellen Machine CACAO
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/linenumbertable.h"
 
+#if defined(ENABLE_STATISTICS)
+# include "vmcore/options.h"
+# include "vmcore/statistics.h"
+#endif
+
+#if defined(__S390__)
+#  define ADDR_MASK(type, x) ((type)((uintptr_t)(x) & 0x7FFFFFFF))
+#else
+#  define ADDR_MASK(type, x) (x)
+#endif
 
 /* linenumbertable_create ******************************************************
 
@@ -71,6 +81,16 @@ void linenumbertable_create(jitdata *jd)
        lnt  = NEW(linenumbertable_t);
        lnte = MNEW(linenumbertable_entry_t, l->size);
 
+#if defined(ENABLE_STATISTICS)
+       if (opt_stat) {
+               count_linenumbertable++;
+
+               size_linenumbertable +=
+                       sizeof(linenumbertable_t) +
+                       sizeof(linenumbertable_entry_t) * l->size;
+       }
+#endif
+
        /* Fill the linenumber table. */
 
        lnt->length  = l->size;
@@ -79,7 +99,7 @@ void linenumbertable_create(jitdata *jd)
        /* Fill the linenumber table entries in reverse order, so the
           search can be forward. */
 
-       pv = code->entrypoint;
+       pv = ADDR_MASK(uint8_t *, code->entrypoint);
 
        for (le = list_last_unsynced(l); le != NULL;
                 le = list_prev_unsynced(l, le), lnte++) {
@@ -210,6 +230,8 @@ static s4 linenumbertable_linenumber_for_pc_intern(methodinfo **pm, linenumberta
 {
        linenumbertable_entry_t *lntinline;   /* special entry for inlined method */
 
+       pc = ADDR_MASK(void *, pc);
+
        for (; lntsize > 0; lntsize--, lnte++) {
                /* Note: In case of inlining this may actually compare the pc
                   against a methodinfo *, yielding a non-sensical