diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/gimplify.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr43690.c | 13 |
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 749951a..9af445b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ * cfgexpand.c (expand_debug_expr): Handle MEM_REF with non-zero offset. + PR middle-end/43690 + * gimplify.c (gimplify_asm_expr): If a "m" input is a + {pre,post}{in,de}crement, fail. + PR debug/46307 * tree-ssa-operands.c (get_expr_operands): Handle FMA_EXPR. * tree-pretty-print.c (dump_generic_node): Likewise. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index f490349..128ac02 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -5066,6 +5066,13 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) /* If the operand is a memory input, it should be an lvalue. */ if (!allows_reg && allows_mem) { + tree inputv = TREE_VALUE (link); + STRIP_NOPS (inputv); + if (TREE_CODE (inputv) == PREDECREMENT_EXPR + || TREE_CODE (inputv) == PREINCREMENT_EXPR + || TREE_CODE (inputv) == POSTDECREMENT_EXPR + || TREE_CODE (inputv) == POSTINCREMENT_EXPR) + TREE_VALUE (link) = error_mark_node; tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p, is_gimple_lvalue, fb_lvalue | fb_mayfail); mark_addressable (TREE_VALUE (link)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2041a7a..8ac52a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-05 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/43690 + * c-c++-common/pr43690.c: New test. + 2010-11-05 Iain Sandoe <iains@gcc.gnu.org> * objc.dg/torture/forward-1.m: Restore for m32 NeXT. diff --git a/gcc/testsuite/c-c++-common/pr43690.c b/gcc/testsuite/c-c++-common/pr43690.c new file mode 100644 index 0000000..67c6cb0 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr43690.c @@ -0,0 +1,13 @@ +/* PR middle-end/43690 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void +foo (char *x) +{ + asm ("" : : "m" (x++)); /* { dg-error "is not directly addressable" } */ + asm ("" : : "m" (++x)); /* { dg-error "is not directly addressable" } */ + asm ("" : : "m" (x--)); /* { dg-error "is not directly addressable" } */ + asm ("" : : "m" (--x)); /* { dg-error "is not directly addressable" } */ + asm ("" : : "m" (x + 1)); /* { dg-error "is not directly addressable" } */ +} |