On Tue, 3 Sep 2013 10:53:10, Richard Biener wrote:
> On Tue, Sep 3, 2013 at 2:05 AM, Bernd Edlinger
> <bernd.edlin...@hotmail.de> wrote:
>> This is a follow-up patch for Sandra Loosemore's patch in this
>> thread: "reimplement -fstrict-volatile-bitfields, v3".
>> It was already posted a few weeks ago, but in the wrong thread.
>> Therfore I re-post it herewith.
>> It was initially suggested by Hans-Peter Nilsson, and I had much
>> help from him in putting everything together. Thanks again H-P.
>> Here is a short specification:
>> The -Wportable-volatility warning is an optional warning, to warn
>> about code for which separate incompatbile definitions on different
>> platforms (or between C and C++) exist even within gcc.
>> It will be usable for driver code you want to be portable on different
>> architectures.
>> This warning should only be emitted if the code is significantly
>> different when -fstrict-volatile-bitfields is used or not.
>> It should not be emitted for the code which is not affected by this
>> option.
>> In other words, it should be emitted on all bit-fields when the
>> definition or the context is volatile, except when the whole
>> structure is not AAPCS ABI compliant, i.e. packed or unaligned.
>> On the other hand you should always get the same
>> warnings if you combine -Wportable-volatility with
>> -fstrict-volatile-bitfields or not. And of course it should not
>> depend on the specific target that is used to compile.
>> I boot-strapped this on a i686-pc-linux-gnu and all Wportable-volatility
>> test cases are passed for C and C++.
>> I used a cross-compiler for arm-eabi to manually cross-check that
>> the warnings are independent of the target platform.
>
> Just a quick first note:
>
> @@ -3470,6 +3470,13 @@ optimize_bit_field_compare (location_t l
> || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
> return 0;
>
> + /* Do not try to optimize on volatiles, as it would defeat the
> + -Wportable-volatility warning later:
> + If the COMPONENT_REF is replaced by a BIT_FIELD_REF we loose
> + information and thus the warning cannot be generated correctly. */
> + if (warn_portable_volatility && lvolatilep)
> + return 0;
>
> changing code-generation with a warning option looks wrong to me. Note
> that I completely removed this code once (it also generates strange
> BIT_FIELD_REFs) but re-instantiated it on request because of lost
> optimizations.
>

I'm sorry for that, but with the BIT_FIELD_REF I was not able to recover
the declaration mode of the bit field member. And this happened
for some of the test cases I wanted to have warnings on.

If I remember correctly this applies to code like:
  if (x.x == 1)
    { ... }


> Similar for
>
> @@ -609,11 +609,14 @@ layout_decl (tree decl, unsigned int kno
> occupying a complete byte or bytes on proper boundary,
> and not -fstrict-volatile-bitfields. If the latter is set,
> we unfortunately can't check TREE_THIS_VOLATILE, as a cast
> - may make a volatile object later. */
> + may make a volatile object later.
> + Handle -Wportable-volatility analogous, as we would loose
> + information and defeat the warning later. */
> if (TYPE_SIZE (type) != 0
> && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
> && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT
> - && flag_strict_volatile_bitfields <= 0)
> + && flag_strict_volatile_bitfields <= 0
> + && warn_portable_volatility == 0)
> {
> enum machine_mode xmode
> = mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1);
>
> I also wonder about "we unfortunately can't check TREE_THIS_VOLATILE, as a 
> cast
> may make a volatile object later." - does that mean that AAPCS requires
>
> struct X { int x : 8; char c; };
>
> void foo (struct X *p)
> {
> ((volatile struct X *)p)->x = 1;
> }
>
> to be treated as volatile bitfield access? Similar, is
>

Yes, that is a volatile bitfield access.

> volatile struct X x;
> x.x = 1;
>
> a volatile bitifled access?
>

Yes, that too is a volatile bitfiled access.

Someone please correct me if I am wrong.

> I think the warning can be completely implemented inside struct-layout.c
> for example in finish_bitfield_representative (if you pass that the first 
> field
> in the group, too). Of course that is at the expense of warning for
> struct declarations rather than actual code differences (the struct may
> not be used)
>

Yes, except for the above use cases.
These may be difficult to find without a warning.

> Richard.
>
>
>> Regards
>> Bernd Edlinger                                         

Reply via email to