summaryrefslogtreecommitdiff
path: root/gcc/java/boehm.c
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-05 04:23:23 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-05 04:23:23 +0000
commit9d45d2f2c78c76c1d4b516e158b81d681d95065e (patch)
treef1bd585b01b4c2c7eec1fe5601041d15a95b79ed /gcc/java/boehm.c
parent361aa6101c0994c6f739b1e64ce1b2b4ea6ac8dd (diff)
downloadgcc-9d45d2f2c78c76c1d4b516e158b81d681d95065e.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33701 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java/boehm.c')
-rw-r--r--gcc/java/boehm.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/gcc/java/boehm.c b/gcc/java/boehm.c
index 3d8b59399bf..63d6d7c3dcf 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). */