This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Sure. I assume in this case, *bit_offset would be 0, right?
It would be DECL_FIELD_BIT_OFFSET of that field. Oh, and *byte_offset would be
*byte_offset = size_binop (MULT_EXPR, TREE_OPERAND (exp, 2), size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT));
see expr.c:component_ref_field_offset () (which you conveniently could use here).
Note that both TREE_OPERAND (exp, 2) and compoment_ref_field_offset return offsets relative to the immediate containing struct type, not relative to the base object like get_inner_reference does ... (where it is still unclear to me what we are supposed to return from this function ...)
Thus, conservative would be using get_inner_reference here, if the offset is supposed to be relative to the base object.
That said, shouldn't *maxbits not at least make sure to cover the field itself?
/* Be as conservative as possible on variable offsets. */ if (TREE_OPERAND (exp, 2) && !host_integerp (TREE_OPERAND (exp, 2), 1)) { get_inner_reference (build3 (COMPONENT_REF, TREE_TYPE (exp), TREE_OPERAND (exp, 0), field, NULL_TREE), &tbitsize, &start_bitpos, &start_offset, &tmode, &tunsignedp, &tvolatilep, true);
*byte_offset = start_offset ? start_offset : size_zero_node; *bit_offset = start_bitpos; *maxbits = tbitsize; return; }
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |