On Thu, 16 Sep 2021, Jakub Jelinek wrote:

> On Thu, Sep 16, 2021 at 12:41:20PM +0200, Richard Biener wrote:
> > On Thu, 16 Sep 2021, Jakub Jelinek wrote:
> > 
> > > On Thu, Sep 16, 2021 at 11:48:49AM +0200, Richard Biener via Gcc-patches 
> > > wrote:
> > > > 2021-09-16  Richard Biener  <rguent...@suse.de>
> > > > 
> > > >         PR middle-end/102360
> > > >         * internal-fn.c (expand_DEFERRED_INIT): Make pattern-init
> > > >         of non-memory more robust.
> > > > 
> > > >         * g++.dg/pr102360.C: New testcase.
> > > > +         if (can_native_interpret_type_p (var_type))
> > > > +           init = native_interpret_expr (var_type, buf, total_bytes);
> > > > +         else
> > > > +           {
> > > > +             tree itype = build_nonstandard_integer_type (total_bytes 
> > > > * 8, 1);
> > > 
> > > Shouldn't that 8 be BITS_PER_UNIT ?
> > > I know we have tons of problems with BITS_PER_UNIT is not 8, but adding
> > > further ones is unnecessary.
> > 
> > Well, a byte is 8 bits and we do
> > 
> >       unsigned HOST_WIDE_INT total_bytes
> >         = tree_to_uhwi (TYPE_SIZE_UNIT (var_type));
> > 
> >       if (init_type == AUTO_INIT_PATTERN)
> >         {
> >           unsigned char *buf = (unsigned char *) xmalloc (total_bytes);
> >           memset (buf, INIT_PATTERN_VALUE, total_bytes);
> > 
> > and thus mix host and target here.  I suppose it should be instead
> > 
> >    unsigned HOST_WIDE_INT total_bytes
> >      = tree_to_uhwi (TYPE_SIZE (var_type)) / (BITS_PER_UNIT / 8);
> > 
> > or so...  in this light * 8 for the build_nonstandard_integer_type
> > use is correct, no?  If total_bytes is really _bytes_.
> 
> Typically for the native_interpret/native_encode we punt if
> BITS_PER_UNIT != 8 || CHAR_BIT != 8 because nobody had the energy
> to deal with the weird platforms (especially if we have currently
> none, I believe dsp16xx that had 16-bit bytes had been removed in 4.0
> and c4x that had 32-bit bytes had been removed in 4.3)
> - dunno if the DEFERRED_INIT etc. code has those guards or not
> and it clearly documents that this code is not ready for other
> configurations.
> A byte is not necessarily 8 bits, that is just the most common
> size for it, and TYPE_SIZE_UNIT is number of BITS_PER_UNIT bit units.

OK, I'll do s/8/BITS_PER_UNIT/ - I also see that we have
int_size_in_bytes returning TYPE_SIZE_UNIT and that TYPE_SIZE_UNIT
is documented to yeild the type size in 'bytes'.

I do believe that we should officially declare hosts with CHAR_BIT != 8
as unsupported and as you say support for targets with BITS_PER_UNIT != 8
is likely bit-rotten.

Richard.

Reply via email to