On Fri, Jul 11, 2014 at 11:13:12AM +0200, Richard Biener wrote:
> + if (offset >= off)
> + ptr[offset - off] = value;
For original off != 0, you aren't checking whether offset - off < len
though (various places), you don't want to write beyond end of buffer.
> - return total_bytes;
> + return total_bytes - off;
What will happen with originally off is bigger than total_bytes?
Returning negative value sounds wrong, IMHO you should in that case return
early 0. So like:
if ((off == -1 && total_bytes > len) || off >= total_bytes)
return 0;
> @@ -7290,7 +7293,8 @@ native_encode_fixed (const_tree expr, un
> FIXED_VALUE_TYPE value;
> tree i_value, i_type;
>
> - if (total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
> + if (off == -1
> + && total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
> return 0;
This isn't comparing total_bytes to len, so IMHO shouldn't be changed.
> @@ -7324,8 +7328,11 @@ native_encode_real (const_tree expr, uns
> up to 192 bits. */
> long tmp[6];
>
> - if (total_bytes > len)
> + if (off == -1
> + && total_bytes > len)
This can fit onto one line.
> - rsize = native_encode_expr (part, ptr, len);
> + rsize = native_encode_expr (part, ptr, len, off);
> if (rsize == 0)
> return 0;
If off is not -1 and len is too short, the above will do a partial
store. But:
a) if it is a partial store, because some bytes didn't fit, then the
second native_encode_expr should probably not be invoked
b) what about the case when the first one returns 0 because you are asking
for few bytes from the imag part?
> part = TREE_IMAGPART (expr);
> - isize = native_encode_expr (part, ptr+rsize, len-rsize);
> - if (isize != rsize)
> + if (off != -1)
> + off = MAX (0, off - rsize);
> + isize = native_encode_expr (part, ptr+rsize, len-rsize, off);
> + if (off == -1
> + && isize != rsize)
> return 0;
> return rsize + isize;
> }
> @@ -7396,9 +7408,13 @@ native_encode_vector (const_tree expr, u
> for (i = 0; i < count; i++)
> {
> elem = VECTOR_CST_ELT (expr, i);
> - if (native_encode_expr (elem, ptr+offset, len-offset) != size)
> + int res = native_encode_expr (elem, ptr+offset, len-offset, off);
> + if (off == -1
> + && res != size)
> return 0;
I don't think this will work correctly if off is not -1.
> if (TREE_STRING_LENGTH (expr) < total_bytes)
No verification that you are not accessing beyond end of string here.
> {
> - memcpy (ptr, TREE_STRING_POINTER (expr), TREE_STRING_LENGTH (expr));
> - memset (ptr + TREE_STRING_LENGTH (expr), 0,
> - total_bytes - TREE_STRING_LENGTH (expr));
> + memcpy (ptr, TREE_STRING_POINTER (expr) + off,
> + TREE_STRING_LENGTH (expr) - off);
> + memset (ptr + TREE_STRING_LENGTH (expr) - off, 0,
> + MIN (total_bytes, len) - TREE_STRING_LENGTH (expr) + off);
> }
> else
> - memcpy (ptr, TREE_STRING_POINTER (expr), total_bytes);
> - return total_bytes;
> + memcpy (ptr, TREE_STRING_POINTER (expr) + off,
> + MIN (total_bytes, len));
> + return MIN (total_bytes - off, len);
> }
Jakub