diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2008-08-04 11:07:31 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2008-08-04 11:07:31 +0200 |
commit | bdc33a55e85d7a895f88f70fb41b258955afd8e0 (patch) | |
tree | d7afd3724879ba9a47afaf42ff67b1ce21d97e59 /gcc/ada/gcc-interface/utils2.c | |
parent | 7b84d8c1398f621c8b6f7ab33ef9cdb94235bc0c (diff) | |
download | gcc-bdc33a55e85d7a895f88f70fb41b258955afd8e0.zip gcc-bdc33a55e85d7a895f88f70fb41b258955afd8e0.tar.gz gcc-bdc33a55e85d7a895f88f70fb41b258955afd8e0.tar.bz2 |
2008-08-04 Doug Rupp <rupp@adacore.com>
* gcc-interface/utils2.c:
(fill_vms_descriptor): Raise CE if attempt made to pass 64bit pointer
in 32bit descriptor.
From-SVN: r138588
Diffstat (limited to 'gcc/ada/gcc-interface/utils2.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils2.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index d1a6786..8cd6155 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -2169,19 +2169,37 @@ fill_vms_descriptor (tree expr, Entity_Id gnat_formal) tree field; tree parm_decl = get_gnu_tree (gnat_formal); tree const_list = NULL_TREE; - tree record_type; + tree record_type = TREE_TYPE (TREE_TYPE (parm_decl)); + int do_range_check = + strcmp ("MBO", + IDENTIFIER_POINTER (DECL_NAME (TYPE_FIELDS (record_type)))); - record_type = TREE_TYPE (TREE_TYPE (parm_decl)); expr = maybe_unconstrained_array (expr); gnat_mark_addressable (expr); for (field = TYPE_FIELDS (record_type); field; field = TREE_CHAIN (field)) - const_list - = tree_cons (field, - convert (TREE_TYPE (field), - SUBSTITUTE_PLACEHOLDER_IN_EXPR - (DECL_INITIAL (field), expr)), - const_list); + { + tree conexpr = convert (TREE_TYPE (field), + SUBSTITUTE_PLACEHOLDER_IN_EXPR + (DECL_INITIAL (field), expr)); + + /* Check to ensure that only 32bit pointers are passed in + 32bit descriptors */ + if (do_range_check && + strcmp (IDENTIFIER_POINTER (DECL_NAME (field)), "POINTER") == 0) + { + tree t = build3 (COND_EXPR, void_type_node, + build_binary_op (LT_EXPR, integer_type_node, + convert (integer_type_node, + conexpr), + integer_zero_node), + build_call_raise (CE_Range_Check_Failed, Empty, + N_Raise_Constraint_Error), + NULL_TREE); + add_stmt (t); + } + const_list = tree_cons (field, conexpr, const_list); + } return gnat_build_constructor (record_type, nreverse (const_list)); } |