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
4 changed files with 55 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
40
gcc/testsuite/gcc.c-torture/compile/20080613-1.c
Normal file
40
gcc/testsuite/gcc.c-torture/compile/20080613-1.c
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue