aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog20
-rw-r--r--gcc/ada/fe.h8
-rw-r--r--gcc/ada/gcc-interface/decl.c51
-rw-r--r--gcc/ada/gcc-interface/gigi.h6
-rw-r--r--gcc/ada/gcc-interface/trans.c2
-rw-r--r--gcc/ada/gcc-interface/utils.c4
-rw-r--r--gcc/ada/opt.ads6
-rw-r--r--gcc/ada/repinfo.ads12
-rw-r--r--gcc/ada/types.h2
9 files changed, 82 insertions, 29 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index a779988..b07c70c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,4 +1,24 @@
2014-04-14 Eric Botcazou <ebotcazou@adacore.com>
+ Robert Dewar <dewar@adacore.com>
+
+ * 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...
+ <CALL_EXPR>: 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 <ebotcazou@adacore.com>
* gcc-interface/decl.c (create_field_decl_from): Finalize non-constant
offset for the field, if any.
diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h
index 9b38903..d9fe48b 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 1e07693..ae512b0 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 b709273..76fa2ab 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 4a4d0fa..59358ff 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 014fe36..cfa0791 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 90bf403..ecefdad 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 99fccc3..7896439 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 7d1e696..dd049db 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. */