diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/java/Makefile.in | 4 | ||||
-rw-r--r-- | gcc/java/boehm.c | 152 | ||||
-rw-r--r-- | gcc/java/class.c | 11 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 5 | ||||
-rw-r--r-- | gcc/java/lang-options.h | 3 | ||||
-rw-r--r-- | gcc/java/lang.c | 4 |
7 files changed, 186 insertions, 8 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index cbb7814..d5cbb83 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -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. diff --git a/gcc/java/Makefile.in b/gcc/java/Makefile.in index 73bc64e..e5c573c 100644 --- a/gcc/java/Makefile.in +++ b/gcc/java/Makefile.in @@ -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 \ diff --git a/gcc/java/boehm.c b/gcc/java/boehm.c new file mode 100644 index 0000000..370ff97 --- /dev/null +++ b/gcc/java/boehm.c @@ -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; +} diff --git a/gcc/java/class.c b/gcc/java/class.c index af56f74..f5cfd88 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -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); diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 5cfd533..146893a 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -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) diff --git a/gcc/java/lang-options.h b/gcc/java/lang-options.h index 7ebc7ee..43bf70e 100644 --- a/gcc/java/lang-options.h +++ b/gcc/java/lang-options.h @@ -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" }, diff --git a/gcc/java/lang.c b/gcc/java/lang.c index 10db753..8992c57 100644 --- a/gcc/java/lang.c +++ b/gcc/java/lang.c @@ -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; |