diff options
author | Donn Terry <donn@interix.com> | 1999-05-08 01:58:39 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-05-07 18:58:39 -0700 |
commit | 91ab104696a8ea53982115aabd749e3d936b3d12 (patch) | |
tree | 8a7708519c521e82775f1776d4f648ca7462541f /gcc/calls.c | |
parent | fdc829c7fa69cee30a2aa78991b2326593d45d3e (diff) | |
download | gcc-91ab104696a8ea53982115aabd749e3d936b3d12.zip gcc-91ab104696a8ea53982115aabd749e3d936b3d12.tar.gz gcc-91ab104696a8ea53982115aabd749e3d936b3d12.tar.bz2 |
Donn Terry (donn@interix.com)
Donn Terry (donn@interix.com)
* calls.c (rtx_for_function_call): Extend function pointer being
passed to chkr_check_exec_libfunc, if needed.
From-SVN: r26838
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index 03bac91..d0153a3 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1407,15 +1407,25 @@ rtx_for_function_call (fndecl, exp) else /* Generate an rtx (probably a pseudo-register) for the address. */ { + rtx funaddr; push_temp_slots (); - funexp = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0); + funaddr = funexp = + expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0); pop_temp_slots (); /* FUNEXP can't be BLKmode */ /* Check the function is executable. */ if (current_function_check_memory_usage) - emit_library_call (chkr_check_exec_libfunc, 1, - VOIDmode, 1, - funexp, Pmode); + { +#ifdef POINTERS_EXTEND_UNSIGNED + /* It might be OK to convert funexp in place, but there's + a lot going on between here and when it happens naturally + that this seems safer. */ + funaddr = convert_memory_address (Pmode, funexp); +#endif + emit_library_call (chkr_check_exec_libfunc, 1, + VOIDmode, 1, + funaddr, Pmode); + } emit_queue (); } return funexp; |