From 9133c85e1a42213e7e09ba917fae7e57e06a236c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 13 Jun 2008 10:20:57 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 +++ gcc/builtins.c | 8 ++-- gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/compile/20080613-1.c | 40 +++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20080613-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 37ff36aaa9e..6d20774cb1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-06-13 Eric Botcazou + + 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 PR c/36507 diff --git a/gcc/builtins.c b/gcc/builtins.c index edc5d5f07f3..b3fc3041377 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c9e1e422496..ae25ac0723e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-06-13 Eric Botcazou + + * gcc.c-torture/compile/20080613-1.c: New test. + 2008-06-13 Jakub Jelinek PR c/36507 diff --git a/gcc/testsuite/gcc.c-torture/compile/20080613-1.c b/gcc/testsuite/gcc.c-torture/compile/20080613-1.c new file mode 100644 index 00000000000..f64964e7740 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20080613-1.c @@ -0,0 +1,40 @@ +/* PR middle-end/36520 */ +/* Testcase by Richard Guenther */ + +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)); + } + } +} -- 2.30.2