Commit 7e4680c1 by Eric Botcazou

einfo.ads (Address_Taken): Document use for the second argument of Asm_Input and…

einfo.ads (Address_Taken): Document use for the second argument of Asm_Input and Asm_Output attributes.

	* einfo.ads (Address_Taken): Document use for the second argument of
	Asm_Input and Asm_Output attributes.
	* sem_attr.adb (Analyze_Attribute) <Attribute_Asm_Input>: If the second
	argument is an entity name, then set Address_Taken on it.
	<Attribute_Asm_Output>: Likewise.
	* gcc-interface/trans.c (lvalue_required_for_attribute_p): Handle the
	Attr_Asm_Input and Attr_Asm_Output attributes explicitly.
	(gnat_to_gnu) <N_Code_Statement>: If an operand is going to end up in
	memory and is a CONST_DECL, retrieve its corresponding VAR_DECL.

From-SVN: r175171
parent 0e27699a
2010-06-16 Joern Rennecke <joern.rennecke@embecosm.com> 2011-06-18 Eric Botcazou <ebotcazou@adacore.com>
* einfo.ads (Address_Taken): Document use for the second argument of
Asm_Input and Asm_Output attributes.
* sem_attr.adb (Analyze_Attribute) <Attribute_Asm_Input>: If the second
argument is an entity name, then set Address_Taken on it.
<Attribute_Asm_Output>: Likewise.
* gcc-interface/trans.c (lvalue_required_for_attribute_p): Handle the
Attr_Asm_Input and Attr_Asm_Output attributes explicitly.
(gnat_to_gnu) <N_Code_Statement>: If an operand is going to end up in
memory and is a CONST_DECL, retrieve its corresponding VAR_DECL.
2011-06-16 Joern Rennecke <joern.rennecke@embecosm.com>
PR middle-end/46500 PR middle-end/46500
* gcc-interface/decl.c (gnat_to_gnu_param): Use pack_cumulative_args. * gcc-interface/decl.c (gnat_to_gnu_param): Use pack_cumulative_args.
......
...@@ -380,9 +380,11 @@ package Einfo is ...@@ -380,9 +380,11 @@ package Einfo is
-- Address_Taken (Flag104) -- Address_Taken (Flag104)
-- Present in all entities. Set if the Address or Unrestricted_Access -- Present in all entities. Set if the Address or Unrestricted_Access
-- attribute is applied directly to the entity, i.e. the entity is the -- attribute is applied directly to the entity, i.e. the entity is the
-- entity of the prefix of the attribute reference. Used by Gigi to -- entity of the prefix of the attribute reference. Also set if the
-- make sure that the address can be meaningfully taken, and also in -- entity is the second argument of an Asm_Input or Asm_Output attribute,
-- the case of subprograms to control output of certain warnings. -- as the construct may entail taking its address. Used by Gigi to make
-- sure that the address can be meaningfully taken, and also in the case
-- of subprograms to control output of certain warnings.
-- Aft_Value (synthesized) -- Aft_Value (synthesized)
-- Applies to fixed and decimal types. Computes a universal integer -- Applies to fixed and decimal types. Computes a universal integer
......
...@@ -706,6 +706,8 @@ lvalue_required_for_attribute_p (Node_Id gnat_node) ...@@ -706,6 +706,8 @@ lvalue_required_for_attribute_p (Node_Id gnat_node)
case Attr_First_Bit: case Attr_First_Bit:
case Attr_Last_Bit: case Attr_Last_Bit:
case Attr_Bit: case Attr_Bit:
case Attr_Asm_Input:
case Attr_Asm_Output:
default: default:
return 1; return 1;
} }
...@@ -5489,9 +5491,15 @@ gnat_to_gnu (Node_Id gnat_node) ...@@ -5489,9 +5491,15 @@ gnat_to_gnu (Node_Id gnat_node)
mark it addressable. Note that we don't test mark it addressable. Note that we don't test
allows_mem like in the input case below; this allows_mem like in the input case below; this
is modelled on the C front-end. */ is modelled on the C front-end. */
if (!allows_reg if (!allows_reg)
&& !gnat_mark_addressable (output)) {
output = error_mark_node; 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 else
output = error_mark_node; output = error_mark_node;
...@@ -5511,9 +5519,15 @@ gnat_to_gnu (Node_Id gnat_node) ...@@ -5511,9 +5519,15 @@ gnat_to_gnu (Node_Id gnat_node)
{ {
/* If the operand is going to end up in memory, /* If the operand is going to end up in memory,
mark it addressable. */ mark it addressable. */
if (!allows_reg && allows_mem if (!allows_reg && allows_mem)
&& !gnat_mark_addressable (input)) {
input = error_mark_node; 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 else
input = error_mark_node; input = error_mark_node;
......
...@@ -2243,6 +2243,13 @@ package body Sem_Attr is ...@@ -2243,6 +2243,13 @@ package body Sem_Attr is
when Attribute_Asm_Input => when Attribute_Asm_Input =>
Check_Asm_Attribute; Check_Asm_Attribute;
-- The back-end may need to take the address of E2
if Is_Entity_Name (E2) then
Set_Address_Taken (Entity (E2));
end if;
Set_Etype (N, RTE (RE_Asm_Input_Operand)); Set_Etype (N, RTE (RE_Asm_Input_Operand));
---------------- ----------------
...@@ -2263,6 +2270,13 @@ package body Sem_Attr is ...@@ -2263,6 +2270,13 @@ package body Sem_Attr is
end if; end if;
Note_Possible_Modification (E2, Sure => True); Note_Possible_Modification (E2, Sure => True);
-- The back-end may need to take the address of E2
if Is_Entity_Name (E2) then
Set_Address_Taken (Entity (E2));
end if;
Set_Etype (N, RTE (RE_Asm_Output_Operand)); Set_Etype (N, RTE (RE_Asm_Output_Operand));
--------------- ---------------
......
2011-06-18 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/constant3.adb: New test.
2011-06-18 Janne Blomqvist <jb@gcc.gnu.org> 2011-06-18 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/48296 PR libfortran/48296
...@@ -75,8 +79,7 @@ ...@@ -75,8 +79,7 @@
2011-06-16 Martin Jambor <mjambor@suse.cz> 2011-06-16 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/49343 PR tree-optimization/49343
* gnat.dg/discr31.adb: New test. * gnat.dg/discr31.ad[sb]: New test.
* gnat.dg/discr31.ads: Likewise.
2011-06-16 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2011-06-16 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
......
-- { dg-do compile }
-- { dg-options "-O" }
with System.Machine_code; use System.Machine_code;
procedure Constant3 is
c : Integer := -1;
r : Integer;
procedure Conv (res : out Integer; v : Integer) is
v1 : constant Integer := v;
begin
Asm ("", Integer'Asm_output ("=m", res), Integer'Asm_input("m", v1));
end;
pragma Inline_Always (Conv);
begin
Conv (r, c);
end;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment