diff options
author | Richard Biener <rguenther@suse.de> | 2017-04-20 14:25:11 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-04-20 14:25:11 +0000 |
commit | acb14262e18e8338c014926cdbcd034832f3561e (patch) | |
tree | a08e3113a16fe64998d1432712e342830b1515a4 /gcc/ggc-page.c | |
parent | 8ee1b0a013d0bbfc70a8165a52cf64d3157c1e96 (diff) |
ggc-page.c (ggc_allocated_p): Rename to ...
2017-04-20 Richard Biener <rguenther@suse.de>
* ggc-page.c (ggc_allocated_p): Rename to ...
(safe_lookup_page_table_entry): ... this and return the lookup
result.
(gt_ggc_m_S): Use safe_lookup_page_table_entry.
From-SVN: r247025
Diffstat (limited to 'gcc/ggc-page.c')
-rw-r--r-- | gcc/ggc-page.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c index 1aef94ec91f..dd655608309 100644 --- a/gcc/ggc-page.c +++ b/gcc/ggc-page.c @@ -522,7 +522,6 @@ static bool in_gc = false; /* Initial guess as to how many page table entries we might need. */ #define INITIAL_PTE_COUNT 128 -static int ggc_allocated_p (const void *); static page_entry *lookup_page_table_entry (const void *); static void set_page_table_entry (void *, page_entry *); #ifdef USING_MMAP @@ -587,10 +586,11 @@ push_by_depth (page_entry *p, unsigned long *s) #define save_in_use_p(__p) \ (save_in_use_p_i (__p->index_by_depth)) -/* Returns nonzero if P was allocated in GC'able memory. */ +/* Traverse the page table and find the entry for a page. + If the object wasn't allocated in GC return NULL. */ -static inline int -ggc_allocated_p (const void *p) +static inline page_entry * +safe_lookup_page_table_entry (const void *p) { page_entry ***base; size_t L1, L2; @@ -603,7 +603,7 @@ ggc_allocated_p (const void *p) while (1) { if (table == NULL) - return 0; + return NULL; if (table->high_bits == high_bits) break; table = table->next; @@ -614,8 +614,10 @@ ggc_allocated_p (const void *p) /* Extract the level 1 and 2 indices. */ L1 = LOOKUP_L1 (p); L2 = LOOKUP_L2 (p); + if (! base[L1]) + return NULL; - return base[L1] && base[L1][L2]; + return base[L1][L2]; } /* Traverse the page table and find the entry for a page. @@ -1455,12 +1457,14 @@ gt_ggc_m_S (const void *p) unsigned long mask; unsigned long offset; - if (!p || !ggc_allocated_p (p)) + if (!p) return; - /* Look up the page on which the object is alloced. . */ - entry = lookup_page_table_entry (p); - gcc_assert (entry); + /* Look up the page on which the object is alloced. If it was not + GC allocated, gracefully bail out. */ + entry = safe_lookup_page_table_entry (p); + if (!entry) + return; /* Calculate the index of the object on the page; this is its bit position in the in_use_p bitmap. Note that because a char* might |