aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2016-06-02 13:46:20 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2016-06-02 06:46:20 -0700
commit4a2353126ec971d01425b1fdec42afa316804337 (patch)
treeb0b73d22e0c8a955f7f397790e174ba0ffe5305b /gcc/function.c
parentf3c5ecc2b984e186f043ad03cc7a96a6275f4670 (diff)
downloadgcc-4a2353126ec971d01425b1fdec42afa316804337.zip
gcc-4a2353126ec971d01425b1fdec42afa316804337.tar.gz
gcc-4a2353126ec971d01425b1fdec42afa316804337.tar.bz2
Update TARGET_FUNCTION_INCOMING_ARG documentation
On x86, interrupt handlers are only called by processors which push interrupt data onto stack at the address where the normal return address is. Since interrupt handlers must access interrupt data via pointers so that they can update interrupt data, the pointer argument is passed as "argument pointer - word". TARGET_FUNCTION_INCOMING_ARG defines how callee sees its argument. Normally it returns REG, NULL, or CONST_INT. This patch adds arbitrary address computation based on hard register, which can be forced into a register, to the list. When copying an incoming argument onto stack, assign_parm_setup_stack has: if (argument in memory) copy argument in memory to stack else move argument to stack Since an arbitrary address computation may be passed as an argument, we change it to: if (argument in memory) copy argument in memory to stack else { if (argument isn't in register) force argument into a register move argument to stack } * function.c (assign_parm_setup_stack): Force source into a register if needed. * target.def (function_incoming_arg): Update documentation to allow arbitrary address computation based on hard register. * doc/tm.texi: Regenerated. Co-Authored-By: Julia Koval <julia.koval@intel.com> From-SVN: r237037
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 726c20c..c15d47d 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3466,7 +3466,11 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
BLOCK_OP_NORMAL);
}
else
- emit_move_insn (dest, src);
+ {
+ if (!REG_P (src))
+ src = force_reg (GET_MODE (src), src);
+ emit_move_insn (dest, src);
+ }
}
if (to_conversion)