summaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/trans.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r--gcc/ada/gcc-interface/trans.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index ca47e9347de..bf533bdf332 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -706,6 +706,8 @@ lvalue_required_for_attribute_p (Node_Id gnat_node)
case Attr_First_Bit:
case Attr_Last_Bit:
case Attr_Bit:
+ case Attr_Asm_Input:
+ case Attr_Asm_Output:
default:
return 1;
}
@@ -1016,7 +1018,8 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
else
{
gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
- if (TREE_CODE (gnu_result) == INDIRECT_REF)
+ if (TREE_CODE (gnu_result) == INDIRECT_REF
+ && No (Address_Clause (gnat_temp)))
TREE_THIS_NOTRAP (gnu_result) = 1;
}
@@ -5489,9 +5492,15 @@ gnat_to_gnu (Node_Id gnat_node)
mark it addressable. Note that we don't test
allows_mem like in the input case below; this
is modelled on the C front-end. */
- if (!allows_reg
- && !gnat_mark_addressable (output))
- output = error_mark_node;
+ if (!allows_reg)
+ {
+ STRIP_NOPS (output);
+ if (TREE_CODE (output) == CONST_DECL
+ && DECL_CONST_CORRESPONDING_VAR (output))
+ output = DECL_CONST_CORRESPONDING_VAR (output);
+ if (!gnat_mark_addressable (output))
+ output = error_mark_node;
+ }
}
else
output = error_mark_node;
@@ -5511,9 +5520,15 @@ gnat_to_gnu (Node_Id gnat_node)
{
/* If the operand is going to end up in memory,
mark it addressable. */
- if (!allows_reg && allows_mem
- && !gnat_mark_addressable (input))
- input = error_mark_node;
+ if (!allows_reg && allows_mem)
+ {
+ STRIP_NOPS (input);
+ if (TREE_CODE (input) == CONST_DECL
+ && DECL_CONST_CORRESPONDING_VAR (input))
+ input = DECL_CONST_CORRESPONDING_VAR (input);
+ if (!gnat_mark_addressable (input))
+ input = error_mark_node;
+ }
}
else
input = error_mark_node;