[alsa-devel] [PATCH] Sample generation on big endian platforms was broken.

Takashi Iwai tiwai at suse.de
Fri Jul 3 18:59:59 CEST 2009


At Fri, 03 Jul 2009 17:58:50 +0200,
Kenneth Johansson wrote:
> 
> On Fri, 2009-07-03 at 17:28 +0200, Takashi Iwai wrote:
> > At Fri, 03 Jul 2009 17:11:37 +0200,
> > Kenneth Johansson wrote:
> > > 
> > > On Fri, 2009-07-03 at 17:00 +0200, Takashi Iwai wrote:
> > > > At Fri, 03 Jul 2009 16:51:35 +0200,
> > > > Kenneth Johansson wrote:
> > > > > 
> > > > > On Fri, 2009-07-03 at 16:39 +0200, Takashi Iwai wrote:
> > > > > > At Fri, 03 Jul 2009 16:19:31 +0200,
> > > > > > Kenneth Johansson wrote:
> > > > > > > 
> > > > > > > Has not worked since commit 3d1fa924906996463ac33cba5b5143f762d913cf
> > > > > > > 
> > > > > > > Signed-off-by: Kenneth Johansson <kenneth at southpole.se>
> > > > > > 
> > > > > > Hrm, sorry, but your version is also broken as doing type-punning.
> > > > > > The code has to be rewritten completely...
> > > > > > 
> > > > > > 
> > > > > > Takashi
> > > > > 
> > > > > hmm I think you have to explain this. now it works on both little/big
> > > > > endian without any explicit byte moves.
> > > > > 
> > > > > It did not understand what problem you see.
> > > > 
> > > > You can't cast from a char pointer to another type (e.g. short) and
> > > > read the value.  This is called "type-punning" and doesn't work
> > > > properly with the recent GCC (depending on the optimization and
> > > > code parsing) since it handles strict-aliasing.
> > > > 
> > > > See GCC info for details.
> > > > 
> > > > 
> > > > Takashi
> > > 
> > > But there is no aliasing problem in that code. The memory is only
> > > accessed(written in this case) using one type.
> > 
> > One type?
> > 
> > +			switch(bps){
> > +			case 1:
> > +				*(samples[chn]) = res;
> > +				break;
> > +			case 2:
> > +				*(short*)(samples[chn]) = res;
> > +				break;
> > +			case 4:
> > +				*(int*)(samples[chn]) = res;
> > +			}
> 
> But only one of them will ever be used. whenever this function is
> entered the pointer is only using one type ever. the memory is never
> accessed with any other type and it's only using this one pointer. 

Hrm, OK, that makes sense.

> What exactly do you think the compiler can do ?? it's not like it can
> cache the samples[chn] value that is the char pointer and make a
> constant pointer out of it. There is no mixed type accesses. 
> 
> Aliasing happens when two pointers of different type point to the same
> memory. then you can have funny things happening if you access the
> memory from the two pointers. 
> 
> There is no pointer aliasing here there is only one pointer. We just
> change the type of this one pointer in the one place it's used.
> 
> Is it aliasing with itself ? would the write magically happen in some
> other size or not at all what ??  
> 
> could you point me to some documentation for this I'm not getting it.

Maybe my unneeded concern.  But still your patch breaks the 3-byte
format, so it causes another regression.


Takashi


More information about the Alsa-devel mailing list