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