diff options
Diffstat (limited to 'gcc/ada/gcc-interface')
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 8 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/utils2.c | 9 |
2 files changed, 9 insertions, 8 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 9f34718..587063b 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2187,8 +2187,8 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) case Attr_Last_Bit: case Attr_Bit: { - HOST_WIDE_INT bitsize; - HOST_WIDE_INT bitpos; + poly_int64 bitsize; + poly_int64 bitpos; tree gnu_offset; tree gnu_field_bitpos; tree gnu_field_offset; @@ -2255,11 +2255,11 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) case Attr_First_Bit: case Attr_Bit: - gnu_result = size_int (bitpos % BITS_PER_UNIT); + gnu_result = size_int (num_trailing_bits (bitpos)); break; case Attr_Last_Bit: - gnu_result = bitsize_int (bitpos % BITS_PER_UNIT); + gnu_result = bitsize_int (num_trailing_bits (bitpos)); gnu_result = size_binop (PLUS_EXPR, gnu_result, TYPE_SIZE (TREE_TYPE (gnu_prefix))); /* ??? Avoid a large unsigned result that will overflow when diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index dcd4134..7f3a3d3 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -1439,8 +1439,8 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) the offset to the field. Otherwise, do this the normal way. */ if (op_code == ATTR_ADDR_EXPR) { - HOST_WIDE_INT bitsize; - HOST_WIDE_INT bitpos; + poly_int64 bitsize; + poly_int64 bitpos; tree offset, inner; machine_mode mode; int unsignedp, reversep, volatilep; @@ -1460,8 +1460,9 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) if (!offset) offset = size_zero_node; - offset = size_binop (PLUS_EXPR, offset, - size_int (bitpos / BITS_PER_UNIT)); + offset + = size_binop (PLUS_EXPR, offset, + size_int (bits_to_bytes_round_down (bitpos))); /* Take the address of INNER, convert it to a pointer to our type and add the offset. */ |