* Removed all Id tags.
[cacao.git] / src / vm / jit / patcher.h
index f3301a0e9738104d94d36e4d0a6ad39f500e3b5b..2d7f68ea390448667f91a1fd8609695e2a32a0c5 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/patcher.h - code patching functions
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-
-   Changes:
-
-   $Id: patcher.h 4357 2006-01-22 23:33:38Z twisti $
-
 */
 
 
 #define _PATCHER_H
 
 #include "config.h"
+
+#include <assert.h>
+
 #include "vm/types.h"
 
+#include "threads/lock-common.h"
+
 #include "vm/global.h"
 
 
+#if defined(__ALPHA__) || defined(__ARM__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__S390__)
+# error "you should no longer include this file"
+#else
+
+
 /* patcher macros *************************************************************/
 
-#if defined(USE_THREADS)
+#define PATCHER_FLAG_PATCHED    (vftbl_t *) 0xdeadbeef
+
+
+#if defined(ENABLE_THREADS)
 
 #define PATCHER_MONITORENTER \
        /* enter a monitor on the patching position */       \
                                                             \
-       builtin_monitorenter(o);                             \
+       lock_monitor_enter(o);                               \
                                                             \
        /* check if the position has already been patched */ \
                                                             \
-       if (o->vftbl) {                                      \
-               builtin_monitorexit(o);                          \
+       if (o->vftbl != NULL) {                              \
+        assert(o->vftbl == PATCHER_FLAG_PATCHED);        \
+                                                         \
+               lock_monitor_exit(o);                            \
                                                             \
-               return true;                                     \
+               return NULL;                                     \
        }                                                    \
 
 
 #define PATCHER_MONITOREXIT \
        /* leave the monitor on the patching position */     \
                                                             \
-       builtin_monitorexit(o);
+       lock_monitor_exit(o);
 
 
 #define PATCHER_MARK_PATCHED_MONITOREXIT \
        /* mark position as patched */                       \
                                                             \
-       o->vftbl = (vftbl_t *) 1;                            \
+       o->vftbl = PATCHER_FLAG_PATCHED;                     \
                                                             \
        PATCHER_MONITOREXIT
 
 #define PATCHER_MONITOREXIT                  /* nop */
 #define PATCHER_MARK_PATCHED_MONITOREXIT     /* nop */
 
-#endif /* defined(USE_THREADS) */
+#endif /* defined(ENABLE_THREADS) */
 
 
 /* function prototypes ********************************************************/
 
+java_object_t *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra);
+#define PATCHER_wrapper (functionptr) patcher_wrapper
+
+bool patcher_resolve_class(u1 *sp);
+#define PATCHER_resolve_class (functionptr) patcher_resolve_class
+
+bool patcher_initialize_class(u1 *sp);
+#define PATCHER_initialize_class (functionptr) patcher_initialize_class
+
+bool patcher_resolve_classref_to_classinfo(u1 *sp);
+#define PATCHER_resolve_classref_to_classinfo (functionptr) patcher_resolve_classref_to_classinfo
+
+bool patcher_resolve_classref_to_vftbl(u1 *sp);
+#define PATCHER_resolve_classref_to_vftbl (functionptr) patcher_resolve_classref_to_vftbl
+
+bool patcher_resolve_classref_to_flags(u1 *sp);
+#define PATCHER_resolve_classref_to_flags (functionptr) patcher_resolve_classref_to_flags
+
+#if !defined(WITH_STATIC_CLASSPATH)
+bool patcher_resolve_native_function(u1 *sp);
+#define PATCHER_resolve_native_function (functionptr) patcher_resolve_native_function
+#endif
+
+
 bool patcher_get_putstatic(u1 *sp);
 #define PATCHER_get_putstatic (functionptr) patcher_get_putstatic
 
@@ -139,7 +170,13 @@ bool patcher_checkcast_instanceof_flags(u1 *sp);
 bool patcher_checkcast_instanceof_interface(u1 *sp);
 #define PATCHER_checkcast_instanceof_interface (functionptr) patcher_checkcast_instanceof_interface
 
-#if defined(__I386__) || defined(__X86_64__) || defined(__POWERPC__)
+bool patcher_checkcast_interface(u1 *sp);
+#define PATCHER_checkcast_interface (functionptr) patcher_checkcast_interface
+
+bool patcher_instanceof_interface(u1 *sp);
+#define PATCHER_instanceof_interface (functionptr) patcher_instanceof_interface
+
+#if defined(__I386__) || defined(__X86_64__) || defined(__POWERPC__) || defined(__POWERPC64__)
 
 bool patcher_checkcast_class(u1 *sp);
 #define PATCHER_checkcast_class (functionptr) patcher_checkcast_class
@@ -147,12 +184,12 @@ bool patcher_checkcast_class(u1 *sp);
 bool patcher_instanceof_class(u1 *sp);
 #define PATCHER_instanceof_class (functionptr) patcher_instanceof_class
 
-#else /* defined(__I386__) || defined(__X86_64__) || defined(__POWERPC__) */
+#else /* defined(__I386__) || defined(__X86_64__) || defined(__POWERPC__) || defined(__POWERPC64__)*/
 
 bool patcher_checkcast_instanceof_class(u1 *sp);
 #define PATCHER_checkcast_instanceof_class (functionptr) patcher_checkcast_instanceof_class
 
-#endif /* defined(__I386__) || defined(__X86_64__) || defined(__POWERPC__) */
+#endif /* defined(__I386__) || defined(__X86_64__) || defined(__POWERPC__) || defined(__POWERPC64__)*/
 
 bool patcher_clinit(u1 *sp);
 #define PATCHER_clinit (functionptr) patcher_clinit
@@ -160,16 +197,17 @@ bool patcher_clinit(u1 *sp);
 bool patcher_athrow_areturn(u1 *sp);
 #define PATCHER_athrow_areturn (functionptr) patcher_athrow_areturn
 
-#if !defined(ENABLE_STATICVM)
+#if !defined(WITH_STATIC_CLASSPATH)
 bool patcher_resolve_native(u1 *sp);
 #define PATCHER_resolve_native (functionptr) patcher_resolve_native
-#endif /* !defined(ENABLE_STATICVM) */
+#endif
 
 
 /* stuff for the interpreter **************************************************/
 
 #if defined(ENABLE_INTRP)
 bool intrp_patcher_get_putstatic(u1 *sp);
+bool intrp_patcher_get_putstatic_clinit(u1 *sp);
 bool intrp_patcher_get_putfield(u1 *sp);
 bool intrp_patcher_aconst(u1 *sp);
 bool intrp_patcher_builtin_multianewarray(u1 *sp);
@@ -181,6 +219,8 @@ bool intrp_patcher_checkcast_instanceof(u1 *sp);
 bool intrp_patcher_resolve_native(u1 *sp);
 #endif /* defined(ENABLE_INTRP) */
 
+#endif /* architecture list */
+
 #endif /* _PATCHER_H */