From ea17de23b70df0b90005582a692705f23d062bec Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 10 Nov 2011 20:02:30 +0100 Subject: [PATCH] re PR middle-end/51077 (Endless recursion with __builtin_object_size) PR middle-end/51077 * tree-object-size.c (addr_object_size): Check TREE_CODE of MEM_REF's operand rather than code of the MEM_REF itself. * gcc.c-torture/compile/pr51077.c: New test. From-SVN: r181263 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/compile/pr51077.c | 15 +++++++++++++++ gcc/tree-object-size.c | 2 +- 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr51077.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa7cbeb1bb5..b07dbca042d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-11-10 Jakub Jelinek + + PR middle-end/51077 + * tree-object-size.c (addr_object_size): Check TREE_CODE of + MEM_REF's operand rather than code of the MEM_REF itself. + 2011-11-10 Andrew MacLeod PR rtl-optimization/51040 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ffa8b57d8fa..9615be5b53b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-11-10 Jakub Jelinek + PR middle-end/51077 + * gcc.c-torture/compile/pr51077.c: New test. + PR rtl-optimization/51023 * gcc.c-torture/execute/pr51023.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr51077.c b/gcc/testsuite/gcc.c-torture/compile/pr51077.c new file mode 100644 index 00000000000..de2b97e58e9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr51077.c @@ -0,0 +1,15 @@ +/* PR middle-end/51077 */ + +struct S { unsigned char s, t[256]; }; + +void +foo (const struct S *x, struct S *y, int z) +{ + int i; + for (i = 0; i < 8; i++) + { + const struct S *a = &x[i]; + __builtin___memcpy_chk (y->t, a->t, z, __builtin_object_size (y->t, 0)); + y = (struct S *) &y->t[z]; + } +} diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c index 017f8c5e933..326b2e4c21b 100644 --- a/gcc/tree-object-size.c +++ b/gcc/tree-object-size.c @@ -175,7 +175,7 @@ addr_object_size (struct object_size_info *osi, const_tree ptr, unsigned HOST_WIDE_INT sz; if (!osi || (object_size_type & 1) != 0 - || TREE_CODE (pt_var) != SSA_NAME) + || TREE_CODE (TREE_OPERAND (pt_var, 0)) != SSA_NAME) { sz = compute_builtin_object_size (TREE_OPERAND (pt_var, 0), object_size_type & ~1); -- 2.30.2