From acb14262e18e8338c014926cdbcd034832f3561e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 20 Apr 2017 14:25:11 +0000 Subject: [PATCH] ggc-page.c (ggc_allocated_p): Rename to ... 2017-04-20 Richard Biener * 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 --- gcc/ChangeLog | 7 +++++++ gcc/ggc-page.c | 24 ++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97fb5f36a8b..fc1260739e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-04-20 Richard Biener + + * 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. + 2017-04-20 Richard Biener PR tree-optimization/80453 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 -- 2.30.2