SEGV in do_simple_structure_copy

Daniel Berlin dberlin@dberlin.org
Thu Oct 6 21:41:00 GMT 2005


On Oct 6, 2005, at 4:22 PM, Olivier Hainque wrote:

> Daniel Berlin wrote:
>
>> IOW, you are lying to the middle-end about the size of the fields.
>> Why is the type not a 6 bit integer?
>>

>
>   layout_decl (tree decl, unsigned int known_align)
>   ...
>   /* Usually the size and mode come from the data type without change,
>      however, the front-end may set the explicit width of the  
> field, so its
>      size may not be the same as the size of its type.  This  
> happens with
>      bitfields, of course (an `int' bitfield may be only 2 bits,  
> say), but it
>      also happens with other fields.
>
>  The C front-end behaves similarily, creating
>
>    <field_decl 0xb7429398 x type <integer_type 0xb7429450>
>       external packed bit-field nonaddressable decl_4 QI file tt.c  
> line 3
>       size <integer_cst 0xb742fd98 constant invariant 3>
>       unit size <integer_cst 0xb73aa228 1>
>

>    <integer_type 0xb7429450 sizes-gimplified public QI
>       size <integer_cst constant invariant 8>
>       unit size <integer_cst constant invariant 1>
>       align 8 symtab 0 alias set -1
>       precision 3 min <integer_cst -4> max <integer_cst 3>>
>

You'll note we actually created a new type for this :)
but anyway,

>> This is the correct fix, however, if you are going to lie to the
>> middle end about TYPE_SIZE so that the TYPE_SIZE and DECL_SIZE do not
>> match.
>>
>
>  Well, I'm actually not sure we have a choice. And I'm not sure it is
>  really a lie. A restricted set of values happen to fit in a lower  
> number
>  of bits than what some type allows, it is not obvious that it  
> makes those
>  values of a different type.
>
Thinking harder about it, you might be better off then making  
everything based on TYPE_SIZE then, since we don't always have the  
FIELD_DECL's handy.







More information about the Gcc mailing list