diff options
-rw-r--r-- | gcc/java/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/java/boehm.c | 21 | ||||
-rw-r--r-- | gcc/java/decl.c | 3 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 1 |
4 files changed, 32 insertions, 9 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 9d7fd3c..d922aa1 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,14 @@ +2000-05-04 Tom Tromey <tromey@cygnus.com> + + * boehm.c (mark_reference_fields): Don't mark RawData fields. + Keep track of when we've seen a reference field after a + non-reference field. + (get_boehm_type_descriptor): Handle case where we see + non-reference fields but no trailing reference field. + * decl.c (rawdata_ptr_type_node): Define. + (init_decl_processing): Initialize rawdata_ptr_type_node. + * java-tree.h (rawdata_ptr_type_node): Declare. + 2000-05-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * jcf-dump.c (SPECIAL_IINC): Ensure arguments match format @@ -14,11 +25,6 @@ * gjavah.c (decode_signature_piece): Don't treat `$' as namespace separator. -2000-05-02 Tom Tromey <tromey@cygnus.com> - - * expr.c (build_jni_stub): Cache the result of - _Jv_LookupJNIMethod. - 2000-04-19 Tom Tromey <tromey@cygnus.com> * class.c (add_method_1): Set both DECL_EXTERNAL and METHOD_NATIVE diff --git a/gcc/java/boehm.c b/gcc/java/boehm.c index 3d8b593..63d6d7c 100644 --- a/gcc/java/boehm.c +++ b/gcc/java/boehm.c @@ -100,7 +100,10 @@ mark_reference_fields (field, low, high, ubit, continue; offset = int_byte_position (field); - if (JREFERENCE_TYPE_P (TREE_TYPE (field))) + if (JREFERENCE_TYPE_P (TREE_TYPE (field)) + /* An `object' of type gnu.gcj.RawData is actually non-Java + data. */ + && TREE_TYPE (field) != rawdata_ptr_type_node) { unsigned int count; @@ -117,8 +120,14 @@ mark_reference_fields (field, low, high, ubit, set_bit (low, high, ubit - count - 1); if (count > ubit - 2) *pointer_after_end = 1; + + /* If we saw a non-reference field earlier, then we can't + use the count representation. We keep track of that in + *ALL_BITS_SET. */ + if (! *all_bits_set) + *all_bits_set = -1; } - else + else if (*all_bits_set > 0) *all_bits_set = 0; *last_view_index = offset; @@ -172,9 +181,13 @@ get_boehm_type_descriptor (tree type) /* 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) + if (all_bits_set != -1) { - /* In the GC the computation looks something like this: + /* In this case the initial part of the object is all reference + fields, and the end of the object is all non-reference + fields. We represent the mark as a count of the fields, + shifted. 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). */ diff --git a/gcc/java/decl.c b/gcc/java/decl.c index a5eb527..2ccde68 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -295,6 +295,7 @@ tree string_ptr_type_node; tree throwable_type_node; tree runtime_exception_type_node; tree error_exception_type_node; +tree rawdata_ptr_type_node; tree *predef_filenames; int predef_filenames_size; @@ -586,6 +587,8 @@ init_decl_processing () lookup_class (get_identifier ("java.lang.RuntimeException")); error_exception_type_node = lookup_class (get_identifier ("java.lang.Error")); + rawdata_ptr_type_node + = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData"))); /* This section has to be updated as items are added to the previous section. */ diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 1bf166a..2820f5d 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -225,6 +225,7 @@ extern tree string_ptr_type_node; extern tree throwable_type_node; extern tree runtime_exception_type_node; extern tree error_exception_type_node; +extern tree rawdata_ptr_type_node; extern tree *predef_filenames; extern int predef_filenames_size; |