David Brownell wrote:
> On Wednesday 07 February 2007 3:04 am, Phil Endecott wrote:
>> I won't pretend to understand all the subtleties of 
>> __attribute__((packed)), but I did learn something about it when I 
>> hacked USB/IP to run on ARM, for the NSLU2, last year.  The issue 
>> boiled down to this:
>> 
>> struct S {
>>    int intfield;
>>    char charfield;
>> } /* maybe add: __attribute__((packed)) here */ ;
>> 
>> f(struct S * s) {
>>    ...
>>    (s->intfield)++;
>>    ...
>> }
>> 
>> ...
>> 
>> What happens when we add __attribute__((packed)) to struct S?  ...
>> will work, but a lot more slowly.  However, the ++ in f() WILL NOT 
>> WORK!  The compiler assumes that the pointer that is passed IS 
>> NATURALLY ALIGNED, and when you pass an unaligned pointer from g() IT 
>> DOES NOT ISSUE A WARNING!  
>
> Looks like a bug in your version of the toolchain.  I just tried
> this not a minute ago (gcc 3.4.3) and it works correctly:  not only
> do both versions of the function handle the "intfield" misaligned
> for loads, they also do so for the store.

Err, maybe my example was over-simplified then, sorry.  Try another 
level of indirection:

void inc(int* i) {
   (*i)++;
}

void f(struct S* s) {
   inc(&(s->intfield);
}


Please look in the gcc-help archives for December and search for my 
name; you'll find a long thread where I slowly come to understand how 
this works (or rather how it doesn't work and how it doesn't warn you 
that it's not going to work).  I believe that the people that I was 
corresponding with know what they are talking about.  In particular, 
here's a quote from Paul Brook 
(http://gcc.gnu.org/ml/gcc-help/2006-12/msg00115.html):

   " the compiler is allowed to assume that the low 2 bits of an int* 
are zero. "


Phil.





-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to