Solaris2 trunk failure w/C_alloca in gencodes

Billinghurst, David (CRTS) David.Billinghurst@riotinto.com
Tue Jul 3 06:57:00 GMT 2001


I don't think this patch was committed.  It works on irix6.5

> -----Original Message-----
> From:	Kaveh R. Ghazi [SMTP:ghazi@caip.rutgers.edu]
> Sent:	Monday, June 18, 2001 12:57 PM
> To:	dan@www.cgsoftware.com
> Cc:	Billinghurst, David (CRTS); gcc-bugs@gcc.gnu.org;
> gcc-patches@gcc.gnu.org; meissner@cygnus.com
> Subject:	Solaris2 trunk failure w/C_alloca in gencodes
> 
>  > 2001-06-16  Daniel Berlin  <dan@cgsoftware.com>
>  > 
>  >      * bitmap.h: Add dump_bitmap, bitmap_zero, bitmap_union_of_diffs,
>  >      bitmap_a_or_b, bitmap_a_and_b, bitmap_first_set_bit,
>  >      bitmap_last_set_bit. All for compatibility with sbitmap's.
>  > 
>  >      *bitmap.c (bitmap_zero): New function.
>  >      (bitmap_union_of_diffs): New function.
>  >      (bitmap_first_set_bit): New function.
>  >      (bitmap_last_set_bit): New function.
> 
> The above patch breaks the trunk on solaris2 (and probably others)
> when using cc for stage1.  (E.g. David noted it on irix6.5.)  Here's
> the failure:
> 
>  > cc -DIN_GCC -g -DHAVE_CONFIG_H -DGENERATOR_FILE -o gencodes \
>  >  gencodes.o rtl.o bitmap.o ggc-none.o gensupport.o hashtab.o
>  >  safe-ctype.o print-rtl.o errors.o ` case "obstack.o" in ?*) echo
>  >  obstack.o ;; esac ` ` case "" in ?*) echo ;; esac ` ` case "" in ?*)
>  >  echo ;; esac ` ` case "" in ?*) echo ;; esac `
>  > ild: (undefined symbol) C_alloca -- referenced in the text segment of
>  >      bitmap.o
>  > make.solaris2[2]: *** [gencodes] Error 5
> 
> There are two problems.
> 
> First, the patch uses alloca in bitmap.c.  Any file like bitmap.c
> which is used on both host and build platforms cannot use alloca since
> we don't link against libiberty for "build" programs to obtain
> C_alloca().  That's the cause of the failure above.
> 
> The second, more insidious, problem is this definition from bitmap.h:
> 
>  > /* Allocate a bitmap with alloca.  */
>  > #define BITMAP_ALLOCA()                                         \
>  >   bitmap_initialize ((bitmap) alloca (sizeof (bitmap_head)))
> 
> IIRC, passing alloca as an argument of a function is not guaranteed to
> work in all cases on all platforms, even when only using gcc.  Mixing
> in other stage1 compiler's alloca implementations is only worse.
> 
> (Side note: I wish gcc would warn whenever someone does this.  Maybe
> something for the "projects" list.)
> 
> Anyway, I don't think the definition of BITMAP_ALLOCA came from Dan's
> patch, but using it did.  We should change bitmap_union_of_diff() so
> that it doesn't use alloca, *and* we should change BITMAP_ALLOCA so
> that it doesn't pass alloca as a function argument.  Note Dan's usage
> of BITMAP_ALLOCA was the only one appearing in gcc sources at the
> moment.
> 
> 
> Here's an untested patch which does this.  Unfortunately solaris2
> doesn't bootstrap on the trunk for other reasons at the moment noted
> here: http://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00842.html
> 
> Also I'll be away for a week starting Monday, so I won't be able to
> test and/or checkin this patch until the following weekend at the
> earliest (if the other solaris2 problem is fixed by then.)  If someone
> else (Dan?) could spin this on something other than solaris2 and check
> it in when approved I'd appreciate it.
> 
> 		Thanks,
> 		--Kaveh
> 
> 
> 2001-06-17  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
> 
> 	* bitmap.c (bitmap_union_of_diff): Don't use BITMAP_ALLOCA.
> 
> 	* bitmap.h (BITMAP_ALLOCA): Don't pass alloca as an argument to a
> 	function.
> 
> diff -rup orig/egcs-CVS20010617/gcc/bitmap.c egcs-CVS20010617/gcc/bitmap.c
> --- orig/egcs-CVS20010617/gcc/bitmap.c	Sat Jun 16 16:30:14 2001
> +++ egcs-CVS20010617/gcc/bitmap.c	Sun Jun 17 22:11:56 2001
> @@ -687,9 +687,11 @@ bitmap_union_of_diff (dst, a, b, c)
>       bitmap c;
>  {
>    int changed = 0;
> -  bitmap temp = BITMAP_ALLOCA ();
> +  bitmap temp = BITMAP_XMALLOC ();
> +  
>    bitmap_operation (temp, b, c, BITMAP_AND_COMPL);
>    changed = bitmap_operation (dst, temp, a, BITMAP_IOR);
> +  BITMAP_XFREE (temp);
>    return changed;
>  }
>  
> diff -rup orig/egcs-CVS20010617/gcc/bitmap.h egcs-CVS20010617/gcc/bitmap.h
> --- orig/egcs-CVS20010617/gcc/bitmap.h	Sat Jun 16 16:30:14 2001
> +++ egcs-CVS20010617/gcc/bitmap.h	Sun Jun 17 22:09:50 2001
> @@ -119,10 +119,17 @@ extern int bitmap_last_set_bit PARAMS((b
>  #define BITMAP_OBSTACK_ALLOC(OBSTACK)				\
>    bitmap_initialize ((bitmap) obstack_alloc (OBSTACK, sizeof
> (bitmap_head)))
>  
> -/* Allocate a bitmap with alloca.  */
> -#define BITMAP_ALLOCA()						\
> -  bitmap_initialize ((bitmap) alloca (sizeof (bitmap_head)))
> -
> +/* Allocate a bitmap with alloca.  Note alloca cannot be passed as an
> +   argument to a function, so we set a temporary variable to the value
> +   returned by alloca and pass that variable to bitmap_initialize().
> +   PTR is then set to the value returned from bitmap_initialize() to
> +   avoid having it appear more than once in case it has side effects.  */
> +#define BITMAP_ALLOCA(PTR) \
> +do { \
> +  bitmap temp_bitmap_ = (bitmap) alloca (sizeof (bitmap_head)); \
> +  (PTR) = bitmap_initialize (temp_bitmap_); \
> +} while (0)
> +  
>  /* Allocate a bitmap with xmalloc.  */
>  #define BITMAP_XMALLOC()                                        \
>    bitmap_initialize ((bitmap) xmalloc (sizeof (bitmap_head)))



More information about the Gcc-patches mailing list