Home | History | Annotate | Line # | Download | only in gcc
      1      1.1  mrg /* Information about fuunction binary interfaces.
      2  1.1.1.2  mrg    Copyright (C) 2019-2022 Free Software Foundation, Inc.
      3      1.1  mrg 
      4      1.1  mrg This file is part of GCC
      5      1.1  mrg 
      6      1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      7      1.1  mrg the terms of the GNU General Public License as published by the Free
      8      1.1  mrg Software Foundation; either version 3, or (at your option) any later
      9      1.1  mrg version.
     10      1.1  mrg 
     11      1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     12      1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13      1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14      1.1  mrg for more details.
     15      1.1  mrg 
     16      1.1  mrg You should have received a copy of the GNU General Public License
     17      1.1  mrg along with GCC; see the file COPYING3.  If not see
     18      1.1  mrg <http://www.gnu.org/licenses/>.  */
     19      1.1  mrg 
     20      1.1  mrg #include "config.h"
     21      1.1  mrg #include "system.h"
     22      1.1  mrg #include "coretypes.h"
     23      1.1  mrg #include "backend.h"
     24      1.1  mrg #include "target.h"
     25      1.1  mrg #include "rtl.h"
     26      1.1  mrg #include "tree.h"
     27      1.1  mrg #include "regs.h"
     28      1.1  mrg #include "function-abi.h"
     29      1.1  mrg #include "varasm.h"
     30      1.1  mrg #include "cgraph.h"
     31      1.1  mrg 
     32      1.1  mrg target_function_abi_info default_target_function_abi_info;
     33      1.1  mrg #if SWITCHABLE_TARGET
     34      1.1  mrg target_function_abi_info *this_target_function_abi_info
     35      1.1  mrg   = &default_target_function_abi_info;
     36      1.1  mrg #endif
     37      1.1  mrg 
     38      1.1  mrg /* Initialize a predefined function ABI with the given values of
     39      1.1  mrg    ID and FULL_REG_CLOBBERS.  */
     40      1.1  mrg 
     41      1.1  mrg void
     42      1.1  mrg predefined_function_abi::initialize (unsigned int id,
     43      1.1  mrg 				     const_hard_reg_set full_reg_clobbers)
     44      1.1  mrg {
     45      1.1  mrg   m_id = id;
     46      1.1  mrg   m_initialized = true;
     47      1.1  mrg   m_full_reg_clobbers = full_reg_clobbers;
     48      1.1  mrg 
     49      1.1  mrg   /* Set up the value of m_full_and_partial_reg_clobbers.
     50      1.1  mrg 
     51      1.1  mrg      If the ABI specifies that part of a hard register R is call-clobbered,
     52      1.1  mrg      we should be able to find a single-register mode M for which
     53      1.1  mrg      targetm.hard_regno_call_part_clobbered (m_id, R, M) is true.
     54      1.1  mrg      In other words, it shouldn't be the case that R can hold all
     55      1.1  mrg      single-register modes across a call, but can't hold part of
     56      1.1  mrg      a multi-register mode.
     57      1.1  mrg 
     58      1.1  mrg      If that assumption doesn't hold for a future target, we would need
     59      1.1  mrg      to change the interface of TARGET_HARD_REGNO_CALL_PART_CLOBBERED so
     60      1.1  mrg      that it tells us which registers in a multi-register value are
     61      1.1  mrg      actually clobbered.  */
     62      1.1  mrg   m_full_and_partial_reg_clobbers = full_reg_clobbers;
     63      1.1  mrg   for (unsigned int i = 0; i < NUM_MACHINE_MODES; ++i)
     64      1.1  mrg     {
     65      1.1  mrg       machine_mode mode = (machine_mode) i;
     66      1.1  mrg       for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
     67      1.1  mrg 	if (targetm.hard_regno_mode_ok (regno, mode)
     68      1.1  mrg 	    && hard_regno_nregs (regno, mode) == 1
     69      1.1  mrg 	    && targetm.hard_regno_call_part_clobbered (m_id, regno, mode))
     70      1.1  mrg 	  SET_HARD_REG_BIT (m_full_and_partial_reg_clobbers, regno);
     71      1.1  mrg     }
     72      1.1  mrg 
     73      1.1  mrg   /* For each mode MODE, work out which registers are unable to hold
     74      1.1  mrg      any part of a MODE value across a call, i.e. those for which no
     75      1.1  mrg      overlapping call-preserved (reg:MODE REGNO) exists.
     76      1.1  mrg 
     77      1.1  mrg      We assume that this can be flipped around to say that a call
     78      1.1  mrg      preserves (reg:MODE REGNO) unless the register overlaps this set.
     79      1.1  mrg      The usual reason for this being true is that if (reg:MODE REGNO)
     80      1.1  mrg      contains a part-clobbered register, that register would be
     81      1.1  mrg      part-clobbered regardless of which part of MODE it holds.
     82      1.1  mrg      For example, if (reg:M 2) occupies two registers and if the
     83      1.1  mrg      register 3 portion of it is part-clobbered, (reg:M 3) is usually
     84      1.1  mrg      either invalid or also part-clobbered.  */
     85      1.1  mrg   for (unsigned int i = 0; i < NUM_MACHINE_MODES; ++i)
     86      1.1  mrg     {
     87      1.1  mrg       machine_mode mode = (machine_mode) i;
     88      1.1  mrg       m_mode_clobbers[i] = m_full_and_partial_reg_clobbers;
     89      1.1  mrg       for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
     90      1.1  mrg 	if (targetm.hard_regno_mode_ok (regno, mode)
     91      1.1  mrg 	    && !overlaps_hard_reg_set_p (m_full_reg_clobbers, mode, regno)
     92      1.1  mrg 	    && !targetm.hard_regno_call_part_clobbered (m_id, regno, mode))
     93      1.1  mrg 	  remove_from_hard_reg_set (&m_mode_clobbers[i], mode, regno);
     94      1.1  mrg     }
     95      1.1  mrg 
     96      1.1  mrg   /* Check that the assumptions above actually hold, i.e. that testing
     97      1.1  mrg      for single-register modes makes sense, and that overlap tests for
     98      1.1  mrg      mode_clobbers work as expected.  */
     99      1.1  mrg   if (flag_checking)
    100      1.1  mrg     for (unsigned int i = 0; i < NUM_MACHINE_MODES; ++i)
    101      1.1  mrg       {
    102      1.1  mrg 	machine_mode mode = (machine_mode) i;
    103      1.1  mrg 	const_hard_reg_set all_clobbers = m_full_and_partial_reg_clobbers;
    104      1.1  mrg 	for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
    105      1.1  mrg 	  if (targetm.hard_regno_mode_ok (regno, mode)
    106      1.1  mrg 	      && !overlaps_hard_reg_set_p (m_full_reg_clobbers, mode, regno)
    107      1.1  mrg 	      && targetm.hard_regno_call_part_clobbered (m_id, regno, mode))
    108      1.1  mrg 	    gcc_assert (overlaps_hard_reg_set_p (all_clobbers, mode, regno)
    109      1.1  mrg 			&& overlaps_hard_reg_set_p (m_mode_clobbers[i],
    110      1.1  mrg 						    mode, regno));
    111      1.1  mrg       }
    112      1.1  mrg }
    113      1.1  mrg 
    114      1.1  mrg /* If the ABI has been initialized, add REGNO to the set of registers
    115      1.1  mrg    that can be completely altered by a call.  */
    116      1.1  mrg 
    117      1.1  mrg void
    118      1.1  mrg predefined_function_abi::add_full_reg_clobber (unsigned int regno)
    119      1.1  mrg {
    120      1.1  mrg   if (!m_initialized)
    121      1.1  mrg     return;
    122      1.1  mrg 
    123      1.1  mrg   SET_HARD_REG_BIT (m_full_reg_clobbers, regno);
    124      1.1  mrg   SET_HARD_REG_BIT (m_full_and_partial_reg_clobbers, regno);
    125      1.1  mrg   for (unsigned int i = 0; i < NUM_MACHINE_MODES; ++i)
    126      1.1  mrg     SET_HARD_REG_BIT (m_mode_clobbers[i], regno);
    127      1.1  mrg }
    128      1.1  mrg 
    129      1.1  mrg /* Return the set of registers that the caller of the recorded functions must
    130      1.1  mrg    save in order to honor the requirements of CALLER_ABI.  */
    131      1.1  mrg 
    132      1.1  mrg HARD_REG_SET
    133      1.1  mrg function_abi_aggregator::
    134      1.1  mrg caller_save_regs (const function_abi &caller_abi) const
    135      1.1  mrg {
    136      1.1  mrg   HARD_REG_SET result;
    137      1.1  mrg   CLEAR_HARD_REG_SET (result);
    138      1.1  mrg   for (unsigned int abi_id = 0; abi_id < NUM_ABI_IDS; ++abi_id)
    139      1.1  mrg     {
    140      1.1  mrg       const predefined_function_abi &callee_abi = function_abis[abi_id];
    141      1.1  mrg 
    142      1.1  mrg       /* Skip cases that clearly aren't problematic.  */
    143      1.1  mrg       if (abi_id == caller_abi.id ()
    144      1.1  mrg 	  || hard_reg_set_empty_p (m_abi_clobbers[abi_id]))
    145      1.1  mrg 	continue;
    146      1.1  mrg 
    147      1.1  mrg       /* Collect the set of registers that can be "more clobbered" by
    148      1.1  mrg 	 CALLEE_ABI than by CALLER_ABI.  */
    149      1.1  mrg       HARD_REG_SET extra_clobbers;
    150      1.1  mrg       CLEAR_HARD_REG_SET (extra_clobbers);
    151      1.1  mrg       for (unsigned int i = 0; i < NUM_MACHINE_MODES; ++i)
    152      1.1  mrg 	{
    153      1.1  mrg 	  machine_mode mode = (machine_mode) i;
    154      1.1  mrg 	  extra_clobbers |= (callee_abi.mode_clobbers (mode)
    155      1.1  mrg 			     & ~caller_abi.mode_clobbers (mode));
    156      1.1  mrg 	}
    157      1.1  mrg 
    158      1.1  mrg       /* Restrict it to the set of registers that we actually saw
    159      1.1  mrg 	 clobbers for (e.g. taking -fipa-ra into account).  */
    160      1.1  mrg       result |= (extra_clobbers & m_abi_clobbers[abi_id]);
    161      1.1  mrg     }
    162      1.1  mrg   return result;
    163      1.1  mrg }
    164      1.1  mrg 
    165      1.1  mrg /* Return the set of registers that cannot be used to hold a value of
    166      1.1  mrg    mode MODE across the calls in a region described by ABIS and MASK, where:
    167      1.1  mrg 
    168      1.1  mrg    * Bit ID of ABIS is set if the region contains a call with
    169      1.1  mrg      function_abi identifier ID.
    170      1.1  mrg 
    171      1.1  mrg    * MASK contains all the registers that are fully or partially
    172      1.1  mrg      clobbered by calls in the region.
    173      1.1  mrg 
    174      1.1  mrg    This is not quite as accurate as testing each individual call,
    175      1.1  mrg    but it's a close and conservatively-correct approximation.
    176      1.1  mrg    It's much better for some targets than just using MASK.  */
    177      1.1  mrg 
    178      1.1  mrg HARD_REG_SET
    179      1.1  mrg call_clobbers_in_region (unsigned int abis, const_hard_reg_set mask,
    180      1.1  mrg 			 machine_mode mode)
    181      1.1  mrg {
    182      1.1  mrg   HARD_REG_SET result;
    183      1.1  mrg   CLEAR_HARD_REG_SET (result);
    184      1.1  mrg   for (unsigned int id = 0; abis; abis >>= 1, ++id)
    185      1.1  mrg     if (abis & 1)
    186      1.1  mrg       result |= function_abis[id].mode_clobbers (mode);
    187      1.1  mrg   return result & mask;
    188      1.1  mrg }
    189      1.1  mrg 
    190      1.1  mrg /* Return the predefined ABI used by functions with type TYPE.  */
    191      1.1  mrg 
    192      1.1  mrg const predefined_function_abi &
    193      1.1  mrg fntype_abi (const_tree type)
    194      1.1  mrg {
    195      1.1  mrg   gcc_assert (FUNC_OR_METHOD_TYPE_P (type));
    196      1.1  mrg   if (targetm.calls.fntype_abi)
    197      1.1  mrg     return targetm.calls.fntype_abi (type);
    198      1.1  mrg   return default_function_abi;
    199      1.1  mrg }
    200      1.1  mrg 
    201      1.1  mrg /* Return the ABI of function decl FNDECL.  */
    202      1.1  mrg 
    203      1.1  mrg function_abi
    204      1.1  mrg fndecl_abi (const_tree fndecl)
    205      1.1  mrg {
    206      1.1  mrg   gcc_assert (TREE_CODE (fndecl) == FUNCTION_DECL);
    207      1.1  mrg   const predefined_function_abi &base_abi = fntype_abi (TREE_TYPE (fndecl));
    208      1.1  mrg 
    209      1.1  mrg   if (flag_ipa_ra && decl_binds_to_current_def_p (fndecl))
    210      1.1  mrg     if (cgraph_rtl_info *info = cgraph_node::rtl_info (fndecl))
    211      1.1  mrg       return function_abi (base_abi, info->function_used_regs);
    212      1.1  mrg 
    213      1.1  mrg   return base_abi;
    214      1.1  mrg }
    215      1.1  mrg 
    216      1.1  mrg /* Return the ABI of the function called by INSN.  */
    217      1.1  mrg 
    218      1.1  mrg function_abi
    219      1.1  mrg insn_callee_abi (const rtx_insn *insn)
    220      1.1  mrg {
    221      1.1  mrg   gcc_assert (insn && CALL_P (insn));
    222      1.1  mrg 
    223      1.1  mrg   if (flag_ipa_ra)
    224      1.1  mrg     if (tree fndecl = get_call_fndecl (insn))
    225      1.1  mrg       return fndecl_abi (fndecl);
    226      1.1  mrg 
    227      1.1  mrg   if (targetm.calls.insn_callee_abi)
    228      1.1  mrg     return targetm.calls.insn_callee_abi (insn);
    229      1.1  mrg 
    230      1.1  mrg   return default_function_abi;
    231      1.1  mrg }
    232      1.1  mrg 
    233      1.1  mrg /* Return the ABI of the function called by CALL_EXPR EXP.  Return the
    234      1.1  mrg    default ABI for erroneous calls.  */
    235      1.1  mrg 
    236      1.1  mrg function_abi
    237      1.1  mrg expr_callee_abi (const_tree exp)
    238      1.1  mrg {
    239      1.1  mrg   gcc_assert (TREE_CODE (exp) == CALL_EXPR);
    240      1.1  mrg 
    241      1.1  mrg   if (tree fndecl = get_callee_fndecl (exp))
    242      1.1  mrg     return fndecl_abi (fndecl);
    243      1.1  mrg 
    244      1.1  mrg   tree callee = CALL_EXPR_FN (exp);
    245      1.1  mrg   if (callee == error_mark_node)
    246      1.1  mrg     return default_function_abi;
    247      1.1  mrg 
    248      1.1  mrg   tree type = TREE_TYPE (callee);
    249      1.1  mrg   if (type == error_mark_node)
    250      1.1  mrg     return default_function_abi;
    251      1.1  mrg 
    252      1.1  mrg   gcc_assert (POINTER_TYPE_P (type));
    253      1.1  mrg   return fntype_abi (TREE_TYPE (type));
    254      1.1  mrg }
    255