-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
* gcc-interface/decl.c (gnat_to_gnu_param): Use pack_cumulative_args.
-- Address_Taken (Flag104)
-- Present in all entities. Set if the Address or Unrestricted_Access
-- 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
--- make sure that the address can be meaningfully taken, and also in
--- the case of subprograms to control output of certain warnings.
+-- entity of the prefix of the attribute reference. Also set if the
+-- entity is the second argument of an Asm_Input or Asm_Output attribute,
+-- 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)
-- Applies to fixed and decimal types. Computes a universal integer
case Attr_First_Bit:
case Attr_Last_Bit:
case Attr_Bit:
+ case Attr_Asm_Input:
+ case Attr_Asm_Output:
default:
return 1;
}
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;
{
/* 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;
when Attribute_Asm_Input =>
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));
----------------
end if;
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));
---------------
+2011-06-18 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/constant3.adb: New test.
+
2011-06-18 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/48296
2011-06-16 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/49343
- * gnat.dg/discr31.adb: New test.
- * gnat.dg/discr31.ads: Likewise.
+ * gnat.dg/discr31.ad[sb]: New test.
2011-06-16 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
--- /dev/null
+-- { 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;