mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-28 00:14:59 +08:00
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>
|
||||
|
||||
* 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 \
|
||||
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
|
||||
|
||||
@ -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
|
||||
gjavah.o : $(CONFIG_H) $(srcdir)/../system.h $(JAVA_TREE_H) gjavah.c \
|
||||
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 \
|
||||
$(srcdir)/../system.h $(srcdir)/../toplev.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),
|
||||
list);
|
||||
}
|
||||
/* Dummy entry for compatibility with G++ -fvtable-thunks. */
|
||||
list = tree_cons (integer_zero_node, null_pointer_node, list);
|
||||
/* Dummy entry for compatibility with G++ -fvtable-thunks. When
|
||||
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);
|
||||
return build (CONSTRUCTOR, build_prim_array_type (nativecode_ptr_type_node,
|
||||
nvirtuals + 2),
|
||||
@ -1343,12 +1346,8 @@ make_class_data (type)
|
||||
constant_pool_constructor = build_constants_constructor ();
|
||||
|
||||
START_RECORD_CONSTRUCTOR (temp, object_type_node);
|
||||
#if 0
|
||||
PUSH_FIELD_VALUE (temp, "vtable", NULL_TREE);
|
||||
#else
|
||||
PUSH_FIELD_VALUE (temp, "vtable",
|
||||
build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl));
|
||||
#endif
|
||||
PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
|
||||
FINISH_RECORD_CONSTRUCTOR (temp);
|
||||
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. */
|
||||
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. */
|
||||
extern struct JCF *current_jcf;
|
||||
|
||||
@ -663,6 +666,8 @@ extern char* open_class PARAMS ((char *, struct JCF *, int, const char *));
|
||||
#endif
|
||||
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
|
||||
to declare `enum expand_modifier'. */
|
||||
#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.
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
@ -33,6 +33,7 @@ DEFINE_LANG_NAME ("Java")
|
||||
{ "-fno-assume-compiled", "" },
|
||||
{ "-femit-class-file", "" },
|
||||
{ "-femit-class-files", "Dump class files to <name>.class" },
|
||||
{ "-fuse-boehm-gc", "Generate code for Boehm GC" },
|
||||
#if ! USE_CPPLIB
|
||||
{ "-MD", "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. */
|
||||
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. */
|
||||
|
||||
extern int flag_new_exceptions;
|
||||
@ -127,6 +130,7 @@ lang_f_options[] =
|
||||
{"emit-class-file", &flag_emit_class_files, 1},
|
||||
{"emit-class-files", &flag_emit_class_files, 1},
|
||||
{"use-divide-subroutine", &flag_use_divide_subroutine, 1},
|
||||
{"use-boehm-gc", &flag_use_boehm_gc, 1}
|
||||
};
|
||||
|
||||
JCF *current_jcf;
|
||||
|
Loading…
Reference in New Issue
Block a user