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
This commit is contained in:
Eric Botcazou 2008-06-13 10:20:57 +00:00 committed by Eric Botcazou
parent 6cf598659e
commit 9133c85e1a
4 changed files with 55 additions and 3 deletions

View file

@ -1,3 +1,9 @@
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>
PR c/36507

View file

@ -1125,14 +1125,16 @@ get_memory_rtx (tree exp, tree len)
&& (TREE_INT_CST_LOW (DECL_SIZE (field))
% 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
&& DECL_SIZE_UNIT (field)
&& host_integerp (DECL_SIZE_UNIT (field), 0))
{
HOST_WIDE_INT size
= 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
&& length <= size
&& offset + length <= size)

View file

@ -1,3 +1,7 @@
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>
PR c/36507

View file

@ -0,0 +1,40 @@
/* 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));
}
}
}