diff mbox

[Ada] Improve quality of generated code for address clauses

Message ID 1959446.cc1UzeogaB@polaris
State New
Headers show

Commit Message

Eric Botcazou Oct. 11, 2016, 10:11 a.m. UTC
Tested on x86_64-suse-linux, applied on the mainline.


2016-10-11  Tristan Gingold  <gingold@adacore.com>

	* fe.h (Constant_Value): Declare.
	* gcc-interface/decl.c (compile_time_known_address_p): Also consider
	references to constants.
diff mbox

Patch

Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 323965)
+++ gcc-interface/decl.c	(revision 323966)
@@ -6332,6 +6332,15 @@  array_type_has_nonaliased_component (tre
 static bool
 compile_time_known_address_p (Node_Id gnat_address)
 {
+  /* Handle reference to a constant.  */
+  if (Is_Entity_Name (gnat_address)
+      && Ekind (Entity (gnat_address)) == E_Constant)
+    {
+      gnat_address = Constant_Value (Entity (gnat_address));
+      if (No (gnat_address))
+	return false;
+    }
+
   /* Catch System'To_Address.  */
   if (Nkind (gnat_address) == N_Unchecked_Type_Conversion)
     gnat_address = Expression (gnat_address);
Index: fe.h
===================================================================
--- fe.h	(revision 323963)
+++ fe.h	(revision 323964)
@@ -6,7 +6,7 @@ 
  *                                                                          *
  *                              C Header File                               *
  *                                                                          *
- *          Copyright (C) 1992-2015, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2016, 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- *
@@ -226,6 +226,7 @@  extern Boolean Is_Others_Aggregate (Node
 /* sem_aux:  */
 
 #define Ancestor_Subtype               sem_aux__ancestor_subtype
+#define Constant_Value                 sem_aux__constant_value
 #define First_Discriminant             sem_aux__first_discriminant
 #define First_Stored_Discriminant      sem_aux__first_stored_discriminant
 #define First_Subtype                  sem_aux__first_subtype
@@ -233,6 +234,7 @@  extern Boolean Is_Others_Aggregate (Node
 #define Is_Derived_Type                sem_aux__is_derived_type
 
 extern Entity_Id  Ancestor_Subtype             (Entity_Id);
+extern Node_Id    Constant_Value               (Entity_Id);
 extern Entity_Id  First_Discriminant           (Entity_Id);
 extern Entity_Id  First_Stored_Discriminant    (Entity_Id);
 extern Entity_Id  First_Subtype                (Entity_Id);