diff options
author | Richard Henderson <rth@cygnus.com> | 1998-09-15 12:19:12 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1998-09-15 12:19:12 -0700 |
commit | 710384268d9df98e595cd68c5e8db84d766d5513 (patch) | |
tree | 5f8b92560efd1078cbd16601e8b3502296539971 /gcc/function.c | |
parent | dfb16e8307d6ca6f9ddf22dea3400324355a60a7 (diff) | |
download | gcc-710384268d9df98e595cd68c5e8db84d766d5513.zip gcc-710384268d9df98e595cd68c5e8db84d766d5513.tar.gz gcc-710384268d9df98e595cd68c5e8db84d766d5513.tar.bz2 |
tree.h (BUILT_IN_CALLER_RETURN_ADDRESS): Unused.
* tree.h (BUILT_IN_CALLER_RETURN_ADDRESS): Unused. Kill.
(BUILT_IN_FP, BUILT_IN_SP, BUILT_IN_SET_RETURN_ADDR_REG): Kill.
(BUILT_IN_EH_STUB_OLD, BUILT_IN_EH_STUB, BUILT_IN_SET_EH_REGS): Kill.
(BUILT_IN_EH_RETURN, BUILT_IN_DWARF_CFA): New.
* c-decl.c (init_decl_processing): Update accordingly.
* expr.c (expand_builtin): Likewise.
* cp/decl.c (init_decl_processing): Likewise.
* rtl.h (global_rtl): Add cfa entry.
(virtual_cfa_rtx, VIRTUAL_CFA_REGNUM): New.
(LAST_VIRTUAL_REGISTER): Update.
* emit-rtl.c (global_rtl): Add cfa entry.
(init_emit): Initialize it.
* function.c (cfa_offset): New.
(instantiate_virtual_regs): Initialize it.
(instantiate_virtual_regs_1): Instantiate virtual_cfa_rtx.
(expand_function_end): Call expand_eh_return.
* tm.texi (ARG_POINTER_CFA_OFFSET): New.
* except.c (current_function_eh_stub_label): Kill.
(current_function_eh_old_stub_label): Likwise; update all references.
(expand_builtin_set_return_addr_reg): Kill.
(expand_builtin_eh_stub_old, expand_builtin_eh_stub): Kill.
(expand_builtin_set_eh_regs): Kill.
(eh_regs): Produce a third reg for the actual handler address.
(eh_return_context, eh_return_stack_adjust): New.
(eh_return_handler, eh_return_stub_label): New.
(init_eh_for_function): Initialize them.
(expand_builtin_eh_return, expand_eh_return): New.
* except.h: Update prototypes.
* flow.c (find_basic_blocks_1): Update references to the stub label.
* function.h (struct function): Kill stub label elements.
* libgcc2.c (in_reg_window): For REG_SAVED_REG, check that the
register number is one that would be in the previous window.
Provide a dummy definition for non-windowed targets.
(get_reg_addr): New function.
(get_reg, put_reg, copy_reg): Use it.
(__throw): Rely on in_reg_window, not INCOMING_REGNO. Kill stub
generating code and use __builtin_eh_return. Use __builtin_dwarf_cfa.
* alpha.c (alpha_eh_epilogue_sp_ofs): New.
(alpha_init_expanders): Initialize it.
(alpha_expand_epilogue): Use it.
* alpha.h: Declare it.
* alpha.md (eh_epilogue): New.
* m68h.h (ARG_POINTER_CFA_OFFSET): New.
* sparc.h (ARG_POINTER_CFA_OFFSET): New.
From-SVN: r22436
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/function.c b/gcc/function.c index 5bd012fc..a5f8f05 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2688,6 +2688,7 @@ static int in_arg_offset; static int var_offset; static int dynamic_offset; static int out_arg_offset; +static int cfa_offset; /* In most machines, the stack pointer register is equivalent to the bottom of the stack. */ @@ -2726,6 +2727,13 @@ static int out_arg_offset; #endif #endif +/* On a few machines, the CFA coincides with the arg pointer. */ + +#ifndef ARG_POINTER_CFA_OFFSET +#define ARG_POINTER_CFA_OFFSET 0 +#endif + + /* Build up a (MEM (ADDRESSOF (REG))) rtx for a register REG that just had its address taken. DECL is the decl for the object stored in the register, for later use if we do need to force REG into the stack. @@ -2910,6 +2918,7 @@ instantiate_virtual_regs (fndecl, insns) var_offset = STARTING_FRAME_OFFSET; dynamic_offset = STACK_DYNAMIC_OFFSET (fndecl); out_arg_offset = STACK_POINTER_OFFSET; + cfa_offset = ARG_POINTER_CFA_OFFSET; /* Scan all variables and parameters of this function. For each that is in memory, instantiate all virtual registers if the result is a valid @@ -3143,6 +3152,8 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) new = stack_pointer_rtx, offset = - dynamic_offset; else if (SET_DEST (x) == virtual_outgoing_args_rtx) new = stack_pointer_rtx, offset = - out_arg_offset; + else if (SET_DEST (x) == virtual_cfa_rtx) + new = arg_pointer_rtx, offset = - cfa_offset; if (new) { @@ -3194,6 +3205,8 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) new = stack_pointer_rtx, offset = dynamic_offset; else if (inner == virtual_outgoing_args_rtx) new = stack_pointer_rtx, offset = out_arg_offset; + else if (inner == virtual_cfa_rtx) + new = arg_pointer_rtx, offset = cfa_offset; else { loc = &XEXP (x, 0); @@ -3213,6 +3226,8 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) new = stack_pointer_rtx, offset = dynamic_offset; else if (XEXP (x, 0) == virtual_outgoing_args_rtx) new = stack_pointer_rtx, offset = out_arg_offset; + else if (XEXP (x, 0) == virtual_cfa_rtx) + new = arg_pointer_rtx, offset = cfa_offset; else { /* We know the second operand is a constant. Unless the @@ -3420,6 +3435,8 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) new = stack_pointer_rtx, offset = dynamic_offset; else if (x == virtual_outgoing_args_rtx) new = stack_pointer_rtx, offset = out_arg_offset; + else if (x == virtual_cfa_rtx) + new = arg_pointer_rtx, offset = cfa_offset; if (new) { @@ -5981,6 +5998,10 @@ expand_function_end (filename, line, end_bindings) use_variable (outgoing); } + /* If this is an implementation of __throw, do what's necessary to + communicate between __builtin_eh_return and the epilogue. */ + expand_eh_return (); + /* Output a return insn if we are using one. Otherwise, let the rtl chain end here, to drop through into the epilogue. */ |