aboutsummaryrefslogtreecommitdiff
path: root/gcc/calls.c
diff options
context:
space:
mode:
authorDonn Terry <donn@interix.com>1999-05-08 01:58:39 +0000
committerRichard Henderson <rth@gcc.gnu.org>1999-05-07 18:58:39 -0700
commit91ab104696a8ea53982115aabd749e3d936b3d12 (patch)
tree8a7708519c521e82775f1776d4f648ca7462541f /gcc/calls.c
parentfdc829c7fa69cee30a2aa78991b2326593d45d3e (diff)
downloadgcc-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.c18
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;