diff mbox

[Ada] Translate System.Address into void* for foreign convention

Message ID 2047812.XhmEgajTuQ@polaris
State New
Headers show

Commit Message

Eric Botcazou Dec. 7, 2016, 11:47 a.m. UTC
This was already the case for convention C.

Tested on x86_64-suse-linux, applied on the mainline.


2016-12-07  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Translate
	System.Address into ptr_type_node for every foreign convention.
	(gnat_to_gnu_subprog_type): Likewise for result and parameter types.
	(gnat_to_gnu_param): Do not do it here for GCC builtins.
	(intrin_return_compatible_p): Likewise.

-- 
Eric Botcazou
diff mbox

Patch

Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 243336)
+++ gcc-interface/decl.c	(working copy)
@@ -645,7 +645,7 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 	  }
 
 	/* Get the type after elaborating the renamed object.  */
-	if (Convention (gnat_entity) == Convention_C
+	if (Has_Foreign_Convention (gnat_entity)
 	    && Is_Descendant_Of_Address (gnat_type))
 	  gnu_type = ptr_type_node;
 	else
@@ -5404,12 +5404,6 @@  gnat_to_gnu_param (Entity_Id gnat_param,
     gnu_param_type
       = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_param_type))));
 
-  /* For GCC builtins, pass Address integer types as (void *)  */
-  if (Convention (gnat_subprog) == Convention_Intrinsic
-      && Present (Interface_Name (gnat_subprog))
-      && Is_Descendant_Of_Address (gnat_param_type))
-    gnu_param_type = ptr_type_node;
-
   /* Arrays are passed as pointers to element type for foreign conventions.  */
   if (foreign && mech != By_Copy && TREE_CODE (gnu_param_type) == ARRAY_TYPE)
     {
@@ -5784,7 +5778,9 @@  gnat_to_gnu_subprog_type (Entity_Id gnat
 
   else
     {
-      if (Convention (gnat_subprog) == Convention_C
+      /* For foreign convention subprograms, return System.Address as void *
+	 or equivalent.  Note that this comprises GCC builtins.  */
+      if (Has_Foreign_Convention (gnat_subprog)
 	  && Is_Descendant_Of_Address (gnat_return_type))
 	gnu_return_type = ptr_type_node;
       else
@@ -5949,7 +5945,9 @@  gnat_to_gnu_subprog_type (Entity_Id gnat
 	{
 	  Entity_Id gnat_param_type = Etype (gnat_param);
 
-	  if (Convention (gnat_subprog) == Convention_C
+	  /* For foreign convention subprograms, pass System.Address as void *
+	     or equivalent.  Note that this comprises GCC builtins.  */
+	  if (Has_Foreign_Convention (gnat_subprog)
 	      && Is_Descendant_Of_Address (gnat_param_type))
 	    gnu_param_type = ptr_type_node;
 	  else
@@ -8910,10 +8908,6 @@  intrin_return_compatible_p (intrin_bindi
       && !VOID_TYPE_P (btin_return_type))
     return true;
 
-  /* If return type is Address (integer type), map it to void *.  */
-  if (Is_Descendant_Of_Address (Etype (inb->gnat_entity)))
-    ada_return_type = ptr_type_node;
-
   /* Check return types compatibility otherwise.  Note that this
      handles void/void as well.  */
   if (intrin_types_incompatible_p (btin_return_type, ada_return_type))