Skip to content

Commit

Permalink
Define internal PTR_ALIGN_DOWN/UP macros
Browse files Browse the repository at this point in the history
(refactoring)

Issue #627 (bdwgc).

Also, change sizeof(word) to sizeof(ptr_t) where PTR_ALIGN_DOWN/UP
macros are used.

* allchblk.c (find_nonbl_hblk): Change type of search_end local
variable from word to ptr_t.
* allchblk.c (find_nonbl_hblk): Use PTR_ALIGN_DOWN().
* dyn_load.c [HAVE_DL_ITERATE_PHDR && PT_GNU_RELRO && CPP_WORDSZ==64]
(GC_register_dynlib_callback): Likewise.
* dyn_load.c [ANY_MSWIN && !THREADS] (GC_cond_add_roots): Likewise.
* include/private/gc_priv.h (HBLKPTR, HBLK_PAGE_ALIGNED): Likewise.
* mark.c (GC_push_all, GC_custom_push_range, GC_push_all_eager,
GC_push_all_stack): Likewise.
* mark.c [!GC_DISABLE_INCREMENTAL] (GC_push_selected): Likewise.
* mark_rts.c (GC_add_roots_inner, GC_remove_roots_inner,
GC_exclude_static_roots): Likewise.
* misc.c [!ALWAYS_SMALL_CLEAR_STACK && !STACK_NOT_SCANNED]
(GC_clear_stack): Likewise.
* misc.c (GC_base): Likewise.
* os_dep.c [OPENBSD] (GC_skip_hole_openbsd): Likewise.
* os_dep.c [ANY_MSWIN && !CYGWIN32] (GC_get_stack_base): Likewise.
* os_dep.c [NEED_FIND_LIMIT || USE_PROC_FOR_LIBRARIES && THREADS]
(GC_find_limit_with_bound): Likewise.
* os_dep.c [HPUX_STACK_BOTTOM] (GC_get_register_stack_base): Likewise.
* os_dep.c [!ECOS && !NOSYS && !SYMBIAN && !EMSCRIPTEN && !AMIGA
&& !EMBOX && !HAIKU && !OS2 && !ANY_MSWIN && !GC_OPENBSD_THREADS
&& (!GC_SOLARIS_THREADS || _STRICT_STDC) && !STACKBOTTOM && HEURISTIC1
&& STACK_GROWS_UP] (GC_get_main_stack_base): Likewise.
* os_dep.c [MSWIN32] (GC_least_described_address): Likewise.
* dyn_load.c [HAVE_DL_ITERATE_PHDR && PT_GNU_RELRO && CPP_WORDSZ==64]
(GC_register_dynlib_callback): Change sizeof(word) to sizeof(ptr_t).
* mark.c (GC_push_all_eager, GC_push_all_stack): Likewise.
* mark_rts.c (GC_add_roots_inner, GC_remove_roots_inner,
GC_exclude_static_roots): Likewise.
* os_dep.c [!ANY_MSWIN && (SVR4 || AIX || DGUX) && !PCR]
(GC_SysVGetDataStart): Likewise.
* os_dep.c [DATASTART_USES_BSDGETDATASTART] (GC_FreeBSDGetDataStart):
Likewise.
* dyn_load.c [(SOLARISDL || LINUX) && !USE_PROC_FOR_LIBRARIES]
(GC_register_dynamic_libraries): Remove redundant parentheses.
* dyn_load.c [HAVE_DL_ITERATE_PHDR && PT_GNU_RELRO]
(GC_register_dynlib_callback): Use PTR_ALIGN_UP() instead of
PTRT_ROUNDUP_BY_MASK().
* include/private/gcconfig.h [M68K && LINUX && !__ELF__ || I386
&& (SEQUENT || HAIKU || SCO || LINUX && !__ELF__ || DJGPP) || MIPS
&& EWS4800 && _MIPS_SZPTR!=64 || M88K && CX_UX] (DATASTART): Likewise.
* include/private/gcconfig.h [MIPS && EWS4800 && _MIPS_SZPTR!=64]
(DATASTART2): Likewise.
* mark.c (GC_push_all, GC_custom_push_range, GC_push_all_eager,
GC_push_all_stack): Likewise.
* mark.c [!GC_DISABLE_INCREMENTAL] (GC_push_selected): Likewise.
* mark_rts.c (GC_add_roots_inner, GC_remove_roots_inner,
GC_exclude_static_roots): Likewise.
* os_dep.c [!ECOS && !NOSYS && !SYMBIAN && !EMSCRIPTEN && !AMIGA
&& !EMBOX && !HAIKU && !OS2 && !ANY_MSWIN && !GC_OPENBSD_THREADS
&& (!GC_SOLARIS_THREADS || _STRICT_STDC) && !STACKBOTTOM && HEURISTIC1
&& !STACK_GROWS_UP] (GC_get_main_stack_base): Likewise.
* os_dep.c [!ANY_MSWIN && (SVR4 || AIX || DGUX) && !PCR]
(GC_SysVGetDataStart): Likewise.
* os_dep.c [DATASTART_USES_BSDGETDATASTART] (GC_FreeBSDGetDataStart):
Likewise.
* os_dep.c [MMAP_SUPPORTED && !MSWIN_XBOX1] (GC_unix_mmap_get_mem):
Likewise.
* os_dep.c [!MSWIN_XBOX1 && !MSWINCE && USE_WINALLOC && MSWIN32
&& !MSWINRT_FLAVOR] (GC_win32_get_mem): Likewise.
* os_dep.c [USE_MUNMAP] (GC_unmap_start): Likewise.
* os_dep.c [MPROTECT_VDB && DONT_PROTECT_PTRFREE] (GC_protect_heap):
Likewise.
* os_dep.c [PROC_VDB] (GC_proc_read_dirty): Likewise.
* os_dep.c [MPROTECT_VDB] (GC_remove_protection): Likewise.
* dyn_load.c [ANY_MSWIN] (GC_cond_add_roots): Change type of base and
limit arguments from char* to ptr_t.
* dyn_load.c [ANY_MSWIN && !THREADS] (GC_cond_add_roots): Change type
of stack_top local variable from char* to ptr_t.
* dyn_load.c [ANY_MSWIN] (GC_register_dynamic_libraries): Change type
of p local variable from PVOID to ptr_t; change type of base, limit,
new_limit local variables from char* to ptr_t.
* dyn_load.c [ANY_MSWIN && MSWINCE] (GC_register_dynamic_libraries):
Use PTR_ALIGN_UP().
* include/private/gcconfig.h (PTR_ALIGN_DOWN): New macro.
* include/private/gcconfig.h (PTRT_ROUNDUP_BY_MASK): Define
PTR_ALIGN_UP() macro instead.
* mark.c (GC_push_all_eager, GC_push_all_stack): Change type of lim
local variable from word* to ptr_t.
* misc.c (GC_base): Declare limit and sz local variables at the
beginning of the function.
* os_dep.c [OPENBSD] (GC_skip_hole_openbsd): Change type of pgsz local
variable from word to size_t.
  • Loading branch information
ivmai committed Mar 23, 2024
1 parent 3e2a56d commit 787f116
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 147 deletions.
5 changes: 3 additions & 2 deletions allchblk.c
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,8 @@ static GC_bool next_hblk_fits_better(hdr *hhdr, word size_avail,
static struct hblk *find_nonbl_hblk(struct hblk *last_hbp, word size_remain,
word eff_size_needed, size_t align_m1)
{
word search_end = ((word)last_hbp + size_remain) & ~(word)align_m1;
ptr_t search_end = PTR_ALIGN_DOWN((ptr_t)last_hbp + size_remain,
align_m1 + 1);

do {
struct hblk *next_hbp;
Expand All @@ -786,7 +787,7 @@ static struct hblk *find_nonbl_hblk(struct hblk *last_hbp, word size_remain,
next_hbp = GC_is_black_listed(last_hbp, eff_size_needed);
if (NULL == next_hbp) return last_hbp; /* not black-listed */
last_hbp = next_hbp;
} while ((word)last_hbp <= search_end);
} while ((word)last_hbp <= (word)search_end);
return NULL;
}

Expand Down
82 changes: 38 additions & 44 deletions dyn_load.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,8 @@ STATIC GC_has_static_roots_func GC_has_static_roots = 0;
}
if (cachedResult == 0) {
int tag;
for( dp = ((ElfW(Dyn) *)(&_DYNAMIC)); (tag = dp->d_tag) != 0; dp++ ) {

for (dp = ((ElfW(Dyn) *)(&_DYNAMIC)); (tag = dp->d_tag) != 0; dp++) {
if (tag == DT_DEBUG) {
struct r_debug *rd = (struct r_debug *)dp->d_un.d_ptr;
if (rd != NULL) {
Expand All @@ -223,17 +224,15 @@ STATIC GC_has_static_roots_func GC_has_static_roots = 0;
char * start;
int i;

e = (ElfW(Ehdr) *) lm->l_addr;
e = (ElfW(Ehdr) *)lm->l_addr;
p = ((ElfW(Phdr) *)(((char *)(e)) + e->e_phoff));
offset = ((unsigned long)(lm->l_addr));
for( i = 0; i < (int)e->e_phnum; i++, p++ ) {
switch( p->p_type ) {
for (i = 0; i < (int)e->e_phnum; i++, p++) {
switch (p->p_type) {
case PT_LOAD:
{
if( !(p->p_flags & PF_W) ) break;
start = ((char *)(p->p_vaddr)) + offset;
GC_add_roots_inner(start, start + p->p_memsz, TRUE);
}
if (!(p->p_flags & PF_W)) break;
start = (char *)(p->p_vaddr) + offset;
GC_add_roots_inner(start, start + p->p_memsz, TRUE);
break;
default:
break;
Expand Down Expand Up @@ -494,7 +493,7 @@ STATIC int GC_register_dynlib_callback(struct dl_phdr_info * info,
/* probably, we should remove the corresponding assertion */
/* check in GC_add_roots_inner along with this code line. */
/* start pointer value may require aligning. */
start = (ptr_t)((word)start & ~(word)(sizeof(word)-1));
start = PTR_ALIGN_DOWN(start, sizeof(ptr_t));
# endif
if (n_load_segs >= MAX_LOAD_SEGS) {
if (!load_segs_overflow) {
Expand All @@ -506,8 +505,8 @@ STATIC int GC_register_dynlib_callback(struct dl_phdr_info * info,
} else {
load_segs[n_load_segs].start = start;
load_segs[n_load_segs].end = end;
load_segs[n_load_segs].start2 = 0;
load_segs[n_load_segs].end2 = 0;
load_segs[n_load_segs].start2 = NULL;
load_segs[n_load_segs].end2 = NULL;
++n_load_segs;
}
# else
Expand All @@ -534,8 +533,8 @@ STATIC int GC_register_dynlib_callback(struct dl_phdr_info * info,
if (load_segs[j].start2 != 0) {
WARN("More than one GNU_RELRO segment per load one\n",0);
} else {
GC_ASSERT((word)end <=
(word)PTRT_ROUNDUP_BY_MASK(load_segs[j].end, GC_page_size-1));
GC_ASSERT((word)end
<= (word)PTR_ALIGN_UP(load_segs[j].end, GC_page_size));
/* Remove from the existing load segment. */
load_segs[j].end2 = load_segs[j].end;
load_segs[j].end = start;
Expand Down Expand Up @@ -725,7 +724,7 @@ GC_FirstDLOpenedLinkMap(void)
ElfW(Dyn) *dp;
int tag;

for( dp = _DYNAMIC; (tag = dp->d_tag) != 0; dp++ ) {
for (dp = _DYNAMIC; (tag = dp->d_tag) != 0; dp++) {
if (tag == DT_DEBUG) {
struct r_debug *rd = (struct r_debug *)dp->d_un.d_ptr;
/* d_ptr could be null if libs are linked statically. */
Expand Down Expand Up @@ -760,21 +759,19 @@ GC_INNER void GC_register_dynamic_libraries(void)
char * start;
int i;

e = (ElfW(Ehdr) *) lm->l_addr;
e = (ElfW(Ehdr) *)lm->l_addr;
# ifdef HOST_ANDROID
if (e == NULL)
continue;
# endif
p = ((ElfW(Phdr) *)(((char *)(e)) + e->e_phoff));
offset = ((unsigned long)(lm->l_addr));
for( i = 0; i < (int)e->e_phnum; i++, p++ ) {
switch( p->p_type ) {
for (i = 0; i < (int)e->e_phnum; i++, p++) {
switch (p->p_type) {
case PT_LOAD:
{
if( !(p->p_flags & PF_W) ) break;
start = ((char *)(p->p_vaddr)) + offset;
GC_add_roots_inner(start, start + p->p_memsz, TRUE);
}
if (!(p->p_flags & PF_W)) break;
start = (char *)(p->p_vaddr) + offset;
GC_add_roots_inner(start, start + p->p_memsz, TRUE);
break;
default:
break;
Expand Down Expand Up @@ -921,20 +918,20 @@ GC_INNER void GC_register_dynamic_libraries(void)
#ifdef ANY_MSWIN
/* We traverse the entire address space and register all segments */
/* that could possibly have been written to. */
STATIC void GC_cond_add_roots(char *base, char * limit)
STATIC void GC_cond_add_roots(ptr_t base, ptr_t limit)
{
# ifdef THREADS
char * curr_base = base;
char * next_stack_lo;
char * next_stack_hi;
# else
char * stack_top;
ptr_t stack_top;
# endif

GC_ASSERT(I_HOLD_LOCK());
if (base == limit) return;
# ifdef THREADS
for(;;) {
for (;;) {
GC_get_next_stack(curr_base, limit, &next_stack_lo, &next_stack_hi);
if ((word)next_stack_lo >= (word)limit) break;
if ((word)next_stack_lo > (word)curr_base)
Expand All @@ -944,8 +941,8 @@ GC_INNER void GC_register_dynamic_libraries(void)
if ((word)curr_base < (word)limit)
GC_add_roots_inner(curr_base, limit, TRUE);
# else
stack_top = (char *)((word)GC_approx_sp() &
~(word)(GC_sysinfo.dwAllocationGranularity - 1));
stack_top = PTR_ALIGN_DOWN(GC_approx_sp(),
GC_sysinfo.dwAllocationGranularity);
if ((word)limit > (word)stack_top
&& (word)base < (word)GC_stackbottom) {
/* Part of the stack; ignore it. */
Expand Down Expand Up @@ -996,31 +993,28 @@ GC_INNER void GC_register_dynamic_libraries(void)
{
MEMORY_BASIC_INFORMATION buf;
DWORD protect;
LPVOID p;
char * base;
char * limit, * new_limit;
ptr_t p, base, limit, new_limit;

GC_ASSERT(I_HOLD_LOCK());
# ifdef MSWIN32
if (GC_no_win32_dlls) return;
# endif
p = GC_sysinfo.lpMinimumApplicationAddress;
base = limit = (char *)p;
p = (ptr_t)GC_sysinfo.lpMinimumApplicationAddress;
base = limit = p;
while ((word)p < (word)GC_sysinfo.lpMaximumApplicationAddress) {
size_t result = VirtualQuery(p, &buf, sizeof(buf));
size_t result = VirtualQuery((LPVOID)p, &buf, sizeof(buf));

# ifdef MSWINCE
if (result == 0) {
/* Page is free; advance to the next possible allocation base */
new_limit = (char *)(((word)p + GC_sysinfo.dwAllocationGranularity)
& ~(GC_sysinfo.dwAllocationGranularity-1));
if (0 == result) {
/* Page is free; advance to the next possible allocation base. */
new_limit = PTR_ALIGN_UP(p + 1,
GC_sysinfo.dwAllocationGranularity);
} else
# endif
/* else */ {
if (result != sizeof(buf)) {
if (result != sizeof(buf))
ABORT("Weird VirtualQuery result");
}
new_limit = (char *)p + buf.RegionSize;
new_limit = p + buf.RegionSize;
protect = buf.Protect;
if (buf.State == MEM_COMMIT
&& (protect == PAGE_EXECUTE_READWRITE
Expand All @@ -1042,15 +1036,15 @@ GC_INNER void GC_register_dynamic_libraries(void)
# ifdef DEBUG_VIRTUALQUERY
GC_dump_meminfo(&buf);
# endif
if ((char *)p != limit) {
if (p != limit) {
GC_cond_add_roots(base, limit);
base = (char *)p;
base = p;
}
limit = new_limit;
}
}
if ((word)p > (word)new_limit /* overflow */) break;
p = (LPVOID)new_limit;
p = new_limit;
}
GC_cond_add_roots(base, limit);
}
Expand Down
19 changes: 9 additions & 10 deletions include/private/gc_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -974,25 +974,24 @@ EXTERN_C_BEGIN
#define CPP_MAXOBJGRANULES BYTES_TO_GRANULES(CPP_MAXOBJBYTES)
#define MAXOBJGRANULES ((size_t)CPP_MAXOBJGRANULES)

# define divHBLKSZ(n) ((n) >> LOG_HBLKSIZE)
#define divHBLKSZ(n) ((n) >> LOG_HBLKSIZE)

# define HBLK_PTR_DIFF(p,q) divHBLKSZ((ptr_t)p - (ptr_t)q)
#define HBLK_PTR_DIFF(p,q) divHBLKSZ((ptr_t)p - (ptr_t)q)
/* Equivalent to subtracting 2 hblk pointers. */
/* We do it this way because a compiler should */
/* find it hard to use an integer division */
/* instead of a shift. The bundled SunOS 4.1 */
/* o.w. sometimes pessimizes the subtraction to */
/* involve a call to .div. */
/* otherwise sometimes pessimizes the */
/* subtraction to involve a call to .div. */

# define modHBLKSZ(n) ((n) & (HBLKSIZE-1))
#define modHBLKSZ(n) ((n) & (HBLKSIZE-1))

# define HBLKPTR(objptr) ((struct hblk *)(((word)(objptr)) \
& ~(word)(HBLKSIZE-1)))
# define HBLKDISPL(objptr) modHBLKSZ((size_t)(objptr))
#define HBLKPTR(objptr) ((struct hblk *)PTR_ALIGN_DOWN(objptr, HBLKSIZE))
#define HBLKDISPL(objptr) modHBLKSZ((size_t)(objptr))

/* Same as HBLKPTR() but points to the first block in the page. */
# define HBLK_PAGE_ALIGNED(objptr) \
((struct hblk *)(((word)(objptr)) & ~(word)(GC_page_size-1)))
#define HBLK_PAGE_ALIGNED(objptr) \
((struct hblk *)PTR_ALIGN_DOWN(objptr, GC_page_size))

/* Round up allocation size (in bytes) to a multiple of a granule. */
#define ROUNDUP_GRANULE_SIZE(lb) /* lb should have no side-effect */ \
Expand Down
30 changes: 16 additions & 14 deletions include/private/gcconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -798,8 +798,10 @@ EXTERN_C_BEGIN
# define GC_GLIBC_PREREQ(major, minor) 0 /* FALSE */
#endif

#define PTRT_ROUNDUP_BY_MASK(p, mask) \
((ptr_t)(((word)(p) + (mask)) & ~(word)(mask)))
/* Align a ptr_t pointer down/up to a given boundary. */
#define PTR_ALIGN_DOWN(p, b) ((ptr_t)((word)(p) & ~(word)((b)-1)))
#define PTR_ALIGN_UP(p, b) \
((ptr_t)(((word)(p) + (word)((b)-1)) & ~(word)((b)-1)))

/* If available, we can use __builtin_unwind_init() to push the */
/* relevant registers onto the stack. */
Expand Down Expand Up @@ -1133,7 +1135,7 @@ EXTERN_C_BEGIN
# endif
# else
extern int etext[];
# define DATASTART PTRT_ROUNDUP_BY_MASK(etext, 0xfff)
# define DATASTART PTR_ALIGN_UP(etext, 0x1000)
# endif
# endif
# ifdef AMIGA
Expand Down Expand Up @@ -1379,12 +1381,12 @@ EXTERN_C_BEGIN
# ifdef SEQUENT
# define OS_TYPE "SEQUENT"
extern int etext[];
# define DATASTART PTRT_ROUNDUP_BY_MASK(etext, 0xfff)
# define DATASTART PTR_ALIGN_UP(etext, 0x1000)
# define STACKBOTTOM ((ptr_t)0x3ffff000)
# endif
# ifdef HAIKU
extern int etext[];
# define DATASTART PTRT_ROUNDUP_BY_MASK(etext, 0xfff)
# define DATASTART PTR_ALIGN_UP(etext, 0x1000)
# endif
# ifdef HURD
/* Nothing specific. */
Expand All @@ -1409,8 +1411,8 @@ EXTERN_C_BEGIN
# ifdef SCO
# define OS_TYPE "SCO"
extern int etext[];
# define DATASTART (PTRT_ROUNDUP_BY_MASK(etext, 0x3fffff) \
+ ((word)(etext) & 0xfff))
# define DATASTART (PTR_ALIGN_UP(etext, 0x400000) \
+ ((word)(etext) & 0xfff))
# define STACKBOTTOM ((ptr_t)0x7ffffffc)
# endif
# ifdef SCO_ELF
Expand Down Expand Up @@ -1467,7 +1469,7 @@ EXTERN_C_BEGIN
# endif
# else
extern int etext[];
# define DATASTART PTRT_ROUNDUP_BY_MASK(etext, 0xfff)
# define DATASTART PTR_ALIGN_UP(etext, 0x1000)
# endif
# ifdef USE_I686_PREFETCH
# define PREFETCH(x) \
Expand Down Expand Up @@ -1546,7 +1548,7 @@ EXTERN_C_BEGIN
extern int etext[];
extern int _stklen;
extern int __djgpp_stack_limit;
# define DATASTART PTRT_ROUNDUP_BY_MASK(etext, 0x1ff)
# define DATASTART PTR_ALIGN_UP(etext, 0x200)
/* #define STACKBOTTOM ((ptr_t)((word)_stubinfo+_stubinfo->size+_stklen)) */
# define STACKBOTTOM ((ptr_t)((word)__djgpp_stack_limit + _stklen))
/* This may not be right. */
Expand Down Expand Up @@ -1679,13 +1681,13 @@ EXTERN_C_BEGIN
extern int end[];
# endif
extern int _DYNAMIC_LINKING[], _gp[];
# define DATASTART (PTRT_ROUNDUP_BY_MASK(etext, 0x3ffff) \
+ ((word)(etext) & 0xffff))
# define DATASTART (PTR_ALIGN_UP(etext, 0x40000) \
+ ((word)(etext) & 0xffff))
# define DATAEND ((ptr_t)(edata))
# define GC_HAVE_DATAREGION2
# define DATASTART2 (_DYNAMIC_LINKING \
? PTRT_ROUNDUP_BY_MASK((word)_gp + 0x8000, 0x3ffff) \
: (ptr_t)edata)
? PTR_ALIGN_UP((ptr_t)_gp + 0x8000, 0x40000) \
: (ptr_t)edata)
# define DATAEND2 ((ptr_t)(end))
# endif
# endif
Expand Down Expand Up @@ -1988,7 +1990,7 @@ EXTERN_C_BEGIN
extern int etext[];
# ifdef CX_UX
# define OS_TYPE "CX_UX"
# define DATASTART (PTRT_ROUNDUP_BY_MASK(etext, 0x3fffff) + 0x10000)
# define DATASTART (PTR_ALIGN_UP(etext, 0x400000) + 0x10000)
# endif
# ifdef DGUX
# define OS_TYPE "DGUX"
Expand Down

0 comments on commit 787f116

Please sign in to comment.