re PR c++/85659 (ICE with inline assembly inside virtual function)
PR c++/85659 * cfgexpand.c (expand_asm_stmt): Don't create a temporary if the type is addressable. Don't force op into register if it has BLKmode. * g++.dg/ext/asm14.C: New test. * g++.dg/ext/asm15.C: New test. * g++.dg/ext/asm16.C: New test. From-SVN: r259981
This commit is contained in:
parent
a9856a8d08
commit
d5754d94e4
6 changed files with 48 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
|||
2018-05-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/85659
|
||||
* cfgexpand.c (expand_asm_stmt): Don't create a temporary if
|
||||
the type is addressable. Don't force op into register if it has
|
||||
BLKmode.
|
||||
|
||||
2018-05-05 Roland McGrath <mcgrathr@google.com>
|
||||
|
||||
PR other/77609
|
||||
|
|
|
@ -3044,14 +3044,14 @@ expand_asm_stmt (gasm *stmt)
|
|||
|
||||
generating_concat_p = 0;
|
||||
|
||||
if ((TREE_CODE (val) == INDIRECT_REF
|
||||
&& allows_mem)
|
||||
if ((TREE_CODE (val) == INDIRECT_REF && allows_mem)
|
||||
|| (DECL_P (val)
|
||||
&& (allows_mem || REG_P (DECL_RTL (val)))
|
||||
&& ! (REG_P (DECL_RTL (val))
|
||||
&& GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
|
||||
|| ! allows_reg
|
||||
|| is_inout)
|
||||
|| is_inout
|
||||
|| TREE_ADDRESSABLE (type))
|
||||
{
|
||||
op = expand_expr (val, NULL_RTX, VOIDmode,
|
||||
!allows_reg ? EXPAND_MEMORY : EXPAND_WRITE);
|
||||
|
@ -3060,7 +3060,7 @@ expand_asm_stmt (gasm *stmt)
|
|||
|
||||
if (! allows_reg && !MEM_P (op))
|
||||
error ("output number %d not directly addressable", i);
|
||||
if ((! allows_mem && MEM_P (op))
|
||||
if ((! allows_mem && MEM_P (op) && GET_MODE (op) != BLKmode)
|
||||
|| GET_CODE (op) == CONCAT)
|
||||
{
|
||||
rtx old_op = op;
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2018-05-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/85659
|
||||
* g++.dg/ext/asm14.C: New test.
|
||||
* g++.dg/ext/asm15.C: New test.
|
||||
* g++.dg/ext/asm16.C: New test.
|
||||
|
||||
2018-05-06 Michael Eager <eager@eagercon.com>
|
||||
|
||||
* gcc.target/microblaze/others/picdtr.c: Correct option
|
||||
|
|
10
gcc/testsuite/g++.dg/ext/asm14.C
Normal file
10
gcc/testsuite/g++.dg/ext/asm14.C
Normal file
|
@ -0,0 +1,10 @@
|
|||
// PR c++/85659
|
||||
// { dg-do compile }
|
||||
|
||||
struct S { S (); ~S (); int s; };
|
||||
|
||||
void
|
||||
foo (S &s)
|
||||
{
|
||||
__asm volatile ("" : "+m,r" (s) : : "memory");
|
||||
}
|
10
gcc/testsuite/g++.dg/ext/asm15.C
Normal file
10
gcc/testsuite/g++.dg/ext/asm15.C
Normal file
|
@ -0,0 +1,10 @@
|
|||
// PR c++/85659
|
||||
// { dg-do compile }
|
||||
|
||||
struct S { S (); ~S (); int s; };
|
||||
|
||||
void
|
||||
foo (S &s)
|
||||
{
|
||||
__asm volatile ("" : "+r" (s) : : "memory"); // { dg-error "" }
|
||||
}
|
10
gcc/testsuite/g++.dg/ext/asm16.C
Normal file
10
gcc/testsuite/g++.dg/ext/asm16.C
Normal file
|
@ -0,0 +1,10 @@
|
|||
// PR c++/85659
|
||||
// { dg-do compile }
|
||||
|
||||
struct S { S (); ~S (); int s[64]; } s;
|
||||
|
||||
void
|
||||
foo ()
|
||||
{
|
||||
__asm volatile ("" : "=r" (s) : : "memory"); // { dg-error "" }
|
||||
}
|
Loading…
Add table
Reference in a new issue