diff options
author | Tom Tromey <tromey@cygnus.com> | 1999-11-01 23:15:51 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 1999-11-01 23:15:51 +0000 |
commit | 20bbd3cd53a80ddafa56a5d21337aae0c24f94ca (patch) | |
tree | 9c24ba1ebabff472b9caddbff07ef957dbf2c24c /boehm-gc/gc_mark.h | |
parent | c05ddfa745d68f6d9db1a7d0992650a41986d376 (diff) | |
download | gcc-20bbd3cd53a80ddafa56a5d21337aae0c24f94ca.zip gcc-20bbd3cd53a80ddafa56a5d21337aae0c24f94ca.tar.gz gcc-20bbd3cd53a80ddafa56a5d21337aae0c24f94ca.tar.bz2 |
Merged GC 5.0alpha4 with local changes, plus:
* Makefile.in: Rebuilt.
* Makefile.am (gctest_LDADD): Added THREADLIB.
(TESTS): New macro.
* configure: Rebuilt.
* configure.in (INCLUDES): New subst.
From-SVN: r30332
Diffstat (limited to 'boehm-gc/gc_mark.h')
-rw-r--r-- | boehm-gc/gc_mark.h | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/boehm-gc/gc_mark.h b/boehm-gc/gc_mark.h index ade98a9..4628323 100644 --- a/boehm-gc/gc_mark.h +++ b/boehm-gc/gc_mark.h @@ -38,12 +38,17 @@ /* subset of the places the conservative marker would. It must be safe */ /* to invoke the normal mark procedure instead. */ # define PROC_BYTES 100 -typedef struct ms_entry * (*mark_proc)(/* word * addr, mark_stack_ptr, - mark_stack_limit, env */); +/* The real declarations of the following are in gc_priv.h, so that */ +/* we can avoid scanning the following table. */ +/* +typedef struct ms_entry * (*mark_proc)( word * addr, mark_stack_ptr, + mark_stack_limit, env ); # define LOG_MAX_MARK_PROCS 6 # define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS) extern mark_proc GC_mark_procs[MAX_MARK_PROCS]; +*/ + extern word GC_n_mark_procs; /* Object descriptors on mark stack or in objects. Low order two */ @@ -166,6 +171,8 @@ mse * GC_signal_mark_stack_overflow(); /* Mark bit is already set */ \ goto exit_label; \ } \ + GC_STORE_BACK_PTR((ptr_t)source, (ptr_t)HBLKPTR(current) \ + + WORDS_TO_BYTES(displ)); \ *mark_word_addr = mark_word | mark_bit; \ } \ PUSH_OBJ(((word *)(HBLKPTR(current)) + displ), hhdr, \ @@ -173,18 +180,24 @@ mse * GC_signal_mark_stack_overflow(); exit_label: ; \ } +#ifdef PRINT_BLACK_LIST +# define PUSH_ONE_CHECKED(p, ip, source) \ + GC_push_one_checked(p, ip, (ptr_t)(source)) +#else +# define PUSH_ONE_CHECKED(p, ip, source) \ + GC_push_one_checked(p, ip) +#endif /* * Push a single value onto mark stack. Mark from the object pointed to by p. - * GC_push_one is normally called by GC_push_regs, and thus must be defined. * P is considered valid even if it is an interior pointer. * Previously marked objects are not pushed. Hence we make progress even * if the mark stack overflows. */ -# define GC_PUSH_ONE_STACK(p) \ +# define GC_PUSH_ONE_STACK(p, source) \ if ((ptr_t)(p) >= GC_least_plausible_heap_addr \ && (ptr_t)(p) < GC_greatest_plausible_heap_addr) { \ - GC_push_one_checked(p,TRUE); \ + PUSH_ONE_CHECKED(p, TRUE, source); \ } /* @@ -196,10 +209,10 @@ mse * GC_signal_mark_stack_overflow(); # else # define AIP FALSE # endif -# define GC_PUSH_ONE_HEAP(p) \ +# define GC_PUSH_ONE_HEAP(p,source) \ if ((ptr_t)(p) >= GC_least_plausible_heap_addr \ && (ptr_t)(p) < GC_greatest_plausible_heap_addr) { \ - GC_push_one_checked(p,AIP); \ + PUSH_ONE_CHECKED(p,AIP,source); \ } /* @@ -213,7 +226,7 @@ mse * GC_signal_mark_stack_overflow(); while (!GC_mark_stack_empty()) GC_mark_from_mark_stack(); \ if (GC_mark_state != MS_NONE) { \ GC_set_mark_bit(real_ptr); \ - while (!GC_mark_some()); \ + while (!GC_mark_some((ptr_t)0)); \ } \ } @@ -233,8 +246,8 @@ typedef int mark_state_t; /* Current state of marking, as follows:*/ /* Invariant I: all roots and marked */ /* objects p are either dirty, or point */ - /* objects q that are either marked or */ - /* a pointer to q appears in a range */ + /* to objects q that are either marked */ + /* or a pointer to q appears in a range */ /* on the mark stack. */ # define MS_NONE 0 /* No marking in progress. I holds. */ |