------- Additional Comments From dberlin at gcc dot gnu dot org  2005-05-31 
16:37 -------
This is indeed an salias problem.

This was code i had warned Nathan about changing, for fear that something like
this might be exposed.

Nathan, 
  if (!var_can_have_subvars (field))
          push = true;
        else if (!(push_fields_onto_fieldstack
                   (TREE_TYPE (field), fieldstack,
                    offset + bitpos_of_field (field)))
                 && DECL_SIZE (field)
                 && !integer_zerop (DECL_SIZE (field)))
          /* Empty structures may have actual size, like in C++. So
             see if we didn't push any subfields and the size is
             nonzero, push the field onto the stack */
          push = true;


fails because DECL_SIZE (field) is 0.

(gdb) p debug_tree (field)
 <field_decl 0x401bd2f4 lock
    type <record_type 0x401bd144 spinlock_t type_0 BLK
        size <integer_cst 0x40140990 constant invariant 0>
        unit size <integer_cst 0x401401b0 constant invariant 0>
        align 8 symtab 0 alias set -1 context <translation_unit_decl 0x401bd804
D.1247>>
    BLK file /home/dberlin/saliastest.c line 4 size <integer_cst 0x40140990 0>
unit size <integer_cst 0x401401b0 0>
    align 8 offset_align 128 offset <integer_cst 0x401401b0 0>
    bit offset <integer_cst 0x40140408 type <integer_type 0x40148288
bit_size_type> constant invariant 32> context <record_type 0x401bd1b0> arguments
<integer_cst 0x401401b0 0>>


But we still need to push it onto the fieldlist anyway, because we have an
access to that member.





-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nathan at codesourcery dot
                   |                            |com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21839

Reply via email to