From 9781b6dabd95da9b390eaffe878fb883d10d9e74 Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Sat, 31 Jan 2004 02:18:25 +0000 Subject: [PATCH] ggc-zone.c (ggc_free): New function. 2003-01-30 Daniel Berlin * ggc-zone.c (ggc_free): New function. From-SVN: r77019 --- gcc/ChangeLog | 4 ++++ gcc/ggc-zone.c | 33 ++++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 02c2743..5c77923 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2003-01-30 Daniel Berlin + + * ggc-zone.c (ggc_free): New function. + 2004-01-30 Kazu Hirata alloc-pool.c, c-lex.c, c-pragma.h, c-semantics.c, cfghooks.c, diff --git a/gcc/ggc-zone.c b/gcc/ggc-zone.c index 355414f..bc7a4cd 100644 --- a/gcc/ggc-zone.c +++ b/gcc/ggc-zone.c @@ -126,6 +126,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifndef HOST_BITS_PER_PTR #define HOST_BITS_PER_PTR HOST_BITS_PER_LONG #endif + #ifdef COOKIE_CHECKING #define CHUNK_MAGIC 0x95321123 #define DEADCHUNK_MAGIC 0x12817317 @@ -734,6 +735,31 @@ ggc_alloc_zone (size_t size, struct alloc_zone *zone) return ggc_alloc_zone_1 (size, zone, -1); } +/* Poison the chunk. */ +#ifdef ENABLE_GC_CHECKING +#define poison_chunk(CHUNK, SIZE) \ + memset ((CHUNK)->u.data, 0xa5, (SIZE)) +#else +#define poison_chunk(CHUNK, SIZE) +#endif + +/* Free the object at P. */ + +void +ggc_free (void *p) +{ + struct alloc_chunk *chunk; + + chunk = (struct alloc_chunk *) ((char *)p - CHUNK_OVERHEAD); + + /* Poison the chunk. */ + poison_chunk (chunk, ggc_get_size (p)); + + /* XXX: We only deal with explicitly freeing large objects ATM. */ + if (chunk->large) + free (p); +} + /* If P is not marked, mark it and return false. Otherwise return true. P must have been allocated by the GC allocator; it mustn't point to static objects, stack variables, or memory allocated with malloc. */ @@ -931,13 +957,6 @@ ggc_pop_context (void) for (zone = G.zones; zone; zone = zone->next_zone) ggc_pop_context_1 (zone); } -/* Poison the chunk. */ -#ifdef ENABLE_GC_CHECKING -#define poison_chunk(CHUNK, SIZE) \ - memset ((CHUNK)->u.data, 0xa5, (SIZE)) -#else -#define poison_chunk(CHUNK, SIZE) -#endif /* Free all empty pages and objects within a page for a given zone */ -- 2.7.4