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

Kenneth Johansson kenneth at southpole.se
Fri Jul 3 17:58:50 CEST 2009


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. 

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.






More information about the Alsa-devel mailing list