Makefile.in (JAVA_OBJS): Added boehm.o.
* Makefile.in (JAVA_OBJS): Added boehm.o. (boehm.o): New target. * Make-lang.in (JAVA_SRCS): Added boehm.c. * java-tree.h (flag_use_boehm_gc): Declare. (get_boehm_type_descriptor): Declare. * lang.c (lang_f_options): Added `use-boehm-gc'. (flag_use_boehm_gc): New global. * lang-options.h: Added -fuse-boehm-gc. * boehm.c: New file. * class.c (get_dispatch_table): If class uses a Boehm type descriptor, put it in the vtable. (make_class_data): Removed dead code. From-SVN: r32331
This commit is contained in:
parent
0f9c645ea5
commit
5830574a16
@ -1,3 +1,18 @@
|
|||||||
|
2000-02-17 Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (JAVA_OBJS): Added boehm.o.
|
||||||
|
(boehm.o): New target.
|
||||||
|
* Make-lang.in (JAVA_SRCS): Added boehm.c.
|
||||||
|
* java-tree.h (flag_use_boehm_gc): Declare.
|
||||||
|
(get_boehm_type_descriptor): Declare.
|
||||||
|
* lang.c (lang_f_options): Added `use-boehm-gc'.
|
||||||
|
(flag_use_boehm_gc): New global.
|
||||||
|
* lang-options.h: Added -fuse-boehm-gc.
|
||||||
|
* boehm.c: New file.
|
||||||
|
* class.c (get_dispatch_table): If class uses a Boehm type
|
||||||
|
descriptor, put it in the vtable.
|
||||||
|
(make_class_data): Removed dead code.
|
||||||
|
|
||||||
2000-03-03 Per Bothner <per@bothner.com>
|
2000-03-03 Per Bothner <per@bothner.com>
|
||||||
|
|
||||||
* decl.c (init_decl_processing): Initialize sizetype properly.
|
* decl.c (init_decl_processing): Initialize sizetype properly.
|
||||||
|
@ -166,7 +166,7 @@ INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config -I$(srcdir)
|
|||||||
#
|
#
|
||||||
JAVA_OBJS = parse.o class.o decl.o expr.o constants.o lang.o typeck.o \
|
JAVA_OBJS = parse.o class.o decl.o expr.o constants.o lang.o typeck.o \
|
||||||
except.o verify.o zextract.o jcf-io.o jcf-parse.o mangle.o jcf-write.o \
|
except.o verify.o zextract.o jcf-io.o jcf-parse.o mangle.o jcf-write.o \
|
||||||
buffer.o check-init.o jcf-depend.o jcf-path.o xref.o
|
buffer.o check-init.o jcf-depend.o jcf-path.o xref.o boehm.o
|
||||||
|
|
||||||
JAVA_OBJS_LITE = parse-scan.o jv-scan.o
|
JAVA_OBJS_LITE = parse-scan.o jv-scan.o
|
||||||
|
|
||||||
@ -268,6 +268,8 @@ jcf-dump.o : $(CONFIG_H) $(srcdir)/../system.h $(JAVA_TREE_H) jcf-dump.c \
|
|||||||
jcf-reader.c jcf.h javaop.h javaop.def $(srcdir)/../version.h
|
jcf-reader.c jcf.h javaop.h javaop.def $(srcdir)/../version.h
|
||||||
gjavah.o : $(CONFIG_H) $(srcdir)/../system.h $(JAVA_TREE_H) gjavah.c \
|
gjavah.o : $(CONFIG_H) $(srcdir)/../system.h $(JAVA_TREE_H) gjavah.c \
|
||||||
jcf-reader.c jcf.h javaop.h $(srcdir)/../version.h
|
jcf-reader.c jcf.h javaop.h $(srcdir)/../version.h
|
||||||
|
boehm.o: boehm.c $(CONFIG_H) $(srcdir)/../system.h $(TREE_H) $(JAVA_TREE_H) \
|
||||||
|
$(PARSE_H)
|
||||||
buffer.o : buffer.c $(CONFIG_H) buffer.h $(srcdir)/../gansidecl.h \
|
buffer.o : buffer.c $(CONFIG_H) buffer.h $(srcdir)/../gansidecl.h \
|
||||||
$(srcdir)/../system.h $(srcdir)/../toplev.h
|
$(srcdir)/../system.h $(srcdir)/../toplev.h
|
||||||
check-init.o : check-init.c $(CONFIG_H) $(srcdir)/../gansidecl.h \
|
check-init.o : check-init.c $(CONFIG_H) $(srcdir)/../gansidecl.h \
|
||||||
|
152
gcc/java/boehm.c
Normal file
152
gcc/java/boehm.c
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/* Functions related to the Boehm garbage collector.
|
||||||
|
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Java and all Java-based marks are trademarks or registered trademarks
|
||||||
|
of Sun Microsystems, Inc. in the United States and other countries.
|
||||||
|
The Free Software Foundation is independent of Sun Microsystems, Inc. */
|
||||||
|
|
||||||
|
/* Written by Tom Tromey <tromey@cygnus.com>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
#include "tree.h"
|
||||||
|
#include "java-tree.h"
|
||||||
|
#include "parse.h"
|
||||||
|
|
||||||
|
/* Compute a procedure-based object descriptor. We know that our
|
||||||
|
`kind' is 0, and `env' is likewise 0, so we have a simple
|
||||||
|
computation. From the GC sources:
|
||||||
|
(((((env) << LOG_MAX_MARK_PROCS) | (proc_index)) << DS_TAG_BITS) \
|
||||||
|
| DS_PROC)
|
||||||
|
Here DS_PROC == 2. */
|
||||||
|
#define PROCEDURE_OBJECT_DESCRIPTOR integer_two_node
|
||||||
|
|
||||||
|
/* Treat two HOST_WIDE_INT's as a contiguous bitmap, with bit 0 being
|
||||||
|
the least significant. This function sets bit N in the bitmap. */
|
||||||
|
static void
|
||||||
|
set_bit (unsigned HOST_WIDE_INT *low, unsigned HOST_WIDE_INT *high,
|
||||||
|
unsigned int n)
|
||||||
|
{
|
||||||
|
HOST_WIDE_INT *which;
|
||||||
|
|
||||||
|
if (n >= HOST_BITS_PER_WIDE_INT)
|
||||||
|
{
|
||||||
|
n -= HOST_BITS_PER_WIDE_INT;
|
||||||
|
which = high;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
which = low;
|
||||||
|
|
||||||
|
*which |= (HOST_WIDE_INT) 1 << n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the marking bitmap for the class TYPE. For now this is a
|
||||||
|
single word describing the type. */
|
||||||
|
tree
|
||||||
|
get_boehm_type_descriptor (tree type)
|
||||||
|
{
|
||||||
|
unsigned int count, log2_size, ubit;
|
||||||
|
int bit;
|
||||||
|
int all_bits_set = 1;
|
||||||
|
int last_set_index = 0;
|
||||||
|
int pointer_after_end = 0;
|
||||||
|
unsigned HOST_WIDE_INT low = 0, high = 0;
|
||||||
|
tree field, value;
|
||||||
|
|
||||||
|
/* If the GC wasn't requested, just use a null pointer. */
|
||||||
|
if (! flag_use_boehm_gc)
|
||||||
|
return null_pointer_node;
|
||||||
|
|
||||||
|
/* If we have a type of unknown size, use a proc. */
|
||||||
|
if (int_size_in_bytes (type) == -1)
|
||||||
|
return PROCEDURE_OBJECT_DESCRIPTOR;
|
||||||
|
|
||||||
|
bit = POINTER_SIZE;
|
||||||
|
/* The size of this node has to be known. And, we only support 32
|
||||||
|
and 64 bit targets, so we need to know that the log2 is one of
|
||||||
|
our values. */
|
||||||
|
log2_size = exact_log2 (bit);
|
||||||
|
if (bit == -1 || (log2_size != 2 && log2_size != 3))
|
||||||
|
{
|
||||||
|
/* This means the GC isn't supported. We should probably
|
||||||
|
abort or give an error. Instead, for now, we just silently
|
||||||
|
revert. FIXME. */
|
||||||
|
return null_pointer_node;
|
||||||
|
}
|
||||||
|
bit *= BITS_PER_UNIT;
|
||||||
|
|
||||||
|
/* Warning avoidance. */
|
||||||
|
ubit = (unsigned int) bit;
|
||||||
|
|
||||||
|
field = TYPE_FIELDS (type);
|
||||||
|
if (DECL_NAME (field) == NULL_TREE)
|
||||||
|
field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
|
||||||
|
for (count = 0; field != NULL_TREE; field = TREE_CHAIN (field))
|
||||||
|
{
|
||||||
|
if (FIELD_STATIC (field))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (JREFERENCE_TYPE_P (TREE_TYPE (field)))
|
||||||
|
{
|
||||||
|
last_set_index = count;
|
||||||
|
/* First word in object corresponds to most significant byte
|
||||||
|
of bitmap. */
|
||||||
|
set_bit (&low, &high, ubit - count);
|
||||||
|
if (count > ubit - 2)
|
||||||
|
pointer_after_end = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
all_bits_set = 0;
|
||||||
|
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the object is all pointers, or if the part with pointers fits
|
||||||
|
in our bitmap, then we are ok. Otherwise we have to allocate it
|
||||||
|
a different way. */
|
||||||
|
if (all_bits_set)
|
||||||
|
{
|
||||||
|
/* In the GC the computation looks something like this:
|
||||||
|
value = DS_LENGTH | WORDS_TO_BYTES (last_set_index + 1);
|
||||||
|
DS_LENGTH is 0.
|
||||||
|
WORDS_TO_BYTES shifts by log2(bytes-per-pointer). */
|
||||||
|
count = 0;
|
||||||
|
++last_set_index;
|
||||||
|
while (last_set_index)
|
||||||
|
{
|
||||||
|
if ((last_set_index & 1))
|
||||||
|
set_bit (&low, &high, log2_size + count);
|
||||||
|
last_set_index >>= 1;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
value = build_int_2 (low, high);
|
||||||
|
}
|
||||||
|
else if (! pointer_after_end)
|
||||||
|
{
|
||||||
|
/* Bottom two bits for bitmap mark type are 01. */
|
||||||
|
set_bit (&low, &high, 0);
|
||||||
|
value = build_int_2 (low, high);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
value = PROCEDURE_OBJECT_DESCRIPTOR;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
@ -1172,8 +1172,11 @@ get_dispatch_table (type, this_class_addr)
|
|||||||
build1 (ADDR_EXPR, nativecode_ptr_type_node, method),
|
build1 (ADDR_EXPR, nativecode_ptr_type_node, method),
|
||||||
list);
|
list);
|
||||||
}
|
}
|
||||||
/* Dummy entry for compatibility with G++ -fvtable-thunks. */
|
/* Dummy entry for compatibility with G++ -fvtable-thunks. When
|
||||||
list = tree_cons (integer_zero_node, null_pointer_node, list);
|
using the Boehm GC we sometimes stash a GC type descriptor
|
||||||
|
there. */
|
||||||
|
list = tree_cons (integer_zero_node, get_boehm_type_descriptor (type),
|
||||||
|
list);
|
||||||
list = tree_cons (integer_zero_node, this_class_addr, list);
|
list = tree_cons (integer_zero_node, this_class_addr, list);
|
||||||
return build (CONSTRUCTOR, build_prim_array_type (nativecode_ptr_type_node,
|
return build (CONSTRUCTOR, build_prim_array_type (nativecode_ptr_type_node,
|
||||||
nvirtuals + 2),
|
nvirtuals + 2),
|
||||||
@ -1343,12 +1346,8 @@ make_class_data (type)
|
|||||||
constant_pool_constructor = build_constants_constructor ();
|
constant_pool_constructor = build_constants_constructor ();
|
||||||
|
|
||||||
START_RECORD_CONSTRUCTOR (temp, object_type_node);
|
START_RECORD_CONSTRUCTOR (temp, object_type_node);
|
||||||
#if 0
|
|
||||||
PUSH_FIELD_VALUE (temp, "vtable", NULL_TREE);
|
|
||||||
#else
|
|
||||||
PUSH_FIELD_VALUE (temp, "vtable",
|
PUSH_FIELD_VALUE (temp, "vtable",
|
||||||
build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl));
|
build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl));
|
||||||
#endif
|
|
||||||
PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
|
PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
|
||||||
FINISH_RECORD_CONSTRUCTOR (temp);
|
FINISH_RECORD_CONSTRUCTOR (temp);
|
||||||
START_RECORD_CONSTRUCTOR (cons, class_type_node);
|
START_RECORD_CONSTRUCTOR (cons, class_type_node);
|
||||||
|
@ -141,6 +141,9 @@ extern int flag_static_local_jdk1_1;
|
|||||||
/* When non zero, call a library routine to do integer divisions. */
|
/* When non zero, call a library routine to do integer divisions. */
|
||||||
extern int flag_use_divide_subroutine;
|
extern int flag_use_divide_subroutine;
|
||||||
|
|
||||||
|
/* When non zero, generate code for the Boehm GC. */
|
||||||
|
extern int flag_use_boehm_gc;
|
||||||
|
|
||||||
/* The Java .class file that provides main_class; the main input file. */
|
/* The Java .class file that provides main_class; the main input file. */
|
||||||
extern struct JCF *current_jcf;
|
extern struct JCF *current_jcf;
|
||||||
|
|
||||||
@ -663,6 +666,8 @@ extern char* open_class PARAMS ((char *, struct JCF *, int, const char *));
|
|||||||
#endif
|
#endif
|
||||||
void java_debug_context PARAMS ((void));
|
void java_debug_context PARAMS ((void));
|
||||||
|
|
||||||
|
extern tree get_boehm_type_descriptor PARAMS ((tree));
|
||||||
|
|
||||||
/* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included
|
/* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included
|
||||||
to declare `enum expand_modifier'. */
|
to declare `enum expand_modifier'. */
|
||||||
#if defined (TREE_CODE) && defined(RTX_CODE) && defined (HAVE_MACHINE_MODES) && defined (ARGS_SIZE_RTX)
|
#if defined (TREE_CODE) && defined(RTX_CODE) && defined (HAVE_MACHINE_MODES) && defined (ARGS_SIZE_RTX)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Switch definitions for the GNU compiler for the Java(TM) language.
|
/* Switch definitions for the GNU compiler for the Java(TM) language.
|
||||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
||||||
@ -33,6 +33,7 @@ DEFINE_LANG_NAME ("Java")
|
|||||||
{ "-fno-assume-compiled", "" },
|
{ "-fno-assume-compiled", "" },
|
||||||
{ "-femit-class-file", "" },
|
{ "-femit-class-file", "" },
|
||||||
{ "-femit-class-files", "Dump class files to <name>.class" },
|
{ "-femit-class-files", "Dump class files to <name>.class" },
|
||||||
|
{ "-fuse-boehm-gc", "Generate code for Boehm GC" },
|
||||||
#if ! USE_CPPLIB
|
#if ! USE_CPPLIB
|
||||||
{ "-MD", "Print dependencies to FILE.d" },
|
{ "-MD", "Print dependencies to FILE.d" },
|
||||||
{ "-MMD", "Print dependencies to FILE.d" },
|
{ "-MMD", "Print dependencies to FILE.d" },
|
||||||
|
@ -110,6 +110,9 @@ int flag_static_local_jdk1_1 = 0;
|
|||||||
/* When non zero, call a library routine to do integer divisions. */
|
/* When non zero, call a library routine to do integer divisions. */
|
||||||
int flag_use_divide_subroutine = 1;
|
int flag_use_divide_subroutine = 1;
|
||||||
|
|
||||||
|
/* When non zero, generate code for the Boehm GC. */
|
||||||
|
int flag_use_boehm_gc = 0;
|
||||||
|
|
||||||
/* From gcc/flags.h, and indicates if exceptions are turned on or not. */
|
/* From gcc/flags.h, and indicates if exceptions are turned on or not. */
|
||||||
|
|
||||||
extern int flag_new_exceptions;
|
extern int flag_new_exceptions;
|
||||||
@ -127,6 +130,7 @@ lang_f_options[] =
|
|||||||
{"emit-class-file", &flag_emit_class_files, 1},
|
{"emit-class-file", &flag_emit_class_files, 1},
|
||||||
{"emit-class-files", &flag_emit_class_files, 1},
|
{"emit-class-files", &flag_emit_class_files, 1},
|
||||||
{"use-divide-subroutine", &flag_use_divide_subroutine, 1},
|
{"use-divide-subroutine", &flag_use_divide_subroutine, 1},
|
||||||
|
{"use-boehm-gc", &flag_use_boehm_gc, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
JCF *current_jcf;
|
JCF *current_jcf;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user