From 4116e7d0e0cd33503b5968808ef6e6edc987d816 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 14 Apr 2014 13:51:42 +0000 Subject: [PATCH] opt.ads (Suppress_Back_Annotation): Remove as unused. * opt.ads (Suppress_Back_Annotation): Remove as unused. * fe.h (Back_Annotate_Rep_Info): Likewise. (Global_Discard_Names): Likewise. (List_Representation_Info): Declare. * types.h (Uint_Minus_1): Likewise. * repinfo.ads: Document back-annotation change. * gcc-interface/gigi.h (init_gnat_decl): Declare. (destroy_gnat_decl): Likewise. * gcc-interface/decl.c (annotate_value): Do not create the cache of annotated values here but... : Only inline the call if -gnatR3 is specified or we are in ASIS mode. (init_gnat_decl): ...here instead. New function. (destroy_gnat_decl): Likewise. * gcc-interface/trans.c (gigi): Call {init|destroy}_gnat_decl. * gcc-interface/utils.c (init_gnat_utils): Minor reformatting. Co-Authored-By: Robert Dewar From-SVN: r209371 --- gcc/ada/ChangeLog | 20 ++++++++++++++ gcc/ada/fe.h | 8 +++--- gcc/ada/gcc-interface/decl.c | 51 ++++++++++++++++++++++++----------- gcc/ada/gcc-interface/gigi.h | 6 +++++ gcc/ada/gcc-interface/trans.c | 2 ++ gcc/ada/gcc-interface/utils.c | 4 +-- gcc/ada/opt.ads | 6 ----- gcc/ada/repinfo.ads | 12 ++++++++- gcc/ada/types.h | 2 ++ 9 files changed, 82 insertions(+), 29 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index a77998872e21..b07c70c66f37 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,23 @@ +2014-04-14 Eric Botcazou + Robert Dewar + + * opt.ads (Suppress_Back_Annotation): Remove as unused. + * fe.h (Back_Annotate_Rep_Info): Likewise. + (Global_Discard_Names): Likewise. + (List_Representation_Info): Declare. + * types.h (Uint_Minus_1): Likewise. + * repinfo.ads: Document back-annotation change. + * gcc-interface/gigi.h (init_gnat_decl): Declare. + (destroy_gnat_decl): Likewise. + * gcc-interface/decl.c (annotate_value): Do not create the cache of + annotated values here but... + : Only inline the call if -gnatR3 is specified or we are + in ASIS mode. + (init_gnat_decl): ...here instead. New function. + (destroy_gnat_decl): Likewise. + * gcc-interface/trans.c (gigi): Call {init|destroy}_gnat_decl. + * gcc-interface/utils.c (init_gnat_utils): Minor reformatting. + 2014-04-14 Eric Botcazou * gcc-interface/decl.c (create_field_decl_from): Finalize non-constant diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h index 9b38903f9a5b..d9fe48b5baa2 100644 --- a/gcc/ada/fe.h +++ b/gcc/ada/fe.h @@ -6,7 +6,7 @@ * * * C Header File * * * - * Copyright (C) 1992-2013, Free Software Foundation, Inc. * + * Copyright (C) 1992-2014, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -178,23 +178,21 @@ extern Boolean In_Same_Source_Unit (Node_Id, Node_Id); /* opt: */ -#define Back_Annotate_Rep_Info opt__back_annotate_rep_info #define Exception_Extra_Info opt__exception_extra_info #define Exception_Locations_Suppressed opt__exception_locations_suppressed #define Exception_Mechanism opt__exception_mechanism #define Generate_SCO_Instance_Table opt__generate_sco_instance_table -#define Global_Discard_Names opt__global_discard_names #define Float_Format opt__float_format +#define List_Representation_Info opt__list_representation_info typedef enum {Setjmp_Longjmp, Back_End_Exceptions} Exception_Mechanism_Type; -extern Boolean Back_Annotate_Rep_Info; extern Boolean Exception_Extra_Info; extern Boolean Exception_Locations_Suppressed; extern Exception_Mechanism_Type Exception_Mechanism; extern Boolean Generate_SCO_Instance_Table; -extern Boolean Global_Discard_Names; extern Char Float_Format; +extern Int List_Representation_Info; /* restrict: */ diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 1e07693591e8..ae512b0b22c8 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -7467,12 +7467,8 @@ annotate_value (tree gnu_size) { struct tree_int_map *e; - if (!annotate_value_cache) - annotate_value_cache = htab_create_ggc (512, tree_int_map_hash, - tree_int_map_eq, 0); in.base.from = gnu_size; - e = (struct tree_int_map *) - htab_find (annotate_value_cache, &in); + e = (struct tree_int_map *) htab_find (annotate_value_cache, &in); if (e) return (Node_Ref_Or_Val) e->to; @@ -7559,11 +7555,17 @@ annotate_value (tree gnu_size) break; case CALL_EXPR: - { - tree t = maybe_inline_call_in_expr (gnu_size); - if (t) - return annotate_value (t); - } + /* In regular mode, inline back only if symbolic annotation is requested + in order to avoid memory explosion on big discriminated record types. + But not in ASIS mode, as symbolic annotation is required for DDA. */ + if (List_Representation_Info == 3 || type_annotate_only) + { + tree t = maybe_inline_call_in_expr (gnu_size); + if (t) + return annotate_value (t); + } + else + return Uint_Minus_1; /* Fall through... */ @@ -7592,11 +7594,10 @@ annotate_value (tree gnu_size) if (in.base.from) { struct tree_int_map **h; - /* We can't assume the hash table data hasn't moved since the - initial look up, so we have to search again. Allocating and - inserting an entry at that point would be an alternative, but - then we'd better discard the entry if we decided not to cache - it. */ + /* We can't assume the hash table data hasn't moved since the initial + look up, so we have to search again. Allocating and inserting an + entry at that point would be an alternative, but then we'd better + discard the entry if we decided not to cache it. */ h = (struct tree_int_map **) htab_find_slot (annotate_value_cache, &in, INSERT); gcc_assert (!*h); @@ -8922,4 +8923,24 @@ concat_name (tree gnu_name, const char *suffix) return get_identifier_with_length (new_name, len); } +/* Initialize data structures of the decl.c module. */ + +void +init_gnat_decl (void) +{ + /* Initialize the cache of annotated values. */ + annotate_value_cache + = htab_create_ggc (512, tree_int_map_hash, tree_int_map_eq, 0); +} + +/* Destroy data structures of the decl.c module. */ + +void +destroy_gnat_decl (void) +{ + /* Destroy the cache of annotated values. */ + htab_delete (annotate_value_cache); + annotate_value_cache = NULL; +} + #include "gt-ada-decl.h" diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h index b7092735c898..76fa2abde9f6 100644 --- a/gcc/ada/gcc-interface/gigi.h +++ b/gcc/ada/gcc-interface/gigi.h @@ -210,6 +210,12 @@ extern tree create_concat_name (Entity_Id gnat_entity, const char *suffix); the name followed by "___" and the specified suffix. */ extern tree concat_name (tree gnu_name, const char *suffix); +/* Initialize data structures of the decl.c module. */ +extern void init_gnat_decl (void); + +/* Destroy data structures of the decl.c module. */ +extern void destroy_gnat_decl (void); + /* Highest number in the front-end node table. */ extern int max_gnat_nodes; diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 4a4d0faa9f62..59358ff30286 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -353,6 +353,7 @@ gigi (Node_Id gnat_root, /* Initialize ourselves. */ init_code_table (); + init_gnat_decl (); init_gnat_utils (); /* If we are just annotating types, give VOID_TYPE zero sizes to avoid @@ -727,6 +728,7 @@ gigi (Node_Id gnat_root, } /* Destroy ourselves. */ + destroy_gnat_decl (); destroy_gnat_utils (); /* We cannot track the location of errors past this point. */ diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 014fe361b76d..cfa079191809 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -251,8 +251,8 @@ init_gnat_utils (void) dummy_node_table = ggc_alloc_cleared_vec_tree (max_gnat_nodes); /* Initialize the hash table of padded types. */ - pad_type_hash_table = htab_create_ggc (512, pad_type_hash_hash, - pad_type_hash_eq, 0); + pad_type_hash_table + = htab_create_ggc (512, pad_type_hash_hash, pad_type_hash_eq, 0); } /* Destroy data structures of the utils.c module. */ diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads index 90bf403c5bf5..ecefdadc6dfd 100644 --- a/gcc/ada/opt.ads +++ b/gcc/ada/opt.ads @@ -1371,12 +1371,6 @@ package Opt is -- initialized by Osint.Initialize, and further initialized by the -- Adjust_Global_Switches flag in Gnat1drv. - Suppress_Back_Annotation : Boolean := False; - -- GNAT - -- This flag is set True if back annotation of representation information - -- is to be suppressed. This is set if neither -gnatt or -gnatR0-3 is set. - -- This avoids unnecessary time being spent on back annotation. - Table_Factor : Int := 1; -- GNAT -- Factor by which all initial table sizes set in Alloc are multiplied. diff --git a/gcc/ada/repinfo.ads b/gcc/ada/repinfo.ads index 99fccc34d4a0..7896439a0b5a 100644 --- a/gcc/ada/repinfo.ads +++ b/gcc/ada/repinfo.ads @@ -108,6 +108,14 @@ package Repinfo is -- represent the value of such an expression, as explained in -- the following section. + -- Note: the extended back-annotation for the dynamic case is needed only + -- for -gnatR3 output, and for proper operation of the ASIS DDA. Since it + -- can be expensive to do this back annotation (for discriminated records + -- with many variable length arrays), we only do the full back annotation + -- in -gnatR3 mode, or ASIS mode. In any other mode, the back-end just sets + -- the value to Uint_Minus_1, indicating that the value of the attribute + -- depends on discriminant information, but not giving further details. + -- GCC expressions are represented with a Uint value that is negative. -- See the body of this package for details on the representation used. @@ -117,7 +125,9 @@ package Repinfo is -- as a negative Uint value, provides an expression which, when evaluated -- with a given set of discriminant values, indicates whether the variant -- is present for that set of values (result is True, i.e. non-zero) or - -- not present (result is False, i.e. zero). + -- not present (result is False, i.e. zero). Again, the full annotation of + -- this field is done only in -gnatR3 mode or in ASIS mode, and in other + -- modes, the value is set to Uint_Minus_1. subtype Node_Ref is Uint; -- Subtype used for negative Uint values used to represent nodes diff --git a/gcc/ada/types.h b/gcc/ada/types.h index 7d1e69624c5e..dd049db908a2 100644 --- a/gcc/ada/types.h +++ b/gcc/ada/types.h @@ -272,6 +272,8 @@ SUBTYPE (Uint_Direct, Uint, Uint_Direct_First, Uint_Direct_Last) #define Uint_10 (Uint_Direct_Bias + 10) #define Uint_16 (Uint_Direct_Bias + 16) +#define Uint_Minus_1 (Uint_Direct_Bias - 1) + /* Types for Ureal_Support Package: */ /* Type used for representation of universal reals. */