mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
6cf598659e
commit
9133c85e1a
|
@ -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>
|
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)
|
||||||
&& (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)
|
||||||
|
|
|
@ -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>
|
2008-06-13 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c/36507
|
PR c/36507
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue