diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2008-08-01 14:02:10 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-08-01 14:02:10 +0000 |
commit | a981c964023a0ce4a6450c7ebd059450d81cbc1e (patch) | |
tree | 0c627408280bbfa72c8c792436ff4b7096d2bb97 /gcc/ada/gcc-interface/utils.c | |
parent | de1132d194a883fb817520e0c1f1a44b294fd7f5 (diff) | |
download | gcc-a981c964023a0ce4a6450c7ebd059450d81cbc1e.zip gcc-a981c964023a0ce4a6450c7ebd059450d81cbc1e.tar.gz gcc-a981c964023a0ce4a6450c7ebd059450d81cbc1e.tar.bz2 |
ada-tree.h (DECL_PARM_ALT): Now DECL_PARM_ALT_TYPE.
* gcc-interface/ada-tree.h (DECL_PARM_ALT): Now DECL_PARM_ALT_TYPE.
* gcc-interface/decl.c (gnat_to_gnu_param): Fix formatting, simplify
and adjust for above renaming.
* gcc-interface/utils.c (convert_vms_descriptor): Likewise. Add new
gnu_expr_alt_type parameter. Convert the expression to it instead
of changing its type in place.
(build_function_stub): Adjust call to above function.
From-SVN: r138518
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index f1c673a8..dcf0558 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -3564,54 +3564,45 @@ convert_vms_descriptor32 (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog) gcc_unreachable (); } -/* Convert GNU_EXPR, a pointer to a VMS descriptor, to GNU_TYPE, a - regular pointer or fat pointer type. GNAT_SUBPROG is the subprogram to - which the VMS descriptor is passed. */ +/* Convert GNU_EXPR, a pointer to a VMS descriptor, to GNU_TYPE, a regular + pointer or fat pointer type. GNU_EXPR_ALT_TYPE is the alternate (32-bit) + pointer type of GNU_EXPR. GNAT_SUBPROG is the subprogram to which the + VMS descriptor is passed. */ static tree -convert_vms_descriptor (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog) +convert_vms_descriptor (tree gnu_type, tree gnu_expr, tree gnu_expr_alt_type, + Entity_Id gnat_subprog) { tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr)); tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr); tree mbo = TYPE_FIELDS (desc_type); const char *mbostr = IDENTIFIER_POINTER (DECL_NAME (mbo)); tree mbmo = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (mbo))); - tree is64bit; - tree save_type = TREE_TYPE (gnu_expr); - tree gnu_expr32, gnu_expr64; + tree is64bit, gnu_expr32, gnu_expr64; + /* If the field name is not MBO, it must be 32-bit and no alternate. + Otherwise primary must be 64-bit and alternate 32-bit. */ if (strcmp (mbostr, "MBO") != 0) - /* If the field name is not MBO, it must be 32bit and no alternate */ return convert_vms_descriptor32 (gnu_type, gnu_expr, gnat_subprog); - /* Otherwise primary must be 64bit and alternate 32bit */ - - /* Test for 64bit descriptor */ + /* Build the test for 64-bit descriptor. */ mbo = build3 (COMPONENT_REF, TREE_TYPE (mbo), desc, mbo, NULL_TREE); mbmo = build3 (COMPONENT_REF, TREE_TYPE (mbmo), desc, mbmo, NULL_TREE); - is64bit = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node, - build_binary_op (EQ_EXPR, integer_type_node, - convert (integer_type_node, mbo), - integer_one_node), - build_binary_op (EQ_EXPR, integer_type_node, - convert (integer_type_node, mbmo), - integer_minus_one_node)); - - gnu_expr64 = convert_vms_descriptor64 (gnu_type, gnu_expr, - gnat_subprog); - /* Convert 32bit alternate. Hack alert ??? */ - TREE_TYPE (gnu_expr) = DECL_PARM_ALT (gnu_expr); - gnu_expr32 = convert_vms_descriptor32 (gnu_type, gnu_expr, - gnat_subprog); - TREE_TYPE (gnu_expr) = save_type; - - if (POINTER_TYPE_P (gnu_type)) - return build3 (COND_EXPR, gnu_type, is64bit, gnu_expr64, gnu_expr32); - - else if (TYPE_FAT_POINTER_P (gnu_type)) - return build3 (COND_EXPR, gnu_type, is64bit, gnu_expr64, gnu_expr32); - else - gcc_unreachable (); + is64bit + = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node, + build_binary_op (EQ_EXPR, integer_type_node, + convert (integer_type_node, mbo), + integer_one_node), + build_binary_op (EQ_EXPR, integer_type_node, + convert (integer_type_node, mbmo), + integer_minus_one_node)); + + /* Build the 2 possible end results. */ + gnu_expr64 = convert_vms_descriptor64 (gnu_type, gnu_expr, gnat_subprog); + gnu_expr = fold_convert (gnu_expr_alt_type, gnu_expr); + gnu_expr32 = convert_vms_descriptor32 (gnu_type, gnu_expr, gnat_subprog); + + return build3 (COND_EXPR, gnu_type, is64bit, gnu_expr64, gnu_expr32); } /* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG @@ -3642,8 +3633,11 @@ build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog) gnu_arg_types = TREE_CHAIN (gnu_arg_types)) { if (DECL_BY_DESCRIPTOR_P (gnu_stub_param)) - gnu_param = convert_vms_descriptor (TREE_VALUE (gnu_arg_types), - gnu_stub_param, gnat_subprog); + gnu_param + = convert_vms_descriptor (TREE_VALUE (gnu_arg_types), + gnu_stub_param, + DECL_PARM_ALT_TYPE (gnu_stub_param), + gnat_subprog); else gnu_param = gnu_stub_param; |