* src/vm/jit/jit.cpp: Eliminate one instance of useless cache flushing.
[cacao.git] / src / vm / jit / jit.cpp
index 2d5a1da4f11857f3843651b7f71c9f236ed3d401..f560457b08840242381ce2fcddc94418b7d67568 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/jit.cpp - Just-In-Time compiler
 
-   Copyright (C) 1996-2005, 2006, 2007, 2008
+   Copyright (C) 1996-2011
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
 #include "md.h"
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 
-#include "native/native.h"
+#include "native/native.hpp"
 
-#include "toolbox/logging.h"
+#include "toolbox/logging.hpp"
 
-#include "threads/lock-common.h"
+#include "threads/mutex.hpp"
 
-#include "vm/class.h"
+#include "vm/class.hpp"
 #include "vm/global.h"
 #include "vm/globals.hpp"
-#include "vm/initialize.h"
+#include "vm/hook.hpp"
+#include "vm/initialize.hpp"
 #include "vm/loader.hpp"
-#include "vm/method.h"
+#include "vm/method.hpp"
 #include "vm/options.h"
 #include "vm/rt-timing.h"
 #include "vm/statistics.h"
 
 #include "vm/jit/cfg.h"
 
-#include "vm/jit/codegen-common.h"
+#include "vm/jit/codegen-common.hpp"
 #include "vm/jit/disass.h"
 #include "vm/jit/dseg.h"
 #include "vm/jit/jit.hpp"
-#include "vm/jit/parse.h"
+#include "vm/jit/parse.hpp"
 #include "vm/jit/reg.h"
 
-#include "vm/jit/show.h"
+#include "vm/jit/show.hpp"
 #include "vm/jit/stack.h"
 #include "vm/jit/stubs.hpp"
 
-#if defined(ENABLE_OPAGENT)
-#include "vm/jit/oprofile-agent.hpp"
-#endif
-
 #include "vm/jit/allocator/simplereg.h"
 #if defined(ENABLE_LSRA) && !defined(ENABLE_SSA)
 # include "vm/jit/allocator/lsra.h"
@@ -80,7 +77,7 @@
 #endif
 
 #if defined(ENABLE_INLINING)
-# include "vm/jit/inline/inline.h"
+# include "vm/jit/inline/inline.hpp"
 #endif
 
 #include "vm/jit/ir/bytecode.h"
@@ -99,7 +96,7 @@
 # include "vm/jit/python.h"
 #endif
 
-#include "vm/jit/verify/typecheck.h"
+#include "vm/jit/verify/typecheck.hpp"
 
 
 /* debug macros ***************************************************************/
@@ -173,11 +170,6 @@ void jit_init(void)
 #else
        intrp_md_init();
 #endif
-
-#if defined(ENABLE_OPAGENT)
-       if (opt_EnableOpagent)
-               OprofileAgent_initialize();
-#endif
 }
 
 
@@ -189,10 +181,7 @@ void jit_init(void)
 
 void jit_close(void)
 {
-#if defined(ENABLE_OPAGENT)
-       if (opt_EnableOpagent)
-               OprofileAgent_close();
-#endif
+       /* nop */
 }
 
 
@@ -217,13 +206,13 @@ jitdata *jit_jitdata_new(methodinfo *m)
 
        /* allocate jitdata structure and fill it */
 
-       jd = DNEW(jitdata);
+       jd = (jitdata*) DumpMemory::allocate(sizeof(jitdata));
 
        jd->m     = m;
-       jd->cd    = DNEW(codegendata);
-       jd->rd    = DNEW(registerdata);
+       jd->cd    = (codegendata*) DumpMemory::allocate(sizeof(codegendata));
+       jd->rd    = (registerdata*) DumpMemory::allocate(sizeof(registerdata));
 #if defined(ENABLE_LOOP)
-       jd->ld    = DNEW(loopdata);
+       jd->ld    = (loopdata*) DumpMemory::allocate(sizeof(loopdata));
 #endif
 
        /* Allocate codeinfo memory from the heap as we need to keep them. */
@@ -271,7 +260,6 @@ u1 *jit_compile(methodinfo *m)
 {
        u1      *r;
        jitdata *jd;
-       int32_t  dumpmarker;
 
        STATISTICS(count_jit_calls++);
 
@@ -298,12 +286,12 @@ u1 *jit_compile(methodinfo *m)
 
        /* enter a monitor on the method */
 
-       LOCK_MONITOR_ENTER(m);
+       m->mutex->lock();
 
        /* if method has been already compiled return immediately */
 
        if (m->code != NULL) {
-               LOCK_MONITOR_EXIT(m);
+               m->mutex->unlock();
 
                assert(m->code->entrypoint);
                return m->code->entrypoint;
@@ -320,9 +308,8 @@ u1 *jit_compile(methodinfo *m)
                compilingtime_start();
 #endif
 
-       /* mark start of dump memory area */
-
-       DMARKER;
+       // Create new dump memory area.
+       DumpMemoryArea dma;
 
        /* create jitdata structure */
 
@@ -391,23 +378,11 @@ u1 *jit_compile(methodinfo *m)
                /* release codeinfo */
 
                code_codeinfo_free(jd->code);
-
-#if defined(ENABLE_PROFILING)
-               /* Release memory for basic block profiling information. */
-
-               if (JITDATA_HAS_FLAG_INSTRUMENT(jd))
-                       if (jd->code->bbfrequency != NULL)
-                               MFREE(jd->code->bbfrequency, u4, jd->code->basicblockcount);
-#endif
        }
        else {
                DEBUG_JIT_COMPILEVERBOSE("Running: ");
        }
 
-       /* release dump area */
-
-       DRELEASE;
-
 #if defined(ENABLE_STATISTICS)
        /* measure time */
 
@@ -415,14 +390,12 @@ u1 *jit_compile(methodinfo *m)
                compilingtime_stop();
 #endif
 
-#if defined(ENABLE_OPAGENT)
-       if (opt_EnableOpagent)
-               OprofileAgent_newmethod(m);
-#endif
+       // Hook point just after code was generated.
+       Hook::jit_generated(m, m->code);
 
        /* leave the monitor */
 
-       LOCK_MONITOR_EXIT(m);
+       m->mutex->unlock();
 
        /* return pointer to the methods entry point */
 
@@ -441,7 +414,6 @@ u1 *jit_recompile(methodinfo *m)
        u1      *r;
        jitdata *jd;
        u1       optlevel;
-       int32_t  dumpmarker;
 
        /* check for max. optimization level */
 
@@ -465,9 +437,8 @@ u1 *jit_recompile(methodinfo *m)
                compilingtime_start();
 #endif
 
-       /* mark start of dump memory area */
-
-       DMARKER;
+       // Create new dump memory area.
+       DumpMemoryArea dma;
 
        /* create jitdata structure */
 
@@ -521,10 +492,6 @@ u1 *jit_recompile(methodinfo *m)
                code_codeinfo_free(jd->code);
        }
 
-       /* release dump area */
-
-       DRELEASE;
-
 #if defined(ENABLE_STATISTICS)
        /* measure time */
 
@@ -532,10 +499,8 @@ u1 *jit_recompile(methodinfo *m)
                compilingtime_stop();
 #endif
 
-#if defined(ENABLE_OPAGENT)
-       if (opt_EnableOpagent)
-               OprofileAgent_newmethod(m);
-#endif
+       // Hook point just after code was generated.
+       Hook::jit_generated(m, m->code);
 
        DEBUG_JIT_COMPILEVERBOSE("Recompiling done: ");
 
@@ -581,17 +546,15 @@ static u1 *jit_compile_intern(jitdata *jd)
        show_filters_apply(jd->m);
 #endif
 
-       /* Handle native methods and create a native stub. */
-
+       // Handle native methods and create a native stub.
        if (m->flags & ACC_NATIVE) {
-               functionptr f;
-
-               f = native_method_resolve(m);
+               NativeMethods& nm = VM::get_current()->get_nativemethods();
+               void* f = nm.resolve_method(m);
 
                if (f == NULL)
                        return NULL;
 
-               code = NativeStub::generate(m, f);
+               code = NativeStub::generate(m, (functionptr) f);
 
                /* Native methods are never recompiled. */
                
@@ -759,7 +722,7 @@ static u1 *jit_compile_intern(jitdata *jd)
                        /*&& jd->exceptiontablelength == 0*/
                ) {
                        /*printf("=== %s ===\n", jd->m->name->text);*/
-                       jd->ls = DNEW(lsradata);
+                       jd->ls = (lsradata*) DumpMemory::allocate(sizeof(lsradata));
                        jd->ls = NULL;
                        ssa(jd);
                        /*lsra(jd);*/ regalloc(jd);
@@ -788,8 +751,10 @@ static u1 *jit_compile_intern(jitdata *jd)
           _must_ be done after loop optimization and register allocation,
           since they can change the basic block count. */
 
-       if (JITDATA_HAS_FLAG_INSTRUMENT(jd))
+       if (JITDATA_HAS_FLAG_INSTRUMENT(jd)) {
+               code->basicblockcount = jd->basicblockcount;
                code->bbfrequency = MNEW(u4, jd->basicblockcount);
+       }
 #endif
 
        DEBUG_JIT_COMPILEVERBOSE("Generating code: ");
@@ -989,17 +954,18 @@ codeinfo *jit_get_current_code(methodinfo *m)
 
 #if defined(ENABLE_JIT)
 #if !defined(JIT_COMPILER_VIA_SIGNAL)
-u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra)
+extern "C" {
+void* jit_asm_compile(methodinfo *m, void* mptr, void* sp, void* ra)
 {
        stackframeinfo_t  sfi;
-       u1               *entrypoint;
-       u1               *pa;
-       ptrint           *p;
+       void             *entrypoint;
+       void             *pa;
+       uintptr_t        *p;
 
        /* create the stackframeinfo (subtract 1 from RA as it points to the */
        /* instruction after the call)                                       */
 
-       stacktrace_stackframeinfo_add(&sfi, NULL, sp, ra, ra-1);
+       stacktrace_stackframeinfo_add(&sfi, NULL, sp, ra, ((uint8_t*) ra) - 1);
 
        /* actually compile the method */
 
@@ -1020,9 +986,9 @@ u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra)
 
        /* patch the method entry point */
 
-       p = (ptrint *) pa;
+       p = (uintptr_t*) pa;
 
-       *p = (ptrint) entrypoint;
+       *p = (uintptr_t) entrypoint;
 
        /* flush the instruction cache */
 
@@ -1030,6 +996,7 @@ u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra)
 
        return entrypoint;
 }
+}
 #endif
 
 /* jit_compile_handle **********************************************************
@@ -1069,9 +1036,14 @@ void *jit_compile_handle(methodinfo *m, void *pv, void *ra, void *mptr)
 
        *p = (uintptr_t) newpv;
 
+#if !defined(JIT_COMPILER_VIA_SIGNAL)
        /* Flush both caches. */
+       /* This might have been necessary before we had the compiler trap, but now
+        * it's not. I don't care enough about the (broken) non-signal case to
+        * investigate this. */
 
        md_cacheflush(pa, SIZEOF_VOID_P);
+#endif
 
        return newpv;
 }