From 36a2ea56fcf758dd4432c4724bd8d6a4aec41b17 Mon Sep 17 00:00:00 2001 From: jakub Date: Tue, 24 Apr 2012 06:07:30 +0000 Subject: [PATCH] PR middle-end/53084 * varasm.c (compute_reloc_for_constant): Handle ADDR_EXPR of MEM_REF. (output_addressed_constants): Likewise. * gcc.c-torture/execute/pr53084.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186742 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr53084.c | 18 ++++++++++++++++++ gcc/varasm.c | 10 ++++++++++ 4 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr53084.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3992e1..8dbaeff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2012-04-24 Jakub Jelinek + PR middle-end/53084 + * varasm.c (compute_reloc_for_constant): Handle ADDR_EXPR + of MEM_REF. + (output_addressed_constants): Likewise. + PR middle-end/52999 * varasm.c (get_section): Don't ICE for section conflicts with built-in section kinds. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8ef2843..76420e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-04-24 Jakub Jelinek + + PR middle-end/53084 + * gcc.c-torture/execute/pr53084.c: New test. + 2012-04-23 Paolo Carlini * g++.dg/cpp0x/noexcept15.C: Adjust for Rev 186726 library changes. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr53084.c b/gcc/testsuite/gcc.c-torture/execute/pr53084.c new file mode 100644 index 0000000..1afc016 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr53084.c @@ -0,0 +1,18 @@ +/* PR middle-end/53084 */ + +extern void abort (void); + +__attribute__((noinline, noclone)) void +bar (const char *p) +{ + if (p[0] != 'o' || p[1] != 'o' || p[2]) + abort (); +} + +int +main () +{ + static const char *const foo[] = {"foo" + 1}; + bar (foo[0]); + return 0; +} diff --git a/gcc/varasm.c b/gcc/varasm.c index b7939c5..03ac49b 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -3934,6 +3934,13 @@ compute_reloc_for_constant (tree exp) tem = TREE_OPERAND (tem, 0)) ; + if (TREE_CODE (tem) == MEM_REF + && TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR) + { + reloc = compute_reloc_for_constant (TREE_OPERAND (tem, 0)); + break; + } + if (TREE_PUBLIC (tem)) reloc |= 2; else @@ -4002,6 +4009,9 @@ output_addressed_constants (tree exp) if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR) output_constant_def (tem, 0); + + if (TREE_CODE (tem) == MEM_REF) + output_addressed_constants (TREE_OPERAND (tem, 0)); break; case PLUS_EXPR: -- 2.7.4