------- Comment #5 from kkojima at gcc dot gnu dot org  2006-06-27 00:28 -------
Although I'm also not familiar with these materials, when
place_field is called for a.d, gdb says that

(gdb) call debug_tree (field)
 <field_decl 0xb7f494ac d
    type <integer_type 0xb7ea63f4 long long int DI
        size <integer_cst 0xb7e91510 constant invariant 64>
        unit size <integer_cst 0xb7e91528 constant invariant 8>
        align 64 symtab 0 alias set -1 precision 64 min <integer_cst 0xb7e914c8
0x8000000000000000> max <integer_cst 0xb7e914e0 0x7fffffffffffffff>>
    external nonlocal bit-field nonaddressable decl_3 decl_4 VOID file tiny.cc
line 3
    size <integer_cst 0xb7f4b6a8 type <integer_type 0xb7ea605c bit_size_type>
constant invariant 23>
    user align 64 offset_align 1 context <record_type 0xb7f49450 S> attributes
<tree_list 0xb7f4b690> chain <field_decl 0xb7f49508 e>>

but when it's called for a.e

(gdb) call debug_tree (rli->prev_field)
 <field_decl 0xb7f494ac d
    type <integer_type 0xb7f495c0 SI
        size <integer_cst 0xb7e913d8 constant invariant 32>
        unit size <integer_cst 0xb7e91168 constant invariant 4>
        align 32 symtab 0 alias set -1 precision 23 min <integer_cst 0xb7f168b8
-4194304> max <integer_cst 0xb7f4b6d8 4194303>>
    external nonlocal bit-field nonaddressable decl_3 decl_4 DI file tiny.cc
line 3
    size <integer_cst 0xb7f4b6a8 type <integer_type 0xb7ea605c bit_size_type>
constant invariant 23>
    unit size <integer_cst 0xb7e91348 type <integer_type 0xb7ea6000 unsigned
int> constant invariant 3>
    user align 64 offset_align 128
    offset <integer_cst 0xb7e91180 type <integer_type 0xb7ea6000 unsigned int>
constant invariant 0>
    bit offset <integer_cst 0xb7e91930 type <integer_type 0xb7ea605c
bit_size_type> constant invariant 0>
    bit_field_type <integer_type 0xb7ea63f4 long long int DI
        size <integer_cst 0xb7e91510 constant invariant 64>
        unit size <integer_cst 0xb7e91528 constant invariant 8>
        align 64 symtab 0 alias set -1 precision 64 min <integer_cst 0xb7e914c8
0x8000000000000000> max <integer_cst 0xb7e914e0 0x7fffffffffffffff>> context
<record_type 0xb7f49450 S> attributes <tree_list 0xb7f4b690> chain <field_decl
0xb7f49508 e>>

i.e. DECL_BIT_FIELD_TYPE is added in processing.  I guess that
this is the reason for the use of TREE_TYPE (field) for not yet
processed fields and non ms-bitfield case.  gcc allocates 32-bit
for a.d without -mms-bitfield.  OTOH, ms-bitfield code see
the previous and already processed field and should allocate
64-bit for a.d.


-- 


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

Reply via email to