diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-08-01 13:11:51 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-08-01 13:11:51 +0000 |
commit | 6b093baca5fbc57e691d26fd6ae2b91b74926749 (patch) | |
tree | c78fc395f38e41cf5681348f04c910021465f384 /gcc/ada/gcc-interface/utils.c | |
parent | 8df2e9022925c06ab369d74a301bcf081ddc417e (diff) | |
download | gcc-6b093baca5fbc57e691d26fd6ae2b91b74926749.zip gcc-6b093baca5fbc57e691d26fd6ae2b91b74926749.tar.gz gcc-6b093baca5fbc57e691d26fd6ae2b91b74926749.tar.bz2 |
Revert incorrect patch.
From-SVN: r138514
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index dcf0558..f1c673a8 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -3564,45 +3564,54 @@ 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. 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. */ +/* 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. */ static tree -convert_vms_descriptor (tree gnu_type, tree gnu_expr, tree gnu_expr_alt_type, - Entity_Id gnat_subprog) +convert_vms_descriptor (tree gnu_type, tree gnu_expr, 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, gnu_expr32, gnu_expr64; + tree is64bit; + tree save_type = TREE_TYPE (gnu_expr); + tree 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); - /* Build the test for 64-bit descriptor. */ + /* Otherwise primary must be 64bit and alternate 32bit */ + + /* Test for 64bit 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)); - - /* 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); + 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 (); } /* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG @@ -3633,11 +3642,8 @@ 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, - DECL_PARM_ALT_TYPE (gnu_stub_param), - gnat_subprog); + gnu_param = convert_vms_descriptor (TREE_VALUE (gnu_arg_types), + gnu_stub_param, gnat_subprog); else gnu_param = gnu_stub_param; |