aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog15
-rw-r--r--gcc/java/Makefile.in4
-rw-r--r--gcc/java/boehm.c152
-rw-r--r--gcc/java/class.c11
-rw-r--r--gcc/java/java-tree.h5
-rw-r--r--gcc/java/lang-options.h3
-rw-r--r--gcc/java/lang.c4
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;