621ae65dcd
2006-04-21 Andrew Haley <aph@redhat.com> * lang.c (java_init): Handle flag_indirect_classes. * jvgenmain.c: Use "class$$" instead of "class$". * mangle.c (java_mangle_decl): Accept RECORD_TYPEs sw well as DECLs. (mangle_class_field): Special case "class$$" as well as "class$". * constants.c (build_ref_from_constant_pool): If flag_indirect_classes, generate a ref into the heap. * decl.c (constants_field_decl_node, constants_data_field_decl_node): New. * class.c (build_static_class_ref): New. (build_classdollar_field): Factor out from build_class_ref(). (make_field_value): Handle static fields in heap. (make_class_data): Make sure we get a static ref to class. Make class initializer const if flag_indirect_classes. (register_class): Build a class_ref for initialization if flag_indirect_classes. (emit_indirect_register_classes): New. 2006-04-21 Andrew Haley <aph@redhat.com> * include/execution.h (struct _Jv_CompiledEngine): Define for compiled classes. * java/lang/natClassLoader.cc (_Jv_RegisterClasses): Call _Jv_RegisterLibForGc. (_Jv_RegisterClasses_Counted): Likewise. (_Jv_NewClassFromInitializer): New. (_Jv_RegisterNewClasses): New. * sources.am: Regenerate. * boehm.cc (_Jv_GC_has_static_roots): new. (_Jv_InitGC): Call GC_register_has_static_roots_callback. (filename_node, find_file, _Jv_print_gc_store, new_node, _Jv_GC_has_static_roots, _Jv_RegisterLibForGc): New. * scripts/makemake.tcl: Add -fno-indirect-classes. * Makefile.in: Regenerate. * link.cc (resolve_pool_entry): Allocate constant pool. Allocate fields. From-SVN: r113224
87 lines
2.1 KiB
C++
87 lines
2.1 KiB
C++
// -*- c++ -*-
|
|
// boehm-gc.h - Defines for Boehm collector.
|
|
|
|
/* Copyright (C) 1998, 1999, 2002, 2004 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 __JV_BOEHM_GC__
|
|
#define __JV_BOEHM_GC__
|
|
|
|
#define JV_MARKOBJ_DECL void *::_Jv_MarkObj (void *, void *, void *, void *)
|
|
#define JV_MARKARRAY_DECL void *::_Jv_MarkArray (void *, void *, void *, void *)
|
|
|
|
extern "C"
|
|
{
|
|
void *_Jv_MarkObj (void *, void *, void *, void *);
|
|
void *_Jv_MarkArray (void *, void *, void *, void *);
|
|
void _Jv_RegisterLibForGc (const void *);
|
|
}
|
|
|
|
// Enough stuff to inline _Jv_AllocObj. Ugly.
|
|
#include <gcj/javaprims.h>
|
|
#include <java/lang/Class.h>
|
|
#include <string.h>
|
|
|
|
#include <gc_ext_config.h> // for THREAD_LOCAL_ALLOC
|
|
|
|
extern "C" void * GC_gcj_malloc(size_t, void *);
|
|
extern "C" void * GC_malloc_atomic(size_t);
|
|
#ifdef THREAD_LOCAL_ALLOC
|
|
extern "C" void * GC_local_gcj_malloc(size_t, void *);
|
|
extern "C" void * GC_local_malloc_atomic(size_t);
|
|
#endif
|
|
|
|
#ifndef LIBGCJ_GC_DEBUG
|
|
|
|
inline void *
|
|
_Jv_AllocObj (jsize size, jclass klass)
|
|
{
|
|
// This should call GC_GCJ_MALLOC, but that would involve
|
|
// including gc.h.
|
|
#ifdef THREAD_LOCAL_ALLOC
|
|
return GC_local_gcj_malloc (size, klass->vtable);
|
|
#else
|
|
return GC_gcj_malloc (size, klass->vtable);
|
|
#endif
|
|
}
|
|
|
|
inline void *
|
|
_Jv_AllocPtrFreeObj (jsize size, jclass klass)
|
|
{
|
|
#ifdef JV_HASH_SYNCHRONIZATION
|
|
# ifdef THREAD_LOCAL_ALLOC
|
|
void * obj = GC_local_malloc_atomic(size);
|
|
# else
|
|
void * obj = GC_malloc_atomic(size);
|
|
# endif
|
|
*((_Jv_VTable **) obj) = klass->vtable;
|
|
#else
|
|
# ifdef THREAD_LOCAL_ALLOC
|
|
void * obj = GC_local_gcj_malloc(size, klass->vtable);
|
|
# else
|
|
void * obj = GC_gcj_malloc(size, klass->vtable);
|
|
# endif
|
|
#endif
|
|
return obj;
|
|
}
|
|
|
|
#else /* LIBGCJ_GC_DEBUG */
|
|
|
|
void *
|
|
_Jv_AllocObj (jsize size, jclass klass);
|
|
|
|
void *
|
|
_Jv_AllocPtrFreeObj (jsize size, jclass klass);
|
|
|
|
#endif /* LIBGCJ_GC_DEBUG */
|
|
|
|
// _Jv_AllocBytes (jsize size) should go here, too. But clients don't
|
|
// usually include this header.
|
|
|
|
#endif /* __JV_BOEHM_GC__ */
|