From: Pierre-Marie de Rodat Date: Wed, 30 Jul 2014 12:52:44 +0000 (+0200) Subject: decl.c (gnat_to_gnu_entity): Create a mere scalar constant instead of a reference... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e8fa3dcdd50c6c532d9dab2da73b3dd23f5c27cb;p=gcc.git decl.c (gnat_to_gnu_entity): Create a mere scalar constant instead of a reference for a renaming of scalar... 2014-07-30 Pierre-Marie Derodat * gcc-interface/decl.c (gnat_to_gnu_entity) : Create a mere scalar constant instead of a reference for a renaming of scalar literal. * gcc-interface/utils.c (renaming_from_generic_instantiation_p): New. * gcc-interface/gigi.h (renaming_from_generic_instantiation_p): New. From-SVN: r213258 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fa02f389d3f..0b04cd74174 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2014-07-30 Pierre-Marie Derodat + + * gcc-interface/decl.c (gnat_to_gnu_entity) : Create a + mere scalar constant instead of a reference for a renaming of + scalar literal. + * gcc-interface/utils.c (renaming_from_generic_instantiation_p): New. + * gcc-interface/gigi.h (renaming_from_generic_instantiation_p): New. + 2014-07-30 Robert Dewar * s-tasuti.adb, s-tasuti.ads, einfo.ads, sem_prag.adb, s-taasde.adb, diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 6ece8d87b30..10eb6cc2538 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -349,9 +349,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) || Is_Public (gnat_entity)); /* Get the name of the entity and set up the line number and filename of - the original definition for use in any decl we make. */ + the original definition for use in any decl we make. Make sure we do not + inherit another source location. */ gnu_entity_name = get_entity_name (gnat_entity); - Sloc_to_locus (Sloc (gnat_entity), &input_location); + if (Sloc (gnat_entity) != No_Location + && !renaming_from_generic_instantiation_p (gnat_entity)) + Sloc_to_locus (Sloc (gnat_entity), &input_location); /* For cases when we are not defining (i.e., we are referencing from another compilation unit) public entities, show we are at global level @@ -1988,7 +1991,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) maybe_present = true; break; - /* Array and String Types and Subtypes + /* Array Types and Subtypes Unconstrained array types are represented by E_Array_Type and constrained array types are represented by E_Array_Subtype. There @@ -2001,7 +2004,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) Number_Dimensions Number of dimensions (an int). First_Index Type of first index. */ - case E_String_Type: case E_Array_Type: { const bool convention_fortran_p @@ -2312,7 +2314,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) } break; - case E_String_Subtype: case E_Array_Subtype: /* This is the actual data type for array variables. Multidimensional diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h index 76fa2abde9f..6d83203981d 100644 --- a/gcc/ada/gcc-interface/gigi.h +++ b/gcc/ada/gcc-interface/gigi.h @@ -1017,6 +1017,12 @@ extern int fp_prec_to_size (int prec); /* Return the precision of the FP mode with size SIZE. */ extern int fp_size_to_prec (int size); +/* Return whether GNAT_NODE is a defining identifier for a renaming that comes + from the parameter association for the instantiation of a generic. We do + not want to emit source location for them: the code generated for their + initialization is likely to disturb debugging. */ +extern bool renaming_from_generic_instantiation_p (Node_Id gnat_node); + #ifdef __cplusplus extern "C" { #endif diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 2c15c98f0aa..a9afc53f41f 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -580,7 +580,7 @@ gnat_pushdecl (tree decl, Node_Id gnat_node) TREE_NO_WARNING (decl) = (No (gnat_node) || Warnings_Off (gnat_node)); /* Set the location of DECL and emit a declaration for it. */ - if (Present (gnat_node)) + if (Present (gnat_node) && !renaming_from_generic_instantiation_p (gnat_node)) Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl)); add_decl_expr (decl, gnat_node); @@ -2550,6 +2550,37 @@ value_factor_p (tree value, HOST_WIDE_INT factor) return false; } +/* Return whether GNAT_NODE is a defining identifier for a renaming that comes + from the parameter association for the instantiation of a generic. We do + not want to emit source location for them: the code generated for their + initialization is likely to disturb debugging. */ + +bool +renaming_from_generic_instantiation_p (Node_Id gnat_node) +{ + if (Nkind (gnat_node) != N_Defining_Identifier + || !IN (Ekind (gnat_node), Object_Kind) + || Comes_From_Source (gnat_node) + || !Present (Renamed_Object (gnat_node))) + return false; + + /* Get the object declaration of the renamed object, if any and if the + renamed object is a mere identifier. */ + gnat_node = Renamed_Object (gnat_node); + if (Nkind (gnat_node) != N_Identifier) + return false; + + gnat_node = Entity (gnat_node); + if (!Present (Parent (gnat_node))) + return false; + + gnat_node = Parent (gnat_node); + return + (Present (gnat_node) + && Nkind (gnat_node) == N_Object_Declaration + && Present (Corresponding_Generic_Association (gnat_node))); +} + /* Return VALUE scaled by the biggest power-of-2 factor of EXPR. */ static unsigned int