summaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/decl.c
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-07 11:47:25 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-07 11:47:25 +0000
commitb8710bb58c5b17aa4988ae5099f294fe26e19a66 (patch)
tree8b209e7ef3aee08090d36a46b566d58761eb6b32 /gcc/ada/gcc-interface/decl.c
parent77532bfb8066fff4bd5c41e7719e796454975db1 (diff)
downloadgcc-b8710bb58c5b17aa4988ae5099f294fe26e19a66.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@243340 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
-rw-r--r--gcc/ada/gcc-interface/decl.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 2412a36d984..a6e8367d842 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -645,7 +645,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
}
/* 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, tree gnu_param_type, bool first,
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_subprog, bool definition,
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_subprog, bool definition,
{
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_binding_t * inb)
&& !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))