X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fjit.cpp;h=f560457b08840242381ce2fcddc94418b7d67568;hb=029131e1a80f63317b3e122771c104a51baa95d8;hp=8d476a068087899029af1e42cfc28719e15b393f;hpb=ac822cd13dc1a39b128ec99771972139fabbb3a1;p=cacao.git diff --git a/src/vm/jit/jit.cpp b/src/vm/jit/jit.cpp index 8d476a068..f560457b0 100644 --- a/src/vm/jit/jit.cpp +++ b/src/vm/jit/jit.cpp @@ -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. @@ -32,20 +32,21 @@ #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/loader.h" -#include "vm/method.h" +#include "vm/hook.hpp" +#include "vm/initialize.hpp" +#include "vm/loader.hpp" +#include "vm/method.hpp" #include "vm/options.h" #include "vm/rt-timing.h" #include "vm/statistics.h" @@ -54,21 +55,17 @@ #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; }