Commit 9cf18af8 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): Move code dealing with volatileness to after code…

decl.c (gnat_to_gnu_entity): Move code dealing with volatileness to after code dealing with renaming.

	* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Move code
	dealing with volatileness to after code dealing with renaming.

From-SVN: r140924
parent 4c6f9770
2008-10-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Move code
dealing with volatileness to after code dealing with renaming.
2008-10-06 Eric Botcazou <ebotcazou@adacore.com> 2008-10-06 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Minor tweaks. * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Minor tweaks.
...@@ -828,22 +828,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -828,22 +828,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
"PAD", false, definition, "PAD", false, definition,
gnu_size ? true : false); gnu_size ? true : false);
/* Make a volatile version of this object's type if we are to make
the object volatile. We also interpret 13.3(19) conservatively
and disallow any optimizations for an object covered by it. */
if ((Treat_As_Volatile (gnat_entity)
|| (Is_Exported (gnat_entity)
/* Exclude exported constants created by the compiler,
which should boil down to static dispatch tables and
make it possible to put them in read-only memory. */
&& (Comes_From_Source (gnat_entity) || !const_flag))
|| Is_Imported (gnat_entity)
|| Present (Address_Clause (gnat_entity)))
&& !TYPE_VOLATILE (gnu_type))
gnu_type = build_qualified_type (gnu_type,
(TYPE_QUALS (gnu_type)
| TYPE_QUAL_VOLATILE));
/* If this is a renaming, avoid as much as possible to create a new /* If this is a renaming, avoid as much as possible to create a new
object. However, in several cases, creating it is required. object. However, in several cases, creating it is required.
This processing needs to be applied to the raw expression so This processing needs to be applied to the raw expression so
...@@ -991,22 +975,38 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -991,22 +975,38 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
} }
} }
/* If this is an aliased object whose nominal subtype is unconstrained, /* Make a volatile version of this object's type if we are to make
the object is a record that contains both the template and the object volatile. We also interpret 13.3(19) conservatively
the object. If there is an initializer, it will have already and disallow any optimizations for an object covered by it. */
been converted to the right type, but we need to create the if ((Treat_As_Volatile (gnat_entity)
template if there is no initializer. */ || (Is_Exported (gnat_entity)
else if (definition /* Exclude exported constants created by the compiler,
&& TREE_CODE (gnu_type) == RECORD_TYPE which should boil down to static dispatch tables and
&& (TYPE_CONTAINS_TEMPLATE_P (gnu_type) make it possible to put them in read-only memory. */
/* Beware that padding might have been introduced && (Comes_From_Source (gnat_entity) || !const_flag))
via maybe_pad_type above. */ || Is_Imported (gnat_entity)
|| (TYPE_IS_PADDING_P (gnu_type) || Present (Address_Clause (gnat_entity)))
&& TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type))) && !TYPE_VOLATILE (gnu_type))
== RECORD_TYPE gnu_type = build_qualified_type (gnu_type,
&& TYPE_CONTAINS_TEMPLATE_P (TYPE_QUALS (gnu_type)
(TREE_TYPE (TYPE_FIELDS (gnu_type))))) | TYPE_QUAL_VOLATILE));
&& !gnu_expr)
/* If we are defining an aliased object whose nominal subtype is
unconstrained, the object is a record that contains both the
template and the object. If there is an initializer, it will
have already been converted to the right type, but we need to
create the template if there is no initializer. */
if (definition
&& !gnu_expr
&& TREE_CODE (gnu_type) == RECORD_TYPE
&& (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
/* Beware that padding might have been introduced
via maybe_pad_type above. */
|| (TYPE_IS_PADDING_P (gnu_type)
&& TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
== RECORD_TYPE
&& TYPE_CONTAINS_TEMPLATE_P
(TREE_TYPE (TYPE_FIELDS (gnu_type))))))
{ {
tree template_field tree template_field
= TYPE_IS_PADDING_P (gnu_type) = TYPE_IS_PADDING_P (gnu_type)
......
2008-10-07 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/addr4.adb: New test.
* gnat.dg/addr5.adb: Likewise.
2008-10-06 Adam Nemet <anemet@caviumnetworks.com> 2008-10-06 Adam Nemet <anemet@caviumnetworks.com>
* gcc.target/mips/mips.exp (dg-mips-options): Set mips_new_gp to * gcc.target/mips/mips.exp (dg-mips-options): Set mips_new_gp to
......
-- { dg-do compile }
-- { dg-options "-g" }
procedure Addr4 is
function F return String is begin return ""; end F;
S1 : String renames F;
subtype ST is String (1 .. S1'Length);
S2 : ST;
for S2'Address use S1'Address;
begin
null;
end;
-- { dg-do compile }
-- { dg-options "-g" }
procedure Addr5 (Len : Integer) is
S : aliased String (1 .. Len) := (others => ' ');
C : Character;
for C'Address use S'Address;
begin
null;
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