From patchwork Fri Jul 1 18:31:05 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Koenig X-Patchwork-Id: 102944 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id E4F32B741E for ; Sat, 2 Jul 2011 04:31:32 +1000 (EST) Received: (qmail 10389 invoked by alias); 1 Jul 2011 18:31:30 -0000 Received: (qmail 10364 invoked by uid 22791); 1 Jul 2011 18:31:27 -0000 X-SWARE-Spam-Status: No, hits=-1.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cc-smtpout2.netcologne.de (HELO cc-smtpout2.netcologne.de) (89.1.8.212) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 01 Jul 2011 18:31:10 +0000 Received: from cc-smtpin2.netcologne.de (cc-smtpin2.netcologne.de [89.1.8.202]) by cc-smtpout2.netcologne.de (Postfix) with ESMTP id 70A5212520; Fri, 1 Jul 2011 20:31:08 +0200 (CEST) Received: from [192.168.0.197] (xdsl-84-44-179-201.netcologne.de [84.44.179.201]) by cc-smtpin2.netcologne.de (Postfix) with ESMTPSA id 0510111E35; Fri, 1 Jul 2011 20:31:05 +0200 (CEST) Message-ID: <4E0E1269.2070007@netcologne.de> Date: Fri, 01 Jul 2011 20:31:05 +0200 From: Thomas Koenig User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.17) Gecko/20110414 SUSE/3.1.10 Thunderbird/3.1.10 MIME-Version: 1.0 To: Janne Blomqvist CC: "fortran@gcc.gnu.org" , gcc-patches Subject: Re: [patch, fortran] Always return malloc(1) for empty arrays in the library References: <4E0A4C94.7030602@netcologne.de> <4E0CBBF3.8040809@netcologne.de> In-Reply-To: Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Am 01.07.2011 14:34, schrieb Janne Blomqvist: > On Thu, Jun 30, 2011 at 21:09, Thomas Koenig wrote: >> Good point. I have done so in the attached patch > > Seems you forgot to attach it.. ;) > Oops, I hadn't realized your crystal ball was broken :-) Is this better? Thomas 2011-06-30 Thomas Koenig * runtime/memory.c (internal_malloc_size): If size is zero or less, allocate a single byte. * m4/pack.m4 (pack_'rtype_code`): Don't check for zero size for the argument of internal_malloc_size. * m4/spread.m4 (spread_'rtype_code`): Likewise. * m4/eoshift1.m4 (eoshift1): Don't allocate twice. Don't check for zero size for the argument of internal_malloc_size. * m4/eoshift3.m4: Don't check for zero size for the argument of internal_malloc_size. * intrinsics/pack_generic.c (pack_internal): Likewise. (pack_s_internal): Likewise. * intrinsics/cshift0.c (cshift0): Likewise. * intrinsics/spread_generic.c (spread_internal): Likewise. * intrinsics/eoshift0.c (eoshift0): Likewise. * intrinsics/eoshift2.c (eoshift2): Likewise. * generated/eoshift1_16.c: Regenerated. * generated/eoshift1_4.c: Regenerated. * generated/eoshift1_8.c: Regenerated. * generated/eoshift3_16.c: Regenerated. * generated/eoshift3_4.c: Regenerated. * generated/eoshift3_8.c: Regenerated. * generated/pack_c10.c: Regenerated. * generated/pack_c16.c: Regenerated. * generated/pack_c4.c: Regenerated. * generated/pack_c8.c: Regenerated. * generated/pack_i16.c: Regenerated. * generated/pack_i1.c: Regenerated. * generated/pack_i2.c: Regenerated. * generated/pack_i4.c: Regenerated. * generated/pack_i8.c: Regenerated. * generated/pack_r10.c: Regenerated. * generated/pack_r16.c: Regenerated. * generated/pack_r4.c: Regenerated. * generated/pack_r8.c: Regenerated. * generated/spread_c10.c: Regenerated. * generated/spread_c16.c: Regenerated. * generated/spread_c4.c: Regenerated. * generated/spread_c8.c: Regenerated. * generated/spread_i16.c: Regenerated. * generated/spread_i1.c: Regenerated. * generated/spread_i2.c: Regenerated. * generated/spread_i4.c: Regenerated. * generated/spread_i8.c: Regenerated. * generated/spread_r10.c: Regenerated. * generated/spread_r16.c: Regenerated. * generated/spread_r4.c: Regenerated. * generated/spread_r8.c: Regenerated. Index: runtime/memory.c =================================================================== --- runtime/memory.c (Revision 175598) +++ runtime/memory.c (Arbeitskopie) @@ -54,8 +54,8 @@ get_mem (size_t n) void * internal_malloc_size (size_t size) { - if (size == 0) - return NULL; + if (unlikely (size <= 0)) + size = 1; return get_mem (size); } Index: m4/pack.m4 =================================================================== --- m4/pack.m4 (Revision 175598) +++ m4/pack.m4 (Arbeitskopie) @@ -167,14 +167,12 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *ar GFC_DIMENSION_SET(ret->dim[0], 0, total-1, 1); ret->offset = 0; + + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (sizeof ('rtype_name`) * total); + if (total == 0) - { - /* In this case, nothing remains to be done. */ - ret->data = internal_malloc_size (1); - return; - } - else - ret->data = internal_malloc_size (sizeof ('rtype_name`) * total); + return; } else { Index: m4/spread.m4 =================================================================== --- m4/spread.m4 (Revision 175598) +++ m4/spread.m4 (Arbeitskopie) @@ -101,13 +101,11 @@ spread_'rtype_code` ('rtype` *ret, const 'rtype` * GFC_DIMENSION_SET(ret->dim[n], 0, ub, stride); } ret->offset = 0; - if (rs > 0) - ret->data = internal_malloc_size (rs * sizeof('rtype_name`)); - else - { - ret->data = internal_malloc_size (1); - return; - } + + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (rs * sizeof('rtype_name`)); + if (rs <= 0) + return; } else { Index: m4/eoshift1.m4 =================================================================== --- m4/eoshift1.m4 (Revision 175598) +++ m4/eoshift1.m4 (Arbeitskopie) @@ -89,7 +89,6 @@ eoshift1 (gfc_array_char * const restrict ret, { int i; - ret->data = internal_malloc_size (size * arraysize); ret->offset = 0; ret->dtype = array->dtype; for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++) @@ -107,10 +106,8 @@ eoshift1 (gfc_array_char * const restrict ret, GFC_DIMENSION_SET(ret->dim[i], 0, ub, str); } - if (arraysize > 0) - ret->data = internal_malloc_size (size * arraysize); - else - ret->data = internal_malloc_size (1); + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (size * arraysize); } else if (unlikely (compile_options.bounds_check)) Index: m4/eoshift3.m4 =================================================================== --- m4/eoshift3.m4 (Revision 175598) +++ m4/eoshift3.m4 (Arbeitskopie) @@ -108,10 +108,8 @@ eoshift3 (gfc_array_char * const restrict ret, GFC_DIMENSION_SET(ret->dim[i], 0, ub, str); } - if (arraysize > 0) - ret->data = internal_malloc_size (size * arraysize); - else - ret->data = internal_malloc_size (1); + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (size * arraysize); } else if (unlikely (compile_options.bounds_check)) Index: intrinsics/pack_generic.c =================================================================== --- intrinsics/pack_generic.c (Revision 175598) +++ intrinsics/pack_generic.c (Arbeitskopie) @@ -153,14 +153,11 @@ pack_internal (gfc_array_char *ret, const gfc_arra GFC_DIMENSION_SET(ret->dim[0], 0, total-1, 1); ret->offset = 0; + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (size * total); + if (total == 0) - { - /* In this case, nothing remains to be done. */ - ret->data = internal_malloc_size (1); - return; - } - else - ret->data = internal_malloc_size (size * total); + return; /* In this case, nothing remains to be done. */ } else { @@ -523,13 +520,10 @@ pack_s_internal (gfc_array_char *ret, const gfc_ar ret->offset = 0; + ret->data = internal_malloc_size (size * total); + if (total == 0) - { - ret->data = internal_malloc_size (1); - return; - } - else - ret->data = internal_malloc_size (size * total); + return; } rstride0 = GFC_DESCRIPTOR_STRIDE_BYTES(ret,0); Index: intrinsics/cshift0.c =================================================================== --- intrinsics/cshift0.c (Revision 175598) +++ intrinsics/cshift0.c (Arbeitskopie) @@ -79,10 +79,8 @@ cshift0 (gfc_array_char * ret, const gfc_array_cha GFC_DIMENSION_SET(ret->dim[i], 0, ub, str); } - if (arraysize > 0) - ret->data = internal_malloc_size (size * arraysize); - else - ret->data = internal_malloc_size (1); + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (size * arraysize); } else if (unlikely (compile_options.bounds_check)) { Index: intrinsics/spread_generic.c =================================================================== --- intrinsics/spread_generic.c (Revision 175598) +++ intrinsics/spread_generic.c (Arbeitskopie) @@ -100,13 +100,10 @@ spread_internal (gfc_array_char *ret, const gfc_ar GFC_DIMENSION_SET(ret->dim[n], 0, ub, stride); } ret->offset = 0; - if (rs > 0) - ret->data = internal_malloc_size (rs * size); - else - { - ret->data = internal_malloc_size (1); - return; - } + ret->data = internal_malloc_size (rs * size); + + if (rs <= 0) + return; } else { Index: intrinsics/eoshift0.c =================================================================== --- intrinsics/eoshift0.c (Revision 175598) +++ intrinsics/eoshift0.c (Arbeitskopie) @@ -86,11 +86,8 @@ eoshift0 (gfc_array_char * ret, const gfc_array_ch } - if (arraysize > 0) - ret->data = internal_malloc_size (size * arraysize); - else - ret->data = internal_malloc_size (1); - + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (size * arraysize); } else if (unlikely (compile_options.bounds_check)) { Index: intrinsics/eoshift2.c =================================================================== --- intrinsics/eoshift2.c (Revision 175598) +++ intrinsics/eoshift2.c (Arbeitskopie) @@ -91,10 +91,8 @@ eoshift2 (gfc_array_char *ret, const gfc_array_cha GFC_DIMENSION_SET(ret->dim[i], 0, ub, str); - if (arraysize > 0) - ret->data = internal_malloc_size (size * arraysize); - else - ret->data = internal_malloc_size (1); + /* internal_malloc_size allocates a single byte for zero size. */ + ret->data = internal_malloc_size (size * arraysize); } }