This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: master: Build failure in malloc with GCC 7
- From: DJ Delorie <dj at redhat dot com>
- To: Florian Weimer <fweimer at redhat dot com>
- Cc: schwab at suse dot de, libc-alpha at sourceware dot org, carlos at redhat dot com
- Date: Wed, 12 Jul 2017 18:43:08 -0400
- Subject: Re: master: Build failure in malloc with GCC 7
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dj at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 96C7480F6D
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 96C7480F6D
I tested this patch and can measure no discernable performance
difference, so LGTM :-)
Florian Weimer <fweimer@redhat.com> writes:
> diff --git a/malloc/malloc.c b/malloc/malloc.c
> index 54e406b..da7876a 100644
> --- a/malloc/malloc.c
> +++ b/malloc/malloc.c
> @@ -1658,6 +1658,9 @@ typedef struct malloc_chunk *mfastbinptr;
> #define arena_is_corrupt(A) (((A)->flags & ARENA_CORRUPTION_BIT))
> #define set_arena_corrupt(A) ((A)->flags |= ARENA_CORRUPTION_BIT)
>
> +/* Maximum size of memory handled in fastbins. */
> +static INTERNAL_SIZE_T global_max_fast;
> +
> /*
> Set value of max_fast.
> Use impossibly small value if 0.
> @@ -1668,8 +1671,20 @@ typedef struct malloc_chunk *mfastbinptr;
> #define set_max_fast(s) \
> global_max_fast = (((s) == 0) \
> ? SMALLBIN_WIDTH : ((s + SIZE_SZ) & ~MALLOC_ALIGN_MASK))
> -#define get_max_fast() global_max_fast
>
> +static inline INTERNAL_SIZE_T
> +get_max_fast (void)
> +{
> + /* Tell the glibc optimizers that global_max_fast is never larger
> + than MAX_FAST_SIZE. This avoids out-of-bounds array accesses in
> + _int_malloc after constant propagation of the size parameter.
> + (The code never executes because malloc preserves the
> + global_max_fast invariant, but the optimizers may not recognize
> + this.) */
> + if (global_max_fast > MAX_FAST_SIZE)
> + __builtin_unreachable ();
> + return global_max_fast;
> +}
>
> /*
> ----------- Internal state representation and initialization -----------
> @@ -1797,9 +1812,6 @@ static struct malloc_par mp_ =
> #endif
> };
>
> -/* Maximum size of memory handled in fastbins. */
> -static INTERNAL_SIZE_T global_max_fast;
> -
> /*
> Initialize a malloc_state struct.
>