configure.ac: Added AC_CHECK_ENABLE_OPAGENT.
[cacao.git] / src / vm / jit / jit.c
index 71c1fb6b26fe48bf652815889d0e6a136b03ba80..295cebda93b41283476ea3970e5f34bd9a76f803 100644 (file)
@@ -1,7 +1,7 @@
 /* src/vm/jit/jit.c - calls the code generation functions
 
    Copyright (C) 1996-2005, 2006, 2007, 2008
-   CACAOVM - Verein zu Foerderung der freien virtuellen Machine CACAO
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -39,7 +39,6 @@
 #include "toolbox/logging.h"
 
 #include "threads/lock-common.h"
-#include "threads/threads-common.h"
 
 #include "vm/global.h"
 #include "vm/initialize.h"
 #include "vm/jit/show.h"
 #include "vm/jit/stack.h"
 
+#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"
@@ -91,6 +94,7 @@
 #include "vm/jit/verify/typecheck.h"
 
 #include "vmcore/class.h"
+#include "vmcore/globals.hpp"
 #include "vmcore/loader.h"
 #include "vmcore/method.h"
 #include "vmcore/options.h"
@@ -176,6 +180,8 @@ icmdtable_entry_t icmd_table[256] = {
 
 void jit_init(void)
 {
+       TRACESUBSYSTEMINITIALIZATION("jit_init");
+
 #if defined(ENABLE_JIT)
        /* initialize stack analysis subsystem */
 
@@ -208,6 +214,11 @@ void jit_init(void)
 #else
        intrp_md_init();
 #endif
+
+#if defined(ENABLE_OPAGENT)
+       if (opt_EnableOpagent)
+               OprofileAgent_initialize();
+#endif
 }
 
 
@@ -219,7 +230,10 @@ void jit_init(void)
 
 void jit_close(void)
 {
-       /* do nothing */
+#if defined(ENABLE_OPAGENT)
+       if (opt_EnableOpagent)
+               OprofileAgent_close();
+#endif
 }
 
 
@@ -308,13 +322,13 @@ u1 *jit_compile(methodinfo *m)
           otherwise we could run into a deadlock with <clinit>'s that
           call static methods of it's own class. */
 
-       if ((m->flags & ACC_STATIC) && !(m->class->state & CLASS_INITIALIZED)) {
+       if ((m->flags & ACC_STATIC) && !(m->clazz->state & CLASS_INITIALIZED)) {
 #if !defined(NDEBUG)
                if (initverbose)
-                       log_message_class("Initialize class ", m->class);
+                       log_message_class("Initialize class ", m->clazz);
 #endif
 
-               if (!initialize_class(m->class))
+               if (!initialize_class(m->clazz))
                        return NULL;
 
                /* check if the method has been compiled during initialization */
@@ -375,7 +389,7 @@ u1 *jit_compile(methodinfo *m)
 #endif
 
 #if defined(ENABLE_INLINING) && defined(ENABLE_INLINING_DEBUG)
-       if (opt_inlining && opt_inline_debug_all)
+       if (opt_Inline && opt_InlineAll)
                jd->flags |= JITDATA_FLAG_INLINE;
 #endif
 
@@ -389,8 +403,9 @@ u1 *jit_compile(methodinfo *m)
                jd->flags |= JITDATA_FLAG_VERBOSECALL;
 
 #if defined(ENABLE_REPLACEMENT) && defined(ENABLE_INLINING)
-       if (opt_inlining)
+       if (opt_Inline && (jd->m->hitcountdown > 0) && (jd->code->optlevel == 0)) {
                jd->flags |= JITDATA_FLAG_COUNTDOWN;
+       }
 #endif
 
 #if defined(ENABLE_JIT)
@@ -441,6 +456,11 @@ u1 *jit_compile(methodinfo *m)
                compilingtime_stop();
 #endif
 
+#if defined(ENABLE_OPAGENT)
+       if (opt_EnableOpagent)
+               OprofileAgent_newmethod(m);
+#endif
+
        /* leave the monitor */
 
        LOCK_MONITOR_EXIT(m);
@@ -513,7 +533,7 @@ u1 *jit_recompile(methodinfo *m)
                jd->flags |= JITDATA_FLAG_VERBOSECALL;
 
 #if defined(ENABLE_INLINING)
-       if (opt_inlining)
+       if (opt_Inline)
                jd->flags |= JITDATA_FLAG_INLINE;
 #endif
 
@@ -553,6 +573,11 @@ u1 *jit_recompile(methodinfo *m)
                compilingtime_stop();
 #endif
 
+#if defined(ENABLE_OPAGENT)
+       if (opt_EnableOpagent)
+               OprofileAgent_newmethod(m);
+#endif
+
        DEBUG_JIT_COMPILEVERBOSE("Recompiling done: ");
 
        /* return pointer to the methods entry point */
@@ -560,6 +585,9 @@ u1 *jit_recompile(methodinfo *m)
        return r;
 }
 
+#if defined(ENABLE_PM_HACKS)
+#include "vm/jit/jit_pm_1.inc"
+#endif
 
 /* jit_compile_intern **********************************************************
 
@@ -636,14 +664,14 @@ static u1 *jit_compile_intern(jitdata *jd)
 
        RT_TIMING_GET_TIME(time_checks);
 
-#if defined(WITH_CLASSPATH_SUN)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
        /* Code for Sun's OpenJDK (see
           hotspot/src/share/vm/classfile/verifier.cpp
           (Verifier::is_eligible_for_verification)): Don't verify
           dynamically-generated bytecodes. */
 
 # if defined(ENABLE_VERIFIER)
-       if (class_issubclass(m->class, class_sun_reflect_MagicAccessorImpl))
+       if (class_issubclass(m->clazz, class_sun_reflect_MagicAccessorImpl))
                jd->flags &= ~JITDATA_FLAG_VERIFY;
 # endif
 #endif
@@ -680,12 +708,6 @@ static u1 *jit_compile_intern(jitdata *jd)
 
                DEBUG_JIT_COMPILEVERBOSE("Analysing done: ");
 
-               /* Build the CFG.  This has to be done after stack_analyse, as
-                  there happens the JSR elimination. */
-
-               if (!cfg_build(jd))
-                       return NULL;
-
 #ifdef ENABLE_VERIFIER
                if (JITDATA_HAS_FLAG_VERIFY(jd)) {
                        DEBUG_JIT_COMPILEVERBOSE("Typechecking: ");
@@ -723,19 +745,25 @@ static u1 *jit_compile_intern(jitdata *jd)
 
                /* inlining */
 
-#if defined(ENABLE_INLINING)
+#if defined(ENABLE_INLINING) && (!defined(ENABLE_ESCAPE) || 1)
                if (JITDATA_HAS_FLAG_INLINE(jd)) {
                        if (!inline_inline(jd))
                                return NULL;
                }
 #endif
 
-#if defined(ENABLE_PYTHON)
-               if (!pythonpass_run(jd, "langauer_tarjan", "main")) {
-                       /*return NULL;*/
+#if defined(ENABLE_SSA)
+               if (opt_lsra) {
+                       fix_exception_handlers(jd);
                }
 #endif
 
+               /* Build the CFG.  This has to be done after stack_analyse, as
+                  there happens the JSR elimination. */
+
+               if (!cfg_build(jd))
+                       return NULL;
+
 #if defined(ENABLE_PROFILING)
                /* Basic block reordering.  I think this should be done after
                   if-conversion, as we could lose the ability to do the
@@ -748,6 +776,9 @@ static u1 *jit_compile_intern(jitdata *jd)
                }
 #endif
 
+#if defined(ENABLE_PM_HACKS)
+#include "vm/jit/jit_pm_2.inc"
+#endif
                DEBUG_JIT_COMPILEVERBOSE("Allocating registers: ");
 
 #if defined(ENABLE_LSRA) && !defined(ENABLE_SSA)
@@ -762,11 +793,18 @@ static u1 *jit_compile_intern(jitdata *jd)
 # endif /* defined(ENABLE_LSRA) && !defined(ENABLE_SSA) */
 #if defined(ENABLE_SSA)
                /* allocate registers */
-               if ((opt_lsra) && (jd->exceptiontablelength == 0)) {
+               if (
+                       (opt_lsra &&
+                       jd->code->optlevel > 0) 
+                       /* strncmp(jd->m->name->text, "hottie", 6) == 0*/
+                       /*&& jd->exceptiontablelength == 0*/
+               ) {
+                       /*printf("=== %s ===\n", jd->m->name->text);*/
                        jd->ls = DNEW(lsradata);
+                       jd->ls = NULL;
                        ssa(jd);
-                       lsra(jd);
-
+                       /*lsra(jd);*/ regalloc(jd);
+                       /*eliminate_subbasicblocks(jd);*/
                        STATISTICS(count_methods_allocated_by_lsra++);
 
                } else
@@ -1177,6 +1215,15 @@ void jit_check_basicblock_numbers(jitdata *jd)
 }
 #endif /* !defined(NDEBUG) */
 
+methoddesc *instruction_call_site(const instruction *iptr) {
+       if (iptr->opc == ICMD_BUILTIN) {
+               return iptr->sx.s23.s3.bte->md;
+       } else if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
+               return iptr->sx.s23.s3.um->methodref->parseddesc.md;
+       } else {
+               return iptr->sx.s23.s3.fmiref->p.method->parseddesc;
+       }
+}
 
 /*
  * These are local overrides for various environment variables in Emacs.