diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2004-01-31 02:18:25 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2004-01-31 02:18:25 +0000 |
commit | 9781b6dabd95da9b390eaffe878fb883d10d9e74 (patch) | |
tree | 61737e5c49c00ed5d979ac9af802fa5f8e8f2a48 /gcc | |
parent | 283334f01103fd6de2b635af2261b035388762ff (diff) | |
download | gcc-9781b6dabd95da9b390eaffe878fb883d10d9e74.zip gcc-9781b6dabd95da9b390eaffe878fb883d10d9e74.tar.gz gcc-9781b6dabd95da9b390eaffe878fb883d10d9e74.tar.bz2 |
ggc-zone.c (ggc_free): New function.
2003-01-30 Daniel Berlin <dberlin@dberlin.org>
* ggc-zone.c (ggc_free): New function.
From-SVN: r77019
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | 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 <dberlin@dberlin.org> + + * ggc-zone.c (ggc_free): New function. + 2004-01-30 Kazu Hirata <kazu@cs.umass.edu> 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 */ |