diff options
| author | Jing Yu <jingyu@google.com> | 2009-11-05 15:11:04 -0800 |
|---|---|---|
| committer | Jing Yu <jingyu@google.com> | 2009-11-05 15:11:04 -0800 |
| commit | df62c1c110e8532b995b23540b7e3695729c0779 (patch) | |
| tree | dbbd4cbdb50ac38011e058a2533ee4c3168b0205 /gcc-4.2.1/libjava/include/execution.h | |
| parent | 8d401cf711539af5a2f78d12447341d774892618 (diff) | |
| download | toolchain_gcc-df62c1c110e8532b995b23540b7e3695729c0779.tar.gz toolchain_gcc-df62c1c110e8532b995b23540b7e3695729c0779.tar.bz2 toolchain_gcc-df62c1c110e8532b995b23540b7e3695729c0779.zip | |
Check in gcc sources for prebuilt toolchains in Eclair.
Diffstat (limited to 'gcc-4.2.1/libjava/include/execution.h')
| -rw-r--r-- | gcc-4.2.1/libjava/include/execution.h | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/gcc-4.2.1/libjava/include/execution.h b/gcc-4.2.1/libjava/include/execution.h new file mode 100644 index 000000000..279e9c1b8 --- /dev/null +++ b/gcc-4.2.1/libjava/include/execution.h @@ -0,0 +1,234 @@ +// execution.h - Execution engines. -*- c++ -*- + +/* Copyright (C) 2004, 2006 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +#ifndef __JAVA_EXECUTION_H__ +#define __JAVA_EXECUTION_H__ + +// This represents one execution engine. Note that we use function +// pointers and not virtual methods to avoid calls to +// __cxa_call_unexpected and the like. +struct _Jv_ExecutionEngine +{ + public: + + void (*unregister) (jclass); + // FIXME: probably should handle this elsewhere, see how + // interpreter does it. + bool (*need_resolve_string_fields) (); + void (*verify) (jclass); + void (*allocate_static_fields) (jclass, int, int); + void (*allocate_field_initializers) (jclass); + void (*create_ncode) (jclass); + _Jv_ResolvedMethod *(*resolve_method) (_Jv_Method *, jclass, + jboolean); + void (*post_miranda_hook) (jclass); +}; + +// This handles gcj-compiled code except that compiled with +// -findirect-classes. +struct _Jv_CompiledEngine : public _Jv_ExecutionEngine +{ + public: + + static void do_unregister (jclass) + { + } + + static bool do_need_resolve_string_fields () + { + return true; + } + + static void do_verify (jclass klass) + { + _Jv_Linker::verify_type_assertions (klass); + } + + static _Jv_ResolvedMethod *do_resolve_method (_Jv_Method *, jclass, + jboolean) + { + return NULL; + } + + static void do_allocate_static_fields (jclass, + int, + int) + { + } + + static void do_allocate_field_initializers (jclass) + { + } + + static void do_create_ncode (jclass) + { + // Not needed. + } + + static void do_post_miranda_hook (jclass) + { + // Not needed. + } + + _Jv_CompiledEngine () + { + unregister = do_unregister; + need_resolve_string_fields = do_need_resolve_string_fields; + verify = do_verify; + allocate_static_fields = do_allocate_static_fields; + allocate_field_initializers = do_allocate_field_initializers; + create_ncode = do_create_ncode; + resolve_method = do_resolve_method; + post_miranda_hook = do_post_miranda_hook; + } + + // These operators make it so we don't have to link in libstdc++. + void *operator new (size_t bytes) + { + return _Jv_Malloc(bytes); + } + + void operator delete (void *mem) + { + _Jv_Free(mem); + } +}; + +class _Jv_IndirectCompiledClass +{ +public: + void **field_initializers; +}; + +// This handles gcj-compiled code compiled with -findirect-classes. +struct _Jv_IndirectCompiledEngine : public _Jv_CompiledEngine +{ + _Jv_IndirectCompiledEngine () : _Jv_CompiledEngine () + { + allocate_static_fields = do_allocate_static_fields; + allocate_field_initializers = do_allocate_field_initializers; + } + + static void do_allocate_field_initializers (jclass klass) + { + _Jv_IndirectCompiledClass *aux + = (_Jv_IndirectCompiledClass*) + _Jv_AllocRawObj (sizeof (_Jv_IndirectCompiledClass)); + klass->aux_info = aux; + + aux->field_initializers = (void **)_Jv_Malloc (klass->field_count + * sizeof (void*)); + + for (int i = 0; i < klass->field_count; i++) + { + _Jv_Field *field = &klass->fields[i]; + if (field->flags & java::lang::reflect::Modifier::STATIC) + { + aux->field_initializers[i] = field->u.addr; + field->u.addr = NULL; + } + } + } + + static void do_allocate_static_fields (jclass klass, + int pointer_size, + int other_size) + { + // Splitting the allocations here lets us scan reference fields + // and avoid scanning non-reference fields. + char *reference_fields = (char *) _Jv_AllocRawObj (pointer_size); + char *non_reference_fields = (char *) _Jv_AllocBytes (other_size); + + _Jv_IndirectCompiledClass *aux + = (_Jv_IndirectCompiledClass*)klass->aux_info; + + for (int i = 0; i < klass->field_count; i++) + { + _Jv_Field *field = &klass->fields[i]; + + if ((field->flags & java::lang::reflect::Modifier::STATIC) == 0) + continue; + + char *base = field->isRef() ? reference_fields : non_reference_fields; + field->u.addr = base + field->u.boffset; + + if (aux->field_initializers[i]) + { + int field_size; + if (! field->isRef ()) + field_size = field->type->size (); + else + field_size = sizeof (jobject); + + memcpy (field->u.addr, aux->field_initializers[i], field_size); + } + } + _Jv_Free (aux->field_initializers); + } +}; + + + +// This handles interpreted code. +class _Jv_InterpreterEngine : public _Jv_ExecutionEngine +{ + public: + + static void do_verify (jclass); + static void do_allocate_static_fields (jclass, int, int); + static void do_create_ncode (jclass); + static _Jv_ResolvedMethod *do_resolve_method (_Jv_Method *, jclass, + jboolean); + + static bool do_need_resolve_string_fields () + { + return false; + } + + static void do_unregister(jclass klass) + { + _Jv_UnregisterClass(klass); + } + + static void do_allocate_field_initializers (jclass) + { + } + + static void do_post_miranda_hook (jclass); + + _Jv_InterpreterEngine () + { + unregister = do_unregister; + need_resolve_string_fields = do_need_resolve_string_fields; + verify = do_verify; + allocate_static_fields = do_allocate_static_fields; + allocate_field_initializers = do_allocate_field_initializers; + create_ncode = do_create_ncode; + resolve_method = do_resolve_method; + post_miranda_hook = do_post_miranda_hook; + } + + // These operators make it so we don't have to link in libstdc++. + void *operator new (size_t bytes) + { + return _Jv_Malloc(bytes); + } + + void operator delete (void *mem) + { + _Jv_Free(mem); + } +}; + + +extern _Jv_InterpreterEngine _Jv_soleInterpreterEngine; +extern _Jv_CompiledEngine _Jv_soleCompiledEngine; +extern _Jv_IndirectCompiledEngine _Jv_soleIndirectCompiledEngine; +#endif // __JAVA_EXECUTION_H__ |
