aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-04-24 08:07:30 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-04-24 08:07:30 +0200
commitdd0a516fa722bb2847ae1b4581ae2091c3977a5b (patch)
tree58f80e09989829fcabbe550b0bfbcba45424ec41 /gcc/varasm.c
parent06edd772e354ab922fa429bfe788a006f53511d8 (diff)
downloadgcc-dd0a516fa722bb2847ae1b4581ae2091c3977a5b.zip
gcc-dd0a516fa722bb2847ae1b4581ae2091c3977a5b.tar.gz
gcc-dd0a516fa722bb2847ae1b4581ae2091c3977a5b.tar.bz2
re PR middle-end/53084 (GCC cannot handle array initialization of string constant with point arithmetic properly)
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. From-SVN: r186742
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c10
1 files changed, 10 insertions, 0 deletions
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: