typedef struct GC_ms_entry {
ptr_t mse_start; /* First word of object, word aligned. */
- GC_word mse_descr; /* Descriptor; low order two bits are tags, */
+ union word_ptr_ao_u mse_descr;
+ /* Descriptor; low order two bits are tags, */
/* as described in gc_mark.h. */
} mse;
#ifdef PARALLEL_MARK
GC_EXTERN mse * volatile GC_mark_stack_top;
+ /* FIXME: Use union to avoid casts to AO_t */
#else
GC_EXTERN mse * GC_mark_stack_top;
#endif
mark_stack_top = GC_signal_mark_stack_overflow(mark_stack_top); \
} \
mark_stack_top -> mse_start = (obj); \
- mark_stack_top -> mse_descr = _descr; \
+ mark_stack_top -> mse_descr.w = _descr; \
} \
}
# define OR_WORD_EXIT_IF_SET(addr, bits, exit_label) \
{ \
if (!(*(addr) & (bits))) { \
- AO_or((AO_t *)(addr), (bits)); \
+ AO_or((volatile AO_t *)(addr), (AO_t)(bits)); \
} else { \
goto exit_label; \
} \
# endif
{
current_p = mark_stack_top -> mse_start;
- descr = mark_stack_top -> mse_descr;
+ descr = mark_stack_top -> mse_descr.w;
retry:
/* current_p and descr describe the current object. */
/* *mark_stack_top is vacant. */
&& mark_stack_top < mark_stack_limit - 1) {
int new_size = (descr/2) & ~(sizeof(word)-1);
mark_stack_top -> mse_start = current_p;
- mark_stack_top -> mse_descr = new_size + sizeof(word);
+ mark_stack_top -> mse_descr.w = new_size + sizeof(word);
/* makes sure we handle */
/* misaligned pointers. */
mark_stack_top++;
# endif /* PARALLEL_MARK */
mark_stack_top -> mse_start =
limit = current_p + WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1);
- mark_stack_top -> mse_descr =
- descr - WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1);
+ mark_stack_top -> mse_descr.w =
+ descr - WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1);
# ifdef ENABLE_TRACE
if (GC_trace_addr >= current_p
&& GC_trace_addr < current_p + descr) {
GC_ASSERT(high >= low-1 && (word)(high - low + 1) <= GC_mark_stack_size);
for (p = low; p <= high && i <= max; ++p) {
- word descr = AO_load((volatile AO_t *) &(p -> mse_descr));
+ word descr = (word)AO_load(&p->mse_descr.ao);
if (descr != 0) {
/* Must be ordered after read of descr: */
- AO_store_release_write((volatile AO_t *) &(p -> mse_descr), 0);
+ AO_store_release_write(&p->mse_descr.ao, 0);
/* More than one thread may get this entry, but that's only */
/* a minor performance problem. */
++top;
- top -> mse_descr = descr;
+ top -> mse_descr.w = descr;
top -> mse_start = p -> mse_start;
- GC_ASSERT((top -> mse_descr & GC_DS_TAGS) != GC_DS_LENGTH ||
- top -> mse_descr < (word)GC_greatest_plausible_heap_addr
+ GC_ASSERT((top->mse_descr.w & GC_DS_TAGS) != GC_DS_LENGTH ||
+ top->mse_descr.w < (word)GC_greatest_plausible_heap_addr
- (word)GC_least_plausible_heap_addr);
/* If this is a big object, count it as */
/* size/256 + 1 objects. */
length &= ~GC_DS_TAGS;
# endif
GC_mark_stack_top -> mse_start = bottom;
- GC_mark_stack_top -> mse_descr = length;
+ GC_mark_stack_top -> mse_descr.w = length;
}
#ifndef GC_DISABLE_INCREMENTAL
mark_stack_ptr = GC_signal_mark_stack_overflow(mark_stack_ptr);
}
mark_stack_ptr -> mse_start = (ptr_t)(addr + WORDSZ);
- mark_stack_ptr -> mse_descr =
- GC_MAKE_PROC(GC_typed_mark_proc_index, env+1);
+ mark_stack_ptr -> mse_descr.w =
+ GC_MAKE_PROC(GC_typed_mark_proc_index, env + 1);
}
return(mark_stack_ptr);
}
for (i = 0; i < nelements; i++) {
msp++;
msp -> mse_start = current;
- msp -> mse_descr = descr;
+ msp -> mse_descr.w = descr;
current += sz;
}
return(msp);
GC_mark_stack_too_small = TRUE;
new_mark_stack_ptr = orig_mark_stack_ptr + 1;
new_mark_stack_ptr -> mse_start = (ptr_t)addr;
- new_mark_stack_ptr -> mse_descr = sz | GC_DS_LENGTH;
+ new_mark_stack_ptr -> mse_descr.w = sz | GC_DS_LENGTH;
} else {
/* Push descriptor itself */
new_mark_stack_ptr++;
new_mark_stack_ptr -> mse_start = (ptr_t)(addr + nwords - 1);
- new_mark_stack_ptr -> mse_descr = sizeof(word) | GC_DS_LENGTH;
+ new_mark_stack_ptr -> mse_descr.w = sizeof(word) | GC_DS_LENGTH;
}
return new_mark_stack_ptr;
}