Commit 9133c85e by Eric Botcazou Committed by Eric Botcazou

re PR middle-end/36520 (ICE in get_memory_rtx)

	PR middle-end/36520
	* builtins.c (get_memory_rtx): Test for the presence of DECL_SIZE_UNIT
	before evaluating it.

From-SVN: r136747
parent 6cf59865
2008-06-13 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/36520
* builtins.c (get_memory_rtx): Test for the presence of DECL_SIZE_UNIT
before evaluating it.
2008-06-13 Jakub Jelinek <jakub@redhat.com> 2008-06-13 Jakub Jelinek <jakub@redhat.com>
PR c/36507 PR c/36507
......
...@@ -1125,14 +1125,16 @@ get_memory_rtx (tree exp, tree len) ...@@ -1125,14 +1125,16 @@ get_memory_rtx (tree exp, tree len)
&& (TREE_INT_CST_LOW (DECL_SIZE (field)) && (TREE_INT_CST_LOW (DECL_SIZE (field))
% BITS_PER_UNIT) == 0)); % BITS_PER_UNIT) == 0));
/* If we can prove that the memory starting at XEXP (mem, 0) and
ending at XEXP (mem, 0) + LENGTH will fit into this field, we
can keep the COMPONENT_REF in MEM_EXPR. But be careful with
fields without DECL_SIZE_UNIT like flexible array members. */
if (length >= 0 if (length >= 0
&& DECL_SIZE_UNIT (field)
&& host_integerp (DECL_SIZE_UNIT (field), 0)) && host_integerp (DECL_SIZE_UNIT (field), 0))
{ {
HOST_WIDE_INT size HOST_WIDE_INT size
= TREE_INT_CST_LOW (DECL_SIZE_UNIT (field)); = TREE_INT_CST_LOW (DECL_SIZE_UNIT (field));
/* If we can prove the memory starting at XEXP (mem, 0)
and ending at XEXP (mem, 0) + LENGTH will fit into
this field, we can keep that COMPONENT_REF in MEM_EXPR. */
if (offset <= size if (offset <= size
&& length <= size && length <= size
&& offset + length <= size) && offset + length <= size)
......
2008-06-13 Eric Botcazou <ebotcazou@adacore.com>
* gcc.c-torture/compile/20080613-1.c: New test.
2008-06-13 Jakub Jelinek <jakub@redhat.com> 2008-06-13 Jakub Jelinek <jakub@redhat.com>
PR c/36507 PR c/36507
......
/* PR middle-end/36520 */
/* Testcase by Richard Guenther <rguenth@gcc.gnu.org> */
typedef long unsigned int size_t;
typedef unsigned short int sa_family_t;
struct cmsghdr {
size_t cmsg_len;
__extension__ unsigned char __cmsg_data [];
};
typedef unsigned int uint32_t;
struct in6_addr {
union {
uint32_t u6_addr32[4];
} in6_u;
};
struct sockaddr_in {
sa_family_t sin_family;
};
struct in6_pktinfo {
struct in6_addr ipi6_addr;
};
typedef union {
struct sockaddr_in sin;
} sockaddr_any;
static sockaddr_any src_addr;
inline struct cmsghdr * cmsg_put(struct cmsghdr *cm, int type, void *data, size_t len)
{
memcpy(((cm)->__cmsg_data), data, len);
}
int hop_sendmsg(int fd) {
struct cmsghdr *cm;
if (src_addr.sin.sin_family) {
if (src_addr.sin.sin_family == 2) {
struct in6_pktinfo info;
cm = cmsg_put(cm, 50, &info, sizeof(info));
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment