This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Fix ICE on 'Address of renaming of unconstrained array with -g
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 7 Oct 2008 10:12:43 +0200
- Subject: [Ada] Fix ICE on 'Address of renaming of unconstrained array with -g
The ICE is only the tip of the iceberg (an UNCONSTRAINED_ARRAY_TYPE slips
through the cracks down to dwarf2out.c), it's actually a bad interaction
between renaming and volatileness:
procedure P 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;
S1 is overlaid through 'Address so it is effectively made volatile by the FE,
in addition to being a renaming. ?This confuses the renaming code when it
needs to make a renaming pointer because the TYPE_POINTER_TO field has not
been adjusted.
Fixed by moving the code dealing with volatileness to after the code dealing
with renaming. ?Both cannot be activated directly at the language level (you
cannot apply pragma Volatile to a renaming entity) and it's too late in any
cases for volatileness to have any effect at this point, it should be set on
the renamed object instead of the renaming entity.
Tested on i586-suse-linux, applied on the mainline.
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-07 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/addr4.adb: New test.
* gnat.dg/addr5.adb: Likewise.
--
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c (revision 140904)
+++ gcc-interface/decl.c (working copy)
@@ -828,22 +828,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
"PAD", false, definition,
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
object. However, in several cases, creating it is required.
This processing needs to be applied to the raw expression so
@@ -991,22 +975,38 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
}
}
- /* If this is 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. */
- else if (definition
- && 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)))))
- && !gnu_expr)
+ /* 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 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
= TYPE_IS_PADDING_P (gnu_type)
-- { 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;