aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/decl.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2020-03-03 17:57:51 +0000
committerPierre-Marie de Rodat <derodat@adacore.com>2020-06-19 04:17:29 -0400
commitc95f808ddd5046573423c9d1ee148645e5340738 (patch)
treea99db98e03a04564121575672e8da9a91648c849 /gcc/ada/gcc-interface/decl.c
parent906a759dcbedb3e56d61824cb7981ea395ca1f07 (diff)
downloadgcc-c95f808ddd5046573423c9d1ee148645e5340738.zip
gcc-c95f808ddd5046573423c9d1ee148645e5340738.tar.gz
gcc-c95f808ddd5046573423c9d1ee148645e5340738.tar.bz2
[Ada] AI12-0028-1 Import of variadic C functions
2020-06-19 Eric Botcazou <ebotcazou@adacore.com> gcc/ada/ * gcc-interface/decl.c (gnat_to_gnu_param): Tidy up. (gnat_to_gnu_subprog_type): For a variadic C function, do not build unnamed parameters and do not add final void node. * gcc-interface/misc.c: Include snames.h. * gcc-interface/trans.c (Attribute_to_gnu): Tidy up. (Call_to_gnu): Implement support for unnamed parameters in a variadic C function. * gcc-interface/utils.c: Include snames.h. (copy_type): Tidy up.
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
-rw-r--r--gcc/ada/gcc-interface/decl.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 38c73cb..33d59d5 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -5401,8 +5401,8 @@ gnat_to_gnu_param (Entity_Id gnat_param, tree gnu_param_type, bool first,
tree unpadded_type = TREE_TYPE (TYPE_FIELDS (gnu_param_type));
if (foreign
- || (!must_pass_by_ref (unpadded_type)
- && mech != By_Reference
+ || (mech != By_Reference
+ && !must_pass_by_ref (unpadded_type)
&& (mech == By_Copy || !default_pass_by_ref (unpadded_type))
&& TYPE_ALIGN (unpadded_type) >= TYPE_ALIGN (gnu_param_type)))
gnu_param_type = unpadded_type;
@@ -5424,11 +5424,6 @@ gnat_to_gnu_param (Entity_Id gnat_param, tree gnu_param_type, bool first,
gnu_param_type = TREE_TYPE (gnu_param_type);
gnu_param_type = TREE_TYPE (gnu_param_type);
-
- if (ro_param)
- gnu_param_type
- = change_qualified_type (gnu_param_type, TYPE_QUAL_CONST);
-
gnu_param_type = build_pointer_type (gnu_param_type);
by_component_ptr = true;
}
@@ -5760,6 +5755,7 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition,
{
const Entity_Kind kind = Ekind (gnat_subprog);
const bool method_p = is_cplusplus_method (gnat_subprog);
+ const bool variadic = IN (Convention (gnat_subprog), Convention_C_Variadic);
Entity_Id gnat_return_type = Etype (gnat_subprog);
Entity_Id gnat_param;
tree gnu_type = present_gnu_tree (gnat_subprog)
@@ -5792,7 +5788,7 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition,
bool return_by_invisi_ref_p = false;
bool return_unconstrained_p = false;
bool incomplete_profile_p = false;
- unsigned int num;
+ int num;
/* Look into the return type and get its associated GCC tree if it is not
void, and then compute various flags for the subprogram type. But make
@@ -5962,6 +5958,11 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition,
tree gnu_param, gnu_param_type;
bool cico = false;
+ /* For a variadic C function, do not build unnamed parameters. */
+ if (variadic
+ && num == (Convention (gnat_subprog) - Convention_C_Variadic_0))
+ break;
+
/* Fetch an existing parameter with complete type and reuse it. But we
didn't save the CICO property so we can only do it for In parameters
or parameters passed by reference. */
@@ -6195,7 +6196,8 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition,
/* The lists have been built in reverse. */
gnu_param_type_list = nreverse (gnu_param_type_list);
- gnu_param_type_list = chainon (gnu_param_type_list, void_list_node);
+ if (!variadic)
+ gnu_param_type_list = chainon (gnu_param_type_list, void_list_node);
gnu_param_list = nreverse (gnu_param_list);
gnu_cico_list = nreverse (gnu_cico_list);