diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-09-30 16:19:38 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-09-30 16:19:38 +0000 |
commit | bd785b44932274f7067105de417938597289962c (patch) | |
tree | 503a651572b5e0035d9cb5422d10f45b3e051b5c /gcc/reginfo.c | |
parent | 0c88d078eba7f51d2e5fc76a630f7eb369c09c87 (diff) | |
download | gcc-bd785b44932274f7067105de417938597289962c.zip gcc-bd785b44932274f7067105de417938597289962c.tar.gz gcc-bd785b44932274f7067105de417938597289962c.tar.bz2 |
Add function_abi.{h,cc}
This patch adds new structures and functions for handling
multiple ABIs in a translation unit. The structures are:
- predefined_function_abi: describes a static, predefined ABI
- function_abi: describes either a predefined ABI or a local
variant of one (e.g. taking -fipa-ra into account)
The patch adds functions for getting the ABI from a given type
or decl; a later patch will also add a function for getting the
ABI of the target of a call insn.
Although ABIs are about much more than call-clobber/saved choices,
I wanted to keep the name general in case we add more ABI-related
information in future.
2019-09-30 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* Makefile.in (OBJS): Add function-abi.o.
(GTFILES): Add function-abi.h.
* function-abi.cc: New file.
* function-abi.h: Likewise.
* emit-rtl.h (rtl_data::abi): New field.
* function.c: Include function-abi.h.
(prepare_function_start): Initialize crtl->abi.
* read-rtl-function.c: Include regs.h and function-abi.h.
(read_rtl_function_body): Initialize crtl->abi.
(read_rtl_function_body_from_file_range): Likewise.
* reginfo.c: Include function-abi.h.
(init_reg_sets_1): Initialize default_function_abi.
(globalize_reg): Call add_full_reg_clobber for each predefined ABI
when making a register global.
* target-globals.h (this_target_function_abi_info): Declare.
(target_globals::function_abi_info): New field.
(restore_target_globals): Copy it.
* target-globals.c: Include function-abi.h.
(default_target_globals): Initialize the function_abi_info field.
(target_globals): Allocate it.
(save_target_globals): Free it.
From-SVN: r276307
Diffstat (limited to 'gcc/reginfo.c')
-rw-r--r-- | gcc/reginfo.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/reginfo.c b/gcc/reginfo.c index 22d0e68..a3fbbe6 100644 --- a/gcc/reginfo.c +++ b/gcc/reginfo.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "reload.h" #include "output.h" #include "tree-pass.h" +#include "function-abi.h" /* Maximum register number used in this function, plus one. */ @@ -419,6 +420,8 @@ init_reg_sets_1 (void) } } } + + default_function_abi.initialize (0, regs_invalidated_by_call); } /* Compute the table of register modes. @@ -728,7 +731,11 @@ globalize_reg (tree decl, int i) appropriate regs_invalidated_by_call bit, even if it's already set in fixed_regs. */ if (i != STACK_POINTER_REGNUM) - SET_HARD_REG_BIT (regs_invalidated_by_call, i); + { + SET_HARD_REG_BIT (regs_invalidated_by_call, i); + for (unsigned int i = 0; i < NUM_ABI_IDS; ++i) + function_abis[i].add_full_reg_clobber (i); + } /* If already fixed, nothing else to do. */ if (fixed_regs[i]) |