diff options
author | Doug Rupp <rupp@adacore.com> | 2008-07-30 13:06:45 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2008-07-30 15:06:45 +0200 |
commit | 6ca2b0a0388c2944e222aab817db7f09bd2f96c4 (patch) | |
tree | 6c15c021426f1cd845672d23d0d9b84ea0fdac47 /gcc/ada/gcc-interface/utils2.c | |
parent | 002b2ad6a99fb1e713fb27fffdfc2135319a5a0c (diff) | |
download | gcc-6ca2b0a0388c2944e222aab817db7f09bd2f96c4.zip gcc-6ca2b0a0388c2944e222aab817db7f09bd2f96c4.tar.gz gcc-6ca2b0a0388c2944e222aab817db7f09bd2f96c4.tar.bz2 |
gigi.h (build_vms_descriptor64): New function prototype.
2008-07-30 Doug Rupp <rupp@adacore.com>
* gigi.h (build_vms_descriptor64): New function prototype.
(fill_vms_descriptor): Modified function prototype.
* utils.c (build_vms_descriptor64): New function.
* utils2.c (fill_vms_descriptor): Fix handling on 32bit systems.
* trans.c (call_to_gnu): Call fill_vms_descriptor with new third
argument.
* decl.c (gnat_to_gnu_tree): For By_Descriptor mech, build both a
64bit and 32bit descriptor and save the 64bit version as an alternate
TREE_TYPE in the parameter.
(make_type_from_size) <RECORD_TYPE>: Use the appropriate mode for the
thin pointer.
* ada-tree.h (DECL_PARM_ALT, SET_DECL_PARM_ALT): New macros.
From-SVN: r138307
Diffstat (limited to 'gcc/ada/gcc-interface/utils2.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils2.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 300fbd3..1ed1b9f 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -2151,15 +2151,43 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc, } /* Fill in a VMS descriptor for EXPR and return a constructor for it. - GNAT_FORMAL is how we find the descriptor record. */ + GNAT_FORMAL is how we find the descriptor record. GNAT_ACTUAL is + how we find the allocator size which determines whether to use the + alternate 64bit descriptor. */ tree -fill_vms_descriptor (tree expr, Entity_Id gnat_formal) +fill_vms_descriptor (tree expr, Entity_Id gnat_formal, Node_Id gnat_actual) { - tree record_type = TREE_TYPE (TREE_TYPE (get_gnu_tree (gnat_formal))); tree field; + tree parm_decl = get_gnu_tree (gnat_formal); tree const_list = NULL_TREE; + int size; + tree record_type; + + /* A string literal will always be in 32bit space on VMS. Where + will it be on other 64bit systems??? + An identifier's allocation may be unknown at compile time. + An explicit dereference could be either in 32bit or 64bit space. + Don't know about other possibilities, so assume unknown which + will result in fetching the 64bit descriptor. ??? */ + if (Nkind (gnat_actual) == N_String_Literal) + size = 32; + else if (Nkind (gnat_actual) == N_Identifier) + size = UI_To_Int (Esize (Etype (gnat_actual))); + else if (Nkind (gnat_actual) == N_Explicit_Dereference) + size = UI_To_Int (Esize (Etype (Prefix (gnat_actual)))); + else + size = 0; + + /* If size is unknown, make it POINTER_SIZE */ + if (size == 0) + size = POINTER_SIZE; + + /* If size is 64bits grab the alternate 64bit descriptor. */ + if (size == 64) + TREE_TYPE (parm_decl) = DECL_PARM_ALT (parm_decl); + record_type = TREE_TYPE (TREE_TYPE (parm_decl)); expr = maybe_unconstrained_array (expr); gnat_mark_addressable (expr); |