Hi Devang,

> > I can't help feeling that a bitfield load or store should touch the
> > minimum amount of bytes possible: only those that contain some part
> > of the bitfield.  In some situations touching other bytes could be
> > fatal, for example if the type is overlaid on some memory mapped io
> > region, or multiple threads are accessing different parts of the
> > type simulteneously.
>
> I do not think this is required as part of current C ABI. This is  
> responsibility of programmer who is using threading.

the current LLVM implementation means that anyone using threading needs
to not do bitfield accesses, since the compiler generated code could
cause trouble.  Are you suggesting that users should roll their own
bitfield code (I'm not saying that this is unreasonable)?

> >  In the above example you could try accessing
> > d using 4 bytes starting from b, but this would give wrong results
> > if some other thread was accessing b at the same time.  I'm fairly
> > sure that Ada has quite strict requirements about this, and I have
> > the vague idea (I don't know where I got it from) that there is talk
> > of requiring a minimum disturbance rule of some kind in C.
> 
> However what about huge amount of existing C code and other tools that  
> do not enforce this ?

I don't understand what you mean: I'm talking about making the compiler
more strict in the code it generates for bitfield accesses.  As such it
cannot have any impact on correctness of existing C code (though it might
make it run more slowly).

As for Ada, the mainline front-end seems to claim that two record fields
that do not share a common byte can be safely accessed by multiple threads
without synchronization [*].  So it seems that the Ada f-e at least would
like bitfield accesses to only touch the minimum number of bytes.  By
implication it means that gcc bitfield accesses have this property (I will
do some experiments to check).

Ciao,

Duncan.

[*] The language reference manual says (9.10 Shared Variables):
"If two different objects, including nonoverlapping parts of the same object,
are independently addressable, they can be manipulated concurrently by two
different tasks without synchronization. Normally, any two nonoverlapping 
objects
are independently addressable. However, if packing, record layout, or 
Component_Size
is specified for a given composite object, then it is implementation defined 
whether
or not two nonoverlapping parts of that composite object are independently 
addressable."

Thus it is implementation defined whether two bitfield accesses are 
independently
addressable (this falls under the record layout exception).  However 
implementations
are required to document how they define implementation defined things.  The 
documentation
for the gcc Ada front-end says:

"27. Whether or not two non overlapping parts of a composite object are 
independently
addressable, in the case where packing, record layout, or Component_Size is 
specified
for the object. See 9.10(1). Separate components are independently addressable 
if they
do not share overlapping storage units."

A storage unit is Ada terminology for a byte.

_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to