1 1.1 mrg /* A pass for lowering trees to RTL. 2 1.5 mrg Copyright (C) 2004-2024 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 7 1.1 mrg it under the terms of the GNU General Public License as published by 8 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg any later version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, 12 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg GNU General Public License 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 "gimple.h" 28 1.1 mrg #include "cfghooks.h" 29 1.1 mrg #include "tree-pass.h" 30 1.1 mrg #include "memmodel.h" 31 1.1 mrg #include "tm_p.h" 32 1.1 mrg #include "ssa.h" 33 1.1 mrg #include "optabs.h" 34 1.1 mrg #include "regs.h" /* For reg_renumber. */ 35 1.1 mrg #include "emit-rtl.h" 36 1.1 mrg #include "recog.h" 37 1.1 mrg #include "cgraph.h" 38 1.1 mrg #include "diagnostic.h" 39 1.1 mrg #include "fold-const.h" 40 1.1 mrg #include "varasm.h" 41 1.1 mrg #include "stor-layout.h" 42 1.1 mrg #include "stmt.h" 43 1.1 mrg #include "print-tree.h" 44 1.1 mrg #include "cfgrtl.h" 45 1.1 mrg #include "cfganal.h" 46 1.1 mrg #include "cfgbuild.h" 47 1.1 mrg #include "cfgcleanup.h" 48 1.1 mrg #include "dojump.h" 49 1.1 mrg #include "explow.h" 50 1.1 mrg #include "calls.h" 51 1.1 mrg #include "expr.h" 52 1.1 mrg #include "internal-fn.h" 53 1.1 mrg #include "tree-eh.h" 54 1.1 mrg #include "gimple-iterator.h" 55 1.1 mrg #include "gimple-expr.h" 56 1.1 mrg #include "gimple-walk.h" 57 1.1 mrg #include "tree-cfg.h" 58 1.1 mrg #include "tree-dfa.h" 59 1.1 mrg #include "tree-ssa.h" 60 1.1 mrg #include "except.h" 61 1.1 mrg #include "gimple-pretty-print.h" 62 1.1 mrg #include "toplev.h" 63 1.1 mrg #include "debug.h" 64 1.1 mrg #include "tree-inline.h" 65 1.1 mrg #include "value-prof.h" 66 1.1 mrg #include "tree-ssa-live.h" 67 1.1 mrg #include "tree-outof-ssa.h" 68 1.1 mrg #include "cfgloop.h" 69 1.1 mrg #include "insn-attr.h" /* For INSN_SCHEDULING. */ 70 1.1 mrg #include "stringpool.h" 71 1.1 mrg #include "attribs.h" 72 1.1 mrg #include "asan.h" 73 1.1 mrg #include "tree-ssa-address.h" 74 1.1 mrg #include "output.h" 75 1.1 mrg #include "builtins.h" 76 1.1 mrg #include "opts.h" 77 1.1 mrg 78 1.1 mrg /* Some systems use __main in a way incompatible with its use in gcc, in these 79 1.1 mrg cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to 80 1.1 mrg give the same symbol without quotes for an alternative entry point. You 81 1.1 mrg must define both, or neither. */ 82 1.1 mrg #ifndef NAME__MAIN 83 1.1 mrg #define NAME__MAIN "__main" 84 1.1 mrg #endif 85 1.1 mrg 86 1.1 mrg /* This variable holds information helping the rewriting of SSA trees 87 1.1 mrg into RTL. */ 88 1.1 mrg struct ssaexpand SA; 89 1.1 mrg 90 1.1 mrg /* This variable holds the currently expanded gimple statement for purposes 91 1.1 mrg of comminucating the profile info to the builtin expanders. */ 92 1.1 mrg gimple *currently_expanding_gimple_stmt; 93 1.1 mrg 94 1.1 mrg static rtx expand_debug_expr (tree); 95 1.1 mrg 96 1.1 mrg static bool defer_stack_allocation (tree, bool); 97 1.1 mrg 98 1.1 mrg static void record_alignment_for_reg_var (unsigned int); 99 1.1 mrg 100 1.1 mrg /* Return an expression tree corresponding to the RHS of GIMPLE 101 1.1 mrg statement STMT. */ 102 1.1 mrg 103 1.1 mrg tree 104 1.1 mrg gimple_assign_rhs_to_tree (gimple *stmt) 105 1.1 mrg { 106 1.1 mrg tree t; 107 1.1 mrg switch (gimple_assign_rhs_class (stmt)) 108 1.1 mrg { 109 1.1 mrg case GIMPLE_TERNARY_RHS: 110 1.1 mrg t = build3 (gimple_assign_rhs_code (stmt), 111 1.1 mrg TREE_TYPE (gimple_assign_lhs (stmt)), 112 1.1 mrg gimple_assign_rhs1 (stmt), gimple_assign_rhs2 (stmt), 113 1.1 mrg gimple_assign_rhs3 (stmt)); 114 1.1 mrg break; 115 1.1 mrg case GIMPLE_BINARY_RHS: 116 1.1 mrg t = build2 (gimple_assign_rhs_code (stmt), 117 1.1 mrg TREE_TYPE (gimple_assign_lhs (stmt)), 118 1.1 mrg gimple_assign_rhs1 (stmt), gimple_assign_rhs2 (stmt)); 119 1.1 mrg break; 120 1.1 mrg case GIMPLE_UNARY_RHS: 121 1.1 mrg t = build1 (gimple_assign_rhs_code (stmt), 122 1.1 mrg TREE_TYPE (gimple_assign_lhs (stmt)), 123 1.1 mrg gimple_assign_rhs1 (stmt)); 124 1.1 mrg break; 125 1.1 mrg case GIMPLE_SINGLE_RHS: 126 1.1 mrg { 127 1.1 mrg t = gimple_assign_rhs1 (stmt); 128 1.1 mrg /* Avoid modifying this tree in place below. */ 129 1.1 mrg if ((gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t) 130 1.1 mrg && gimple_location (stmt) != EXPR_LOCATION (t)) 131 1.1 mrg || (gimple_block (stmt) && currently_expanding_to_rtl 132 1.1 mrg && EXPR_P (t))) 133 1.1 mrg t = copy_node (t); 134 1.1 mrg break; 135 1.1 mrg } 136 1.1 mrg default: 137 1.1 mrg gcc_unreachable (); 138 1.1 mrg } 139 1.1 mrg 140 1.1 mrg if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t)) 141 1.1 mrg SET_EXPR_LOCATION (t, gimple_location (stmt)); 142 1.1 mrg 143 1.1 mrg return t; 144 1.1 mrg } 145 1.1 mrg 146 1.1 mrg 147 1.1 mrg #ifndef STACK_ALIGNMENT_NEEDED 148 1.1 mrg #define STACK_ALIGNMENT_NEEDED 1 149 1.1 mrg #endif 150 1.1 mrg 151 1.1 mrg #define SSAVAR(x) (TREE_CODE (x) == SSA_NAME ? SSA_NAME_VAR (x) : x) 152 1.1 mrg 153 1.1 mrg /* Choose either CUR or NEXT as the leader DECL for a partition. 154 1.1 mrg Prefer ignored decls, to simplify debug dumps and reduce ambiguity 155 1.1 mrg out of the same user variable being in multiple partitions (this is 156 1.1 mrg less likely for compiler-introduced temps). */ 157 1.1 mrg 158 1.1 mrg static tree 159 1.1 mrg leader_merge (tree cur, tree next) 160 1.1 mrg { 161 1.1 mrg if (cur == NULL || cur == next) 162 1.1 mrg return next; 163 1.1 mrg 164 1.1 mrg if (DECL_P (cur) && DECL_IGNORED_P (cur)) 165 1.1 mrg return cur; 166 1.1 mrg 167 1.1 mrg if (DECL_P (next) && DECL_IGNORED_P (next)) 168 1.1 mrg return next; 169 1.1 mrg 170 1.1 mrg return cur; 171 1.1 mrg } 172 1.1 mrg 173 1.1 mrg /* Associate declaration T with storage space X. If T is no 174 1.1 mrg SSA name this is exactly SET_DECL_RTL, otherwise make the 175 1.1 mrg partition of T associated with X. */ 176 1.1 mrg static inline void 177 1.1 mrg set_rtl (tree t, rtx x) 178 1.1 mrg { 179 1.1 mrg gcc_checking_assert (!x 180 1.1 mrg || !(TREE_CODE (t) == SSA_NAME || is_gimple_reg (t)) 181 1.1 mrg || (use_register_for_decl (t) 182 1.1 mrg ? (REG_P (x) 183 1.1 mrg || (GET_CODE (x) == CONCAT 184 1.1 mrg && (REG_P (XEXP (x, 0)) 185 1.1 mrg || SUBREG_P (XEXP (x, 0))) 186 1.1 mrg && (REG_P (XEXP (x, 1)) 187 1.1 mrg || SUBREG_P (XEXP (x, 1)))) 188 1.1 mrg /* We need to accept PARALLELs for RESUT_DECLs 189 1.1 mrg because of vector types with BLKmode returned 190 1.1 mrg in multiple registers, but they are supposed 191 1.1 mrg to be uncoalesced. */ 192 1.1 mrg || (GET_CODE (x) == PARALLEL 193 1.1 mrg && SSAVAR (t) 194 1.1 mrg && TREE_CODE (SSAVAR (t)) == RESULT_DECL 195 1.1 mrg && (GET_MODE (x) == BLKmode 196 1.1 mrg || !flag_tree_coalesce_vars))) 197 1.1 mrg : (MEM_P (x) || x == pc_rtx 198 1.1 mrg || (GET_CODE (x) == CONCAT 199 1.1 mrg && MEM_P (XEXP (x, 0)) 200 1.1 mrg && MEM_P (XEXP (x, 1)))))); 201 1.1 mrg /* Check that the RTL for SSA_NAMEs and gimple-reg PARM_DECLs and 202 1.1 mrg RESULT_DECLs has the expected mode. For memory, we accept 203 1.1 mrg unpromoted modes, since that's what we're likely to get. For 204 1.1 mrg PARM_DECLs and RESULT_DECLs, we'll have been called by 205 1.1 mrg set_parm_rtl, which will give us the default def, so we don't 206 1.1 mrg have to compute it ourselves. For RESULT_DECLs, we accept mode 207 1.1 mrg mismatches too, as long as we have BLKmode or are not coalescing 208 1.1 mrg across variables, so that we don't reject BLKmode PARALLELs or 209 1.1 mrg unpromoted REGs. */ 210 1.1 mrg gcc_checking_assert (!x || x == pc_rtx || TREE_CODE (t) != SSA_NAME 211 1.1 mrg || (SSAVAR (t) 212 1.1 mrg && TREE_CODE (SSAVAR (t)) == RESULT_DECL 213 1.1 mrg && (promote_ssa_mode (t, NULL) == BLKmode 214 1.1 mrg || !flag_tree_coalesce_vars)) 215 1.1 mrg || !use_register_for_decl (t) 216 1.1 mrg || GET_MODE (x) == promote_ssa_mode (t, NULL)); 217 1.1 mrg 218 1.1 mrg if (x) 219 1.1 mrg { 220 1.1 mrg bool skip = false; 221 1.1 mrg tree cur = NULL_TREE; 222 1.1 mrg rtx xm = x; 223 1.1 mrg 224 1.1 mrg retry: 225 1.1 mrg if (MEM_P (xm)) 226 1.1 mrg cur = MEM_EXPR (xm); 227 1.1 mrg else if (REG_P (xm)) 228 1.1 mrg cur = REG_EXPR (xm); 229 1.1 mrg else if (SUBREG_P (xm)) 230 1.1 mrg { 231 1.1 mrg gcc_assert (subreg_lowpart_p (xm)); 232 1.1 mrg xm = SUBREG_REG (xm); 233 1.1 mrg goto retry; 234 1.1 mrg } 235 1.1 mrg else if (GET_CODE (xm) == CONCAT) 236 1.1 mrg { 237 1.1 mrg xm = XEXP (xm, 0); 238 1.1 mrg goto retry; 239 1.1 mrg } 240 1.1 mrg else if (GET_CODE (xm) == PARALLEL) 241 1.1 mrg { 242 1.1 mrg xm = XVECEXP (xm, 0, 0); 243 1.1 mrg gcc_assert (GET_CODE (xm) == EXPR_LIST); 244 1.1 mrg xm = XEXP (xm, 0); 245 1.1 mrg goto retry; 246 1.1 mrg } 247 1.1 mrg else if (xm == pc_rtx) 248 1.1 mrg skip = true; 249 1.1 mrg else 250 1.1 mrg gcc_unreachable (); 251 1.1 mrg 252 1.1 mrg tree next = skip ? cur : leader_merge (cur, SSAVAR (t) ? SSAVAR (t) : t); 253 1.1 mrg 254 1.1 mrg if (cur != next) 255 1.1 mrg { 256 1.1 mrg if (MEM_P (x)) 257 1.1 mrg set_mem_attributes (x, 258 1.1 mrg next && TREE_CODE (next) == SSA_NAME 259 1.1 mrg ? TREE_TYPE (next) 260 1.1 mrg : next, true); 261 1.1 mrg else 262 1.1 mrg set_reg_attrs_for_decl_rtl (next, x); 263 1.1 mrg } 264 1.1 mrg } 265 1.1 mrg 266 1.1 mrg if (TREE_CODE (t) == SSA_NAME) 267 1.1 mrg { 268 1.1 mrg int part = var_to_partition (SA.map, t); 269 1.1 mrg if (part != NO_PARTITION) 270 1.1 mrg { 271 1.1 mrg if (SA.partition_to_pseudo[part]) 272 1.1 mrg gcc_assert (SA.partition_to_pseudo[part] == x); 273 1.1 mrg else if (x != pc_rtx) 274 1.1 mrg SA.partition_to_pseudo[part] = x; 275 1.1 mrg } 276 1.1 mrg /* For the benefit of debug information at -O0 (where 277 1.1 mrg vartracking doesn't run) record the place also in the base 278 1.1 mrg DECL. For PARMs and RESULTs, do so only when setting the 279 1.1 mrg default def. */ 280 1.1 mrg if (x && x != pc_rtx && SSA_NAME_VAR (t) 281 1.1 mrg && (VAR_P (SSA_NAME_VAR (t)) 282 1.1 mrg || SSA_NAME_IS_DEFAULT_DEF (t))) 283 1.1 mrg { 284 1.1 mrg tree var = SSA_NAME_VAR (t); 285 1.1 mrg /* If we don't yet have something recorded, just record it now. */ 286 1.1 mrg if (!DECL_RTL_SET_P (var)) 287 1.1 mrg SET_DECL_RTL (var, x); 288 1.1 mrg /* If we have it set already to "multiple places" don't 289 1.1 mrg change this. */ 290 1.1 mrg else if (DECL_RTL (var) == pc_rtx) 291 1.1 mrg ; 292 1.1 mrg /* If we have something recorded and it's not the same place 293 1.1 mrg as we want to record now, we have multiple partitions for the 294 1.1 mrg same base variable, with different places. We can't just 295 1.1 mrg randomly chose one, hence we have to say that we don't know. 296 1.1 mrg This only happens with optimization, and there var-tracking 297 1.1 mrg will figure out the right thing. */ 298 1.1 mrg else if (DECL_RTL (var) != x) 299 1.1 mrg SET_DECL_RTL (var, pc_rtx); 300 1.1 mrg } 301 1.1 mrg } 302 1.1 mrg else 303 1.1 mrg SET_DECL_RTL (t, x); 304 1.1 mrg } 305 1.1 mrg 306 1.1 mrg /* This structure holds data relevant to one variable that will be 307 1.1 mrg placed in a stack slot. */ 308 1.1 mrg class stack_var 309 1.1 mrg { 310 1.1 mrg public: 311 1.1 mrg /* The Variable. */ 312 1.1 mrg tree decl; 313 1.1 mrg 314 1.1 mrg /* Initially, the size of the variable. Later, the size of the partition, 315 1.1 mrg if this variable becomes it's partition's representative. */ 316 1.1 mrg poly_uint64 size; 317 1.1 mrg 318 1.1 mrg /* The *byte* alignment required for this variable. Or as, with the 319 1.1 mrg size, the alignment for this partition. */ 320 1.1 mrg unsigned int alignb; 321 1.1 mrg 322 1.1 mrg /* The partition representative. */ 323 1.1 mrg size_t representative; 324 1.1 mrg 325 1.1 mrg /* The next stack variable in the partition, or EOC. */ 326 1.1 mrg size_t next; 327 1.1 mrg 328 1.1 mrg /* The numbers of conflicting stack variables. */ 329 1.1 mrg bitmap conflicts; 330 1.1 mrg }; 331 1.1 mrg 332 1.1 mrg #define EOC ((size_t)-1) 333 1.1 mrg 334 1.1 mrg /* We have an array of such objects while deciding allocation. */ 335 1.1 mrg static class stack_var *stack_vars; 336 1.1 mrg static size_t stack_vars_alloc; 337 1.1 mrg static size_t stack_vars_num; 338 1.1 mrg static hash_map<tree, size_t> *decl_to_stack_part; 339 1.1 mrg 340 1.1 mrg /* Conflict bitmaps go on this obstack. This allows us to destroy 341 1.1 mrg all of them in one big sweep. */ 342 1.1 mrg static bitmap_obstack stack_var_bitmap_obstack; 343 1.1 mrg 344 1.1 mrg /* An array of indices such that stack_vars[stack_vars_sorted[i]].size 345 1.1 mrg is non-decreasing. */ 346 1.1 mrg static size_t *stack_vars_sorted; 347 1.1 mrg 348 1.1 mrg /* The phase of the stack frame. This is the known misalignment of 349 1.1 mrg virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY. That is, 350 1.1 mrg (frame_offset+frame_phase) % PREFERRED_STACK_BOUNDARY == 0. */ 351 1.1 mrg static int frame_phase; 352 1.1 mrg 353 1.1 mrg /* Used during expand_used_vars to remember if we saw any decls for 354 1.1 mrg which we'd like to enable stack smashing protection. */ 355 1.1 mrg static bool has_protected_decls; 356 1.1 mrg 357 1.1 mrg /* Used during expand_used_vars. Remember if we say a character buffer 358 1.1 mrg smaller than our cutoff threshold. Used for -Wstack-protector. */ 359 1.1 mrg static bool has_short_buffer; 360 1.1 mrg 361 1.1 mrg /* Compute the byte alignment to use for DECL. Ignore alignment 362 1.1 mrg we can't do with expected alignment of the stack boundary. */ 363 1.1 mrg 364 1.1 mrg static unsigned int 365 1.1 mrg align_local_variable (tree decl, bool really_expand) 366 1.1 mrg { 367 1.1 mrg unsigned int align; 368 1.1 mrg 369 1.1 mrg if (TREE_CODE (decl) == SSA_NAME) 370 1.1 mrg { 371 1.1 mrg tree type = TREE_TYPE (decl); 372 1.1 mrg machine_mode mode = TYPE_MODE (type); 373 1.1 mrg 374 1.1 mrg align = TYPE_ALIGN (type); 375 1.1 mrg if (mode != BLKmode 376 1.1 mrg && align < GET_MODE_ALIGNMENT (mode)) 377 1.1 mrg align = GET_MODE_ALIGNMENT (mode); 378 1.1 mrg } 379 1.1 mrg else 380 1.1 mrg align = LOCAL_DECL_ALIGNMENT (decl); 381 1.1 mrg 382 1.1 mrg if (hwasan_sanitize_stack_p ()) 383 1.1 mrg align = MAX (align, (unsigned) HWASAN_TAG_GRANULE_SIZE * BITS_PER_UNIT); 384 1.1 mrg 385 1.1 mrg if (TREE_CODE (decl) != SSA_NAME && really_expand) 386 1.1 mrg /* Don't change DECL_ALIGN when called from estimated_stack_frame_size. 387 1.1 mrg That is done before IPA and could bump alignment based on host 388 1.1 mrg backend even for offloaded code which wants different 389 1.1 mrg LOCAL_DECL_ALIGNMENT. */ 390 1.1 mrg SET_DECL_ALIGN (decl, align); 391 1.1 mrg 392 1.1 mrg return align / BITS_PER_UNIT; 393 1.1 mrg } 394 1.1 mrg 395 1.1 mrg /* Align given offset BASE with ALIGN. Truncate up if ALIGN_UP is true, 396 1.1 mrg down otherwise. Return truncated BASE value. */ 397 1.1 mrg 398 1.1 mrg static inline unsigned HOST_WIDE_INT 399 1.1 mrg align_base (HOST_WIDE_INT base, unsigned HOST_WIDE_INT align, bool align_up) 400 1.1 mrg { 401 1.1 mrg return align_up ? (base + align - 1) & -align : base & -align; 402 1.1 mrg } 403 1.1 mrg 404 1.1 mrg /* Allocate SIZE bytes at byte alignment ALIGN from the stack frame. 405 1.1 mrg Return the frame offset. */ 406 1.1 mrg 407 1.1 mrg static poly_int64 408 1.1 mrg alloc_stack_frame_space (poly_int64 size, unsigned HOST_WIDE_INT align) 409 1.1 mrg { 410 1.1 mrg poly_int64 offset, new_frame_offset; 411 1.1 mrg 412 1.1 mrg if (FRAME_GROWS_DOWNWARD) 413 1.1 mrg { 414 1.1 mrg new_frame_offset 415 1.1 mrg = aligned_lower_bound (frame_offset - frame_phase - size, 416 1.1 mrg align) + frame_phase; 417 1.1 mrg offset = new_frame_offset; 418 1.1 mrg } 419 1.1 mrg else 420 1.1 mrg { 421 1.1 mrg new_frame_offset 422 1.1 mrg = aligned_upper_bound (frame_offset - frame_phase, 423 1.1 mrg align) + frame_phase; 424 1.1 mrg offset = new_frame_offset; 425 1.1 mrg new_frame_offset += size; 426 1.1 mrg } 427 1.1 mrg frame_offset = new_frame_offset; 428 1.1 mrg 429 1.1 mrg if (frame_offset_overflow (frame_offset, cfun->decl)) 430 1.1 mrg frame_offset = offset = 0; 431 1.1 mrg 432 1.1 mrg return offset; 433 1.1 mrg } 434 1.1 mrg 435 1.1 mrg /* Ensure that the stack is aligned to ALIGN bytes. 436 1.1 mrg Return the new frame offset. */ 437 1.1 mrg static poly_int64 438 1.1 mrg align_frame_offset (unsigned HOST_WIDE_INT align) 439 1.1 mrg { 440 1.1 mrg return alloc_stack_frame_space (0, align); 441 1.1 mrg } 442 1.1 mrg 443 1.1 mrg /* Accumulate DECL into STACK_VARS. */ 444 1.1 mrg 445 1.1 mrg static void 446 1.1 mrg add_stack_var (tree decl, bool really_expand) 447 1.1 mrg { 448 1.1 mrg class stack_var *v; 449 1.1 mrg 450 1.1 mrg if (stack_vars_num >= stack_vars_alloc) 451 1.1 mrg { 452 1.1 mrg if (stack_vars_alloc) 453 1.1 mrg stack_vars_alloc = stack_vars_alloc * 3 / 2; 454 1.1 mrg else 455 1.1 mrg stack_vars_alloc = 32; 456 1.1 mrg stack_vars 457 1.1 mrg = XRESIZEVEC (class stack_var, stack_vars, stack_vars_alloc); 458 1.1 mrg } 459 1.1 mrg if (!decl_to_stack_part) 460 1.1 mrg decl_to_stack_part = new hash_map<tree, size_t>; 461 1.1 mrg 462 1.1 mrg v = &stack_vars[stack_vars_num]; 463 1.1 mrg decl_to_stack_part->put (decl, stack_vars_num); 464 1.1 mrg 465 1.1 mrg v->decl = decl; 466 1.1 mrg tree size = TREE_CODE (decl) == SSA_NAME 467 1.1 mrg ? TYPE_SIZE_UNIT (TREE_TYPE (decl)) 468 1.1 mrg : DECL_SIZE_UNIT (decl); 469 1.1 mrg v->size = tree_to_poly_uint64 (size); 470 1.1 mrg /* Ensure that all variables have size, so that &a != &b for any two 471 1.1 mrg variables that are simultaneously live. */ 472 1.1 mrg if (known_eq (v->size, 0U)) 473 1.1 mrg v->size = 1; 474 1.1 mrg v->alignb = align_local_variable (decl, really_expand); 475 1.1 mrg /* An alignment of zero can mightily confuse us later. */ 476 1.1 mrg gcc_assert (v->alignb != 0); 477 1.1 mrg 478 1.1 mrg /* All variables are initially in their own partition. */ 479 1.1 mrg v->representative = stack_vars_num; 480 1.1 mrg v->next = EOC; 481 1.1 mrg 482 1.1 mrg /* All variables initially conflict with no other. */ 483 1.1 mrg v->conflicts = NULL; 484 1.1 mrg 485 1.1 mrg /* Ensure that this decl doesn't get put onto the list twice. */ 486 1.1 mrg set_rtl (decl, pc_rtx); 487 1.1 mrg 488 1.1 mrg stack_vars_num++; 489 1.1 mrg } 490 1.1 mrg 491 1.1 mrg /* Make the decls associated with luid's X and Y conflict. */ 492 1.1 mrg 493 1.1 mrg static void 494 1.1 mrg add_stack_var_conflict (size_t x, size_t y) 495 1.1 mrg { 496 1.1 mrg class stack_var *a = &stack_vars[x]; 497 1.1 mrg class stack_var *b = &stack_vars[y]; 498 1.1 mrg if (x == y) 499 1.1 mrg return; 500 1.1 mrg if (!a->conflicts) 501 1.1 mrg a->conflicts = BITMAP_ALLOC (&stack_var_bitmap_obstack); 502 1.1 mrg if (!b->conflicts) 503 1.1 mrg b->conflicts = BITMAP_ALLOC (&stack_var_bitmap_obstack); 504 1.1 mrg bitmap_set_bit (a->conflicts, y); 505 1.1 mrg bitmap_set_bit (b->conflicts, x); 506 1.1 mrg } 507 1.1 mrg 508 1.1 mrg /* Check whether the decls associated with luid's X and Y conflict. */ 509 1.1 mrg 510 1.1 mrg static bool 511 1.1 mrg stack_var_conflict_p (size_t x, size_t y) 512 1.1 mrg { 513 1.1 mrg class stack_var *a = &stack_vars[x]; 514 1.1 mrg class stack_var *b = &stack_vars[y]; 515 1.1 mrg if (x == y) 516 1.1 mrg return false; 517 1.1 mrg /* Partitions containing an SSA name result from gimple registers 518 1.1 mrg with things like unsupported modes. They are top-level and 519 1.1 mrg hence conflict with everything else. */ 520 1.1 mrg if (TREE_CODE (a->decl) == SSA_NAME || TREE_CODE (b->decl) == SSA_NAME) 521 1.1 mrg return true; 522 1.1 mrg 523 1.1 mrg if (!a->conflicts || !b->conflicts) 524 1.1 mrg return false; 525 1.1 mrg return bitmap_bit_p (a->conflicts, y); 526 1.1 mrg } 527 1.1 mrg 528 1.1 mrg /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var 529 1.1 mrg enter its partition number into bitmap DATA. */ 530 1.1 mrg 531 1.1 mrg static bool 532 1.1 mrg visit_op (gimple *, tree op, tree, void *data) 533 1.1 mrg { 534 1.1 mrg bitmap active = (bitmap)data; 535 1.1 mrg op = get_base_address (op); 536 1.1 mrg if (op 537 1.1 mrg && DECL_P (op) 538 1.1 mrg && DECL_RTL_IF_SET (op) == pc_rtx) 539 1.1 mrg { 540 1.1 mrg size_t *v = decl_to_stack_part->get (op); 541 1.1 mrg if (v) 542 1.1 mrg bitmap_set_bit (active, *v); 543 1.1 mrg } 544 1.1 mrg return false; 545 1.1 mrg } 546 1.1 mrg 547 1.1 mrg /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var 548 1.1 mrg record conflicts between it and all currently active other partitions 549 1.1 mrg from bitmap DATA. */ 550 1.1 mrg 551 1.1 mrg static bool 552 1.1 mrg visit_conflict (gimple *, tree op, tree, void *data) 553 1.1 mrg { 554 1.1 mrg bitmap active = (bitmap)data; 555 1.1 mrg op = get_base_address (op); 556 1.1 mrg if (op 557 1.1 mrg && DECL_P (op) 558 1.1 mrg && DECL_RTL_IF_SET (op) == pc_rtx) 559 1.1 mrg { 560 1.1 mrg size_t *v = decl_to_stack_part->get (op); 561 1.1 mrg if (v && bitmap_set_bit (active, *v)) 562 1.1 mrg { 563 1.1 mrg size_t num = *v; 564 1.1 mrg bitmap_iterator bi; 565 1.1 mrg unsigned i; 566 1.1 mrg gcc_assert (num < stack_vars_num); 567 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi) 568 1.1 mrg add_stack_var_conflict (num, i); 569 1.1 mrg } 570 1.1 mrg } 571 1.1 mrg return false; 572 1.1 mrg } 573 1.1 mrg 574 1.3 mrg /* Helper function for add_scope_conflicts_1. For USE on 575 1.3 mrg a stmt, if it is a SSA_NAME and in its SSA_NAME_DEF_STMT is known to be 576 1.3 mrg based on some ADDR_EXPR, invoke VISIT on that ADDR_EXPR. */ 577 1.3 mrg 578 1.3 mrg static inline void 579 1.3 mrg add_scope_conflicts_2 (tree use, bitmap work, 580 1.3 mrg walk_stmt_load_store_addr_fn visit) 581 1.3 mrg { 582 1.3 mrg if (TREE_CODE (use) == SSA_NAME 583 1.3 mrg && (POINTER_TYPE_P (TREE_TYPE (use)) 584 1.3 mrg || INTEGRAL_TYPE_P (TREE_TYPE (use)))) 585 1.3 mrg { 586 1.3 mrg gimple *g = SSA_NAME_DEF_STMT (use); 587 1.3 mrg if (is_gimple_assign (g)) 588 1.3 mrg if (tree op = gimple_assign_rhs1 (g)) 589 1.3 mrg if (TREE_CODE (op) == ADDR_EXPR) 590 1.3 mrg visit (g, TREE_OPERAND (op, 0), op, work); 591 1.3 mrg } 592 1.3 mrg } 593 1.3 mrg 594 1.1 mrg /* Helper routine for add_scope_conflicts, calculating the active partitions 595 1.1 mrg at the end of BB, leaving the result in WORK. We're called to generate 596 1.1 mrg conflicts when FOR_CONFLICT is true, otherwise we're just tracking 597 1.1 mrg liveness. */ 598 1.1 mrg 599 1.1 mrg static void 600 1.1 mrg add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict) 601 1.1 mrg { 602 1.1 mrg edge e; 603 1.1 mrg edge_iterator ei; 604 1.1 mrg gimple_stmt_iterator gsi; 605 1.1 mrg walk_stmt_load_store_addr_fn visit; 606 1.3 mrg use_operand_p use_p; 607 1.3 mrg ssa_op_iter iter; 608 1.1 mrg 609 1.1 mrg bitmap_clear (work); 610 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds) 611 1.1 mrg bitmap_ior_into (work, (bitmap)e->src->aux); 612 1.1 mrg 613 1.1 mrg visit = visit_op; 614 1.1 mrg 615 1.1 mrg for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 616 1.1 mrg { 617 1.1 mrg gimple *stmt = gsi_stmt (gsi); 618 1.3 mrg gphi *phi = as_a <gphi *> (stmt); 619 1.1 mrg walk_stmt_load_store_addr_ops (stmt, work, NULL, NULL, visit); 620 1.3 mrg FOR_EACH_PHI_ARG (use_p, phi, iter, SSA_OP_USE) 621 1.3 mrg add_scope_conflicts_2 (USE_FROM_PTR (use_p), work, visit); 622 1.1 mrg } 623 1.1 mrg for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 624 1.1 mrg { 625 1.1 mrg gimple *stmt = gsi_stmt (gsi); 626 1.1 mrg 627 1.1 mrg if (gimple_clobber_p (stmt)) 628 1.1 mrg { 629 1.1 mrg tree lhs = gimple_assign_lhs (stmt); 630 1.1 mrg size_t *v; 631 1.1 mrg /* Nested function lowering might introduce LHSs 632 1.1 mrg that are COMPONENT_REFs. */ 633 1.1 mrg if (!VAR_P (lhs)) 634 1.1 mrg continue; 635 1.1 mrg if (DECL_RTL_IF_SET (lhs) == pc_rtx 636 1.1 mrg && (v = decl_to_stack_part->get (lhs))) 637 1.1 mrg bitmap_clear_bit (work, *v); 638 1.1 mrg } 639 1.1 mrg else if (!is_gimple_debug (stmt)) 640 1.1 mrg { 641 1.3 mrg if (for_conflict && visit == visit_op) 642 1.1 mrg { 643 1.1 mrg /* If this is the first real instruction in this BB we need 644 1.1 mrg to add conflicts for everything live at this point now. 645 1.1 mrg Unlike classical liveness for named objects we can't 646 1.1 mrg rely on seeing a def/use of the names we're interested in. 647 1.1 mrg There might merely be indirect loads/stores. We'd not add any 648 1.1 mrg conflicts for such partitions. */ 649 1.1 mrg bitmap_iterator bi; 650 1.1 mrg unsigned i; 651 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi) 652 1.1 mrg { 653 1.1 mrg class stack_var *a = &stack_vars[i]; 654 1.1 mrg if (!a->conflicts) 655 1.1 mrg a->conflicts = BITMAP_ALLOC (&stack_var_bitmap_obstack); 656 1.1 mrg bitmap_ior_into (a->conflicts, work); 657 1.1 mrg } 658 1.1 mrg visit = visit_conflict; 659 1.1 mrg } 660 1.1 mrg walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit); 661 1.3 mrg FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) 662 1.3 mrg add_scope_conflicts_2 (USE_FROM_PTR (use_p), work, visit); 663 1.1 mrg } 664 1.1 mrg } 665 1.1 mrg } 666 1.1 mrg 667 1.1 mrg /* Generate stack partition conflicts between all partitions that are 668 1.1 mrg simultaneously live. */ 669 1.1 mrg 670 1.1 mrg static void 671 1.1 mrg add_scope_conflicts (void) 672 1.1 mrg { 673 1.1 mrg basic_block bb; 674 1.1 mrg bool changed; 675 1.1 mrg bitmap work = BITMAP_ALLOC (NULL); 676 1.1 mrg int *rpo; 677 1.1 mrg int n_bbs; 678 1.1 mrg 679 1.1 mrg /* We approximate the live range of a stack variable by taking the first 680 1.1 mrg mention of its name as starting point(s), and by the end-of-scope 681 1.1 mrg death clobber added by gimplify as ending point(s) of the range. 682 1.1 mrg This overapproximates in the case we for instance moved an address-taken 683 1.1 mrg operation upward, without also moving a dereference to it upwards. 684 1.1 mrg But it's conservatively correct as a variable never can hold values 685 1.1 mrg before its name is mentioned at least once. 686 1.1 mrg 687 1.1 mrg We then do a mostly classical bitmap liveness algorithm. */ 688 1.1 mrg 689 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 690 1.1 mrg bb->aux = BITMAP_ALLOC (&stack_var_bitmap_obstack); 691 1.1 mrg 692 1.1 mrg rpo = XNEWVEC (int, last_basic_block_for_fn (cfun)); 693 1.1 mrg n_bbs = pre_and_rev_post_order_compute (NULL, rpo, false); 694 1.1 mrg 695 1.1 mrg changed = true; 696 1.1 mrg while (changed) 697 1.1 mrg { 698 1.1 mrg int i; 699 1.1 mrg changed = false; 700 1.1 mrg for (i = 0; i < n_bbs; i++) 701 1.1 mrg { 702 1.1 mrg bitmap active; 703 1.1 mrg bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]); 704 1.1 mrg active = (bitmap)bb->aux; 705 1.1 mrg add_scope_conflicts_1 (bb, work, false); 706 1.1 mrg if (bitmap_ior_into (active, work)) 707 1.1 mrg changed = true; 708 1.1 mrg } 709 1.1 mrg } 710 1.1 mrg 711 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 712 1.1 mrg add_scope_conflicts_1 (bb, work, true); 713 1.1 mrg 714 1.1 mrg free (rpo); 715 1.1 mrg BITMAP_FREE (work); 716 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 717 1.1 mrg BITMAP_FREE (bb->aux); 718 1.1 mrg } 719 1.1 mrg 720 1.1 mrg /* A subroutine of partition_stack_vars. A comparison function for qsort, 721 1.1 mrg sorting an array of indices by the properties of the object. */ 722 1.1 mrg 723 1.1 mrg static int 724 1.1 mrg stack_var_cmp (const void *a, const void *b) 725 1.1 mrg { 726 1.1 mrg size_t ia = *(const size_t *)a; 727 1.1 mrg size_t ib = *(const size_t *)b; 728 1.1 mrg unsigned int aligna = stack_vars[ia].alignb; 729 1.1 mrg unsigned int alignb = stack_vars[ib].alignb; 730 1.1 mrg poly_int64 sizea = stack_vars[ia].size; 731 1.1 mrg poly_int64 sizeb = stack_vars[ib].size; 732 1.1 mrg tree decla = stack_vars[ia].decl; 733 1.1 mrg tree declb = stack_vars[ib].decl; 734 1.1 mrg bool largea, largeb; 735 1.1 mrg unsigned int uida, uidb; 736 1.1 mrg 737 1.1 mrg /* Primary compare on "large" alignment. Large comes first. */ 738 1.1 mrg largea = (aligna * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT); 739 1.1 mrg largeb = (alignb * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT); 740 1.1 mrg if (largea != largeb) 741 1.1 mrg return (int)largeb - (int)largea; 742 1.1 mrg 743 1.1 mrg /* Secondary compare on size, decreasing */ 744 1.1 mrg int diff = compare_sizes_for_sort (sizeb, sizea); 745 1.1 mrg if (diff != 0) 746 1.1 mrg return diff; 747 1.1 mrg 748 1.1 mrg /* Tertiary compare on true alignment, decreasing. */ 749 1.1 mrg if (aligna < alignb) 750 1.1 mrg return -1; 751 1.1 mrg if (aligna > alignb) 752 1.1 mrg return 1; 753 1.1 mrg 754 1.1 mrg /* Final compare on ID for sort stability, increasing. 755 1.1 mrg Two SSA names are compared by their version, SSA names come before 756 1.1 mrg non-SSA names, and two normal decls are compared by their DECL_UID. */ 757 1.1 mrg if (TREE_CODE (decla) == SSA_NAME) 758 1.1 mrg { 759 1.1 mrg if (TREE_CODE (declb) == SSA_NAME) 760 1.1 mrg uida = SSA_NAME_VERSION (decla), uidb = SSA_NAME_VERSION (declb); 761 1.1 mrg else 762 1.1 mrg return -1; 763 1.1 mrg } 764 1.1 mrg else if (TREE_CODE (declb) == SSA_NAME) 765 1.1 mrg return 1; 766 1.1 mrg else 767 1.1 mrg uida = DECL_UID (decla), uidb = DECL_UID (declb); 768 1.1 mrg if (uida < uidb) 769 1.1 mrg return 1; 770 1.1 mrg if (uida > uidb) 771 1.1 mrg return -1; 772 1.1 mrg return 0; 773 1.1 mrg } 774 1.1 mrg 775 1.1 mrg struct part_traits : unbounded_int_hashmap_traits <size_t, bitmap> {}; 776 1.1 mrg typedef hash_map<size_t, bitmap, part_traits> part_hashmap; 777 1.1 mrg 778 1.1 mrg /* If the points-to solution *PI points to variables that are in a partition 779 1.1 mrg together with other variables add all partition members to the pointed-to 780 1.1 mrg variables bitmap. */ 781 1.1 mrg 782 1.1 mrg static void 783 1.1 mrg add_partitioned_vars_to_ptset (struct pt_solution *pt, 784 1.1 mrg part_hashmap *decls_to_partitions, 785 1.1 mrg hash_set<bitmap> *visited, bitmap temp) 786 1.1 mrg { 787 1.1 mrg bitmap_iterator bi; 788 1.1 mrg unsigned i; 789 1.1 mrg bitmap *part; 790 1.1 mrg 791 1.1 mrg if (pt->anything 792 1.1 mrg || pt->vars == NULL 793 1.1 mrg /* The pointed-to vars bitmap is shared, it is enough to 794 1.1 mrg visit it once. */ 795 1.1 mrg || visited->add (pt->vars)) 796 1.1 mrg return; 797 1.1 mrg 798 1.1 mrg bitmap_clear (temp); 799 1.1 mrg 800 1.1 mrg /* By using a temporary bitmap to store all members of the partitions 801 1.1 mrg we have to add we make sure to visit each of the partitions only 802 1.1 mrg once. */ 803 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (pt->vars, 0, i, bi) 804 1.1 mrg if ((!temp 805 1.1 mrg || !bitmap_bit_p (temp, i)) 806 1.1 mrg && (part = decls_to_partitions->get (i))) 807 1.1 mrg bitmap_ior_into (temp, *part); 808 1.1 mrg if (!bitmap_empty_p (temp)) 809 1.1 mrg bitmap_ior_into (pt->vars, temp); 810 1.1 mrg } 811 1.1 mrg 812 1.1 mrg /* Update points-to sets based on partition info, so we can use them on RTL. 813 1.1 mrg The bitmaps representing stack partitions will be saved until expand, 814 1.1 mrg where partitioned decls used as bases in memory expressions will be 815 1.5 mrg rewritten. 816 1.5 mrg 817 1.5 mrg It is not necessary to update TBAA info on accesses to the coalesced 818 1.5 mrg storage since our memory model doesn't allow TBAA to be used for 819 1.5 mrg WAW or WAR dependences. For RAW when the write is to an old object 820 1.5 mrg the new object would not have been initialized at the point of the 821 1.5 mrg read, invoking undefined behavior. */ 822 1.1 mrg 823 1.1 mrg static void 824 1.1 mrg update_alias_info_with_stack_vars (void) 825 1.1 mrg { 826 1.1 mrg part_hashmap *decls_to_partitions = NULL; 827 1.1 mrg size_t i, j; 828 1.1 mrg tree var = NULL_TREE; 829 1.1 mrg 830 1.1 mrg for (i = 0; i < stack_vars_num; i++) 831 1.1 mrg { 832 1.1 mrg bitmap part = NULL; 833 1.1 mrg tree name; 834 1.1 mrg struct ptr_info_def *pi; 835 1.1 mrg 836 1.1 mrg /* Not interested in partitions with single variable. */ 837 1.1 mrg if (stack_vars[i].representative != i 838 1.1 mrg || stack_vars[i].next == EOC) 839 1.1 mrg continue; 840 1.1 mrg 841 1.1 mrg if (!decls_to_partitions) 842 1.1 mrg { 843 1.1 mrg decls_to_partitions = new part_hashmap; 844 1.1 mrg cfun->gimple_df->decls_to_pointers = new hash_map<tree, tree>; 845 1.1 mrg } 846 1.1 mrg 847 1.1 mrg /* Create an SSA_NAME that points to the partition for use 848 1.1 mrg as base during alias-oracle queries on RTL for bases that 849 1.1 mrg have been partitioned. */ 850 1.1 mrg if (var == NULL_TREE) 851 1.1 mrg var = create_tmp_var (ptr_type_node); 852 1.1 mrg name = make_ssa_name (var); 853 1.1 mrg 854 1.1 mrg /* Create bitmaps representing partitions. They will be used for 855 1.1 mrg points-to sets later, so use GGC alloc. */ 856 1.1 mrg part = BITMAP_GGC_ALLOC (); 857 1.1 mrg for (j = i; j != EOC; j = stack_vars[j].next) 858 1.1 mrg { 859 1.1 mrg tree decl = stack_vars[j].decl; 860 1.1 mrg unsigned int uid = DECL_PT_UID (decl); 861 1.1 mrg bitmap_set_bit (part, uid); 862 1.1 mrg decls_to_partitions->put (uid, part); 863 1.1 mrg cfun->gimple_df->decls_to_pointers->put (decl, name); 864 1.1 mrg if (TREE_ADDRESSABLE (decl)) 865 1.1 mrg TREE_ADDRESSABLE (name) = 1; 866 1.1 mrg } 867 1.1 mrg 868 1.1 mrg /* Make the SSA name point to all partition members. */ 869 1.1 mrg pi = get_ptr_info (name); 870 1.1 mrg pt_solution_set (&pi->pt, part, false); 871 1.1 mrg } 872 1.1 mrg 873 1.1 mrg /* Make all points-to sets that contain one member of a partition 874 1.1 mrg contain all members of the partition. */ 875 1.1 mrg if (decls_to_partitions) 876 1.1 mrg { 877 1.1 mrg unsigned i; 878 1.1 mrg tree name; 879 1.1 mrg hash_set<bitmap> visited; 880 1.1 mrg bitmap temp = BITMAP_ALLOC (&stack_var_bitmap_obstack); 881 1.1 mrg 882 1.1 mrg FOR_EACH_SSA_NAME (i, name, cfun) 883 1.1 mrg { 884 1.1 mrg struct ptr_info_def *pi; 885 1.1 mrg 886 1.1 mrg if (POINTER_TYPE_P (TREE_TYPE (name)) 887 1.1 mrg && ((pi = SSA_NAME_PTR_INFO (name)) != NULL)) 888 1.1 mrg add_partitioned_vars_to_ptset (&pi->pt, decls_to_partitions, 889 1.1 mrg &visited, temp); 890 1.1 mrg } 891 1.1 mrg 892 1.1 mrg add_partitioned_vars_to_ptset (&cfun->gimple_df->escaped, 893 1.1 mrg decls_to_partitions, &visited, temp); 894 1.5 mrg add_partitioned_vars_to_ptset (&cfun->gimple_df->escaped_return, 895 1.5 mrg decls_to_partitions, &visited, temp); 896 1.1 mrg delete decls_to_partitions; 897 1.1 mrg BITMAP_FREE (temp); 898 1.1 mrg } 899 1.1 mrg } 900 1.1 mrg 901 1.1 mrg /* A subroutine of partition_stack_vars. The UNION portion of a UNION/FIND 902 1.1 mrg partitioning algorithm. Partitions A and B are known to be non-conflicting. 903 1.1 mrg Merge them into a single partition A. */ 904 1.1 mrg 905 1.1 mrg static void 906 1.1 mrg union_stack_vars (size_t a, size_t b) 907 1.1 mrg { 908 1.1 mrg class stack_var *vb = &stack_vars[b]; 909 1.1 mrg bitmap_iterator bi; 910 1.1 mrg unsigned u; 911 1.1 mrg 912 1.1 mrg gcc_assert (stack_vars[b].next == EOC); 913 1.1 mrg /* Add B to A's partition. */ 914 1.1 mrg stack_vars[b].next = stack_vars[a].next; 915 1.1 mrg stack_vars[b].representative = a; 916 1.1 mrg stack_vars[a].next = b; 917 1.1 mrg 918 1.1 mrg /* Make sure A is big enough to hold B. */ 919 1.1 mrg stack_vars[a].size = upper_bound (stack_vars[a].size, stack_vars[b].size); 920 1.1 mrg 921 1.1 mrg /* Update the required alignment of partition A to account for B. */ 922 1.1 mrg if (stack_vars[a].alignb < stack_vars[b].alignb) 923 1.1 mrg stack_vars[a].alignb = stack_vars[b].alignb; 924 1.1 mrg 925 1.1 mrg /* Update the interference graph and merge the conflicts. */ 926 1.1 mrg if (vb->conflicts) 927 1.1 mrg { 928 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (vb->conflicts, 0, u, bi) 929 1.1 mrg add_stack_var_conflict (a, stack_vars[u].representative); 930 1.1 mrg BITMAP_FREE (vb->conflicts); 931 1.1 mrg } 932 1.1 mrg } 933 1.1 mrg 934 1.1 mrg /* A subroutine of expand_used_vars. Binpack the variables into 935 1.1 mrg partitions constrained by the interference graph. The overall 936 1.1 mrg algorithm used is as follows: 937 1.1 mrg 938 1.1 mrg Sort the objects by size in descending order. 939 1.1 mrg For each object A { 940 1.1 mrg S = size(A) 941 1.1 mrg O = 0 942 1.1 mrg loop { 943 1.1 mrg Look for the largest non-conflicting object B with size <= S. 944 1.1 mrg UNION (A, B) 945 1.1 mrg } 946 1.1 mrg } 947 1.1 mrg */ 948 1.1 mrg 949 1.1 mrg static void 950 1.1 mrg partition_stack_vars (void) 951 1.1 mrg { 952 1.1 mrg size_t si, sj, n = stack_vars_num; 953 1.1 mrg 954 1.1 mrg stack_vars_sorted = XNEWVEC (size_t, stack_vars_num); 955 1.1 mrg for (si = 0; si < n; ++si) 956 1.1 mrg stack_vars_sorted[si] = si; 957 1.1 mrg 958 1.1 mrg if (n == 1) 959 1.1 mrg return; 960 1.1 mrg 961 1.1 mrg qsort (stack_vars_sorted, n, sizeof (size_t), stack_var_cmp); 962 1.1 mrg 963 1.1 mrg for (si = 0; si < n; ++si) 964 1.1 mrg { 965 1.1 mrg size_t i = stack_vars_sorted[si]; 966 1.1 mrg unsigned int ialign = stack_vars[i].alignb; 967 1.1 mrg poly_int64 isize = stack_vars[i].size; 968 1.1 mrg 969 1.1 mrg /* Ignore objects that aren't partition representatives. If we 970 1.1 mrg see a var that is not a partition representative, it must 971 1.1 mrg have been merged earlier. */ 972 1.1 mrg if (stack_vars[i].representative != i) 973 1.1 mrg continue; 974 1.1 mrg 975 1.1 mrg for (sj = si + 1; sj < n; ++sj) 976 1.1 mrg { 977 1.1 mrg size_t j = stack_vars_sorted[sj]; 978 1.1 mrg unsigned int jalign = stack_vars[j].alignb; 979 1.1 mrg poly_int64 jsize = stack_vars[j].size; 980 1.1 mrg 981 1.1 mrg /* Ignore objects that aren't partition representatives. */ 982 1.1 mrg if (stack_vars[j].representative != j) 983 1.1 mrg continue; 984 1.1 mrg 985 1.1 mrg /* Do not mix objects of "small" (supported) alignment 986 1.1 mrg and "large" (unsupported) alignment. */ 987 1.1 mrg if ((ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 988 1.1 mrg != (jalign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)) 989 1.1 mrg break; 990 1.1 mrg 991 1.1 mrg /* For Address Sanitizer do not mix objects with different 992 1.1 mrg sizes, as the shorter vars wouldn't be adequately protected. 993 1.1 mrg Don't do that for "large" (unsupported) alignment objects, 994 1.1 mrg those aren't protected anyway. */ 995 1.1 mrg if (asan_sanitize_stack_p () 996 1.1 mrg && maybe_ne (isize, jsize) 997 1.1 mrg && ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 998 1.1 mrg break; 999 1.1 mrg 1000 1.1 mrg /* Ignore conflicting objects. */ 1001 1.1 mrg if (stack_var_conflict_p (i, j)) 1002 1.1 mrg continue; 1003 1.1 mrg 1004 1.1 mrg /* UNION the objects, placing J at OFFSET. */ 1005 1.1 mrg union_stack_vars (i, j); 1006 1.1 mrg } 1007 1.1 mrg } 1008 1.1 mrg 1009 1.1 mrg update_alias_info_with_stack_vars (); 1010 1.1 mrg } 1011 1.1 mrg 1012 1.1 mrg /* A debugging aid for expand_used_vars. Dump the generated partitions. */ 1013 1.1 mrg 1014 1.1 mrg static void 1015 1.1 mrg dump_stack_var_partition (void) 1016 1.1 mrg { 1017 1.1 mrg size_t si, i, j, n = stack_vars_num; 1018 1.1 mrg 1019 1.1 mrg for (si = 0; si < n; ++si) 1020 1.1 mrg { 1021 1.1 mrg i = stack_vars_sorted[si]; 1022 1.1 mrg 1023 1.1 mrg /* Skip variables that aren't partition representatives, for now. */ 1024 1.1 mrg if (stack_vars[i].representative != i) 1025 1.1 mrg continue; 1026 1.1 mrg 1027 1.5 mrg fprintf (dump_file, "Partition " HOST_SIZE_T_PRINT_UNSIGNED ": size ", 1028 1.5 mrg (fmt_size_t) i); 1029 1.1 mrg print_dec (stack_vars[i].size, dump_file); 1030 1.1 mrg fprintf (dump_file, " align %u\n", stack_vars[i].alignb); 1031 1.1 mrg 1032 1.1 mrg for (j = i; j != EOC; j = stack_vars[j].next) 1033 1.1 mrg { 1034 1.1 mrg fputc ('\t', dump_file); 1035 1.1 mrg print_generic_expr (dump_file, stack_vars[j].decl, dump_flags); 1036 1.1 mrg } 1037 1.1 mrg fputc ('\n', dump_file); 1038 1.1 mrg } 1039 1.1 mrg } 1040 1.1 mrg 1041 1.1 mrg /* Assign rtl to DECL at BASE + OFFSET. */ 1042 1.1 mrg 1043 1.1 mrg static void 1044 1.1 mrg expand_one_stack_var_at (tree decl, rtx base, unsigned base_align, 1045 1.1 mrg poly_int64 offset) 1046 1.1 mrg { 1047 1.1 mrg unsigned align; 1048 1.1 mrg rtx x; 1049 1.1 mrg 1050 1.1 mrg /* If this fails, we've overflowed the stack frame. Error nicely? */ 1051 1.1 mrg gcc_assert (known_eq (offset, trunc_int_for_mode (offset, Pmode))); 1052 1.1 mrg 1053 1.1 mrg if (hwasan_sanitize_stack_p ()) 1054 1.1 mrg x = targetm.memtag.add_tag (base, offset, 1055 1.1 mrg hwasan_current_frame_tag ()); 1056 1.1 mrg else 1057 1.1 mrg x = plus_constant (Pmode, base, offset); 1058 1.1 mrg 1059 1.1 mrg x = gen_rtx_MEM (TREE_CODE (decl) == SSA_NAME 1060 1.1 mrg ? TYPE_MODE (TREE_TYPE (decl)) 1061 1.1 mrg : DECL_MODE (decl), x); 1062 1.1 mrg 1063 1.1 mrg /* Set alignment we actually gave this decl if it isn't an SSA name. 1064 1.1 mrg If it is we generate stack slots only accidentally so it isn't as 1065 1.1 mrg important, we'll simply set the alignment directly on the MEM. */ 1066 1.1 mrg 1067 1.1 mrg if (stack_vars_base_reg_p (base)) 1068 1.1 mrg offset -= frame_phase; 1069 1.1 mrg align = known_alignment (offset); 1070 1.1 mrg align *= BITS_PER_UNIT; 1071 1.1 mrg if (align == 0 || align > base_align) 1072 1.1 mrg align = base_align; 1073 1.1 mrg 1074 1.1 mrg if (TREE_CODE (decl) != SSA_NAME) 1075 1.1 mrg { 1076 1.1 mrg /* One would think that we could assert that we're not decreasing 1077 1.1 mrg alignment here, but (at least) the i386 port does exactly this 1078 1.1 mrg via the MINIMUM_ALIGNMENT hook. */ 1079 1.1 mrg 1080 1.1 mrg SET_DECL_ALIGN (decl, align); 1081 1.1 mrg DECL_USER_ALIGN (decl) = 0; 1082 1.1 mrg } 1083 1.1 mrg 1084 1.1 mrg set_rtl (decl, x); 1085 1.1 mrg 1086 1.1 mrg set_mem_align (x, align); 1087 1.1 mrg } 1088 1.1 mrg 1089 1.1 mrg class stack_vars_data 1090 1.1 mrg { 1091 1.1 mrg public: 1092 1.1 mrg /* Vector of offset pairs, always end of some padding followed 1093 1.1 mrg by start of the padding that needs Address Sanitizer protection. 1094 1.1 mrg The vector is in reversed, highest offset pairs come first. */ 1095 1.1 mrg auto_vec<HOST_WIDE_INT> asan_vec; 1096 1.1 mrg 1097 1.1 mrg /* Vector of partition representative decls in between the paddings. */ 1098 1.1 mrg auto_vec<tree> asan_decl_vec; 1099 1.1 mrg 1100 1.1 mrg /* Base pseudo register for Address Sanitizer protected automatic vars. */ 1101 1.1 mrg rtx asan_base; 1102 1.1 mrg 1103 1.1 mrg /* Alignment needed for the Address Sanitizer protected automatic vars. */ 1104 1.1 mrg unsigned int asan_alignb; 1105 1.1 mrg }; 1106 1.1 mrg 1107 1.1 mrg /* A subroutine of expand_used_vars. Give each partition representative 1108 1.1 mrg a unique location within the stack frame. Update each partition member 1109 1.1 mrg with that location. */ 1110 1.1 mrg static void 1111 1.1 mrg expand_stack_vars (bool (*pred) (size_t), class stack_vars_data *data) 1112 1.1 mrg { 1113 1.1 mrg size_t si, i, j, n = stack_vars_num; 1114 1.1 mrg poly_uint64 large_size = 0, large_alloc = 0; 1115 1.1 mrg rtx large_base = NULL; 1116 1.1 mrg rtx large_untagged_base = NULL; 1117 1.1 mrg unsigned large_align = 0; 1118 1.1 mrg bool large_allocation_done = false; 1119 1.1 mrg tree decl; 1120 1.1 mrg 1121 1.1 mrg /* Determine if there are any variables requiring "large" alignment. 1122 1.1 mrg Since these are dynamically allocated, we only process these if 1123 1.1 mrg no predicate involved. */ 1124 1.1 mrg large_align = stack_vars[stack_vars_sorted[0]].alignb * BITS_PER_UNIT; 1125 1.1 mrg if (pred == NULL && large_align > MAX_SUPPORTED_STACK_ALIGNMENT) 1126 1.1 mrg { 1127 1.1 mrg /* Find the total size of these variables. */ 1128 1.1 mrg for (si = 0; si < n; ++si) 1129 1.1 mrg { 1130 1.1 mrg unsigned alignb; 1131 1.1 mrg 1132 1.1 mrg i = stack_vars_sorted[si]; 1133 1.1 mrg alignb = stack_vars[i].alignb; 1134 1.1 mrg 1135 1.1 mrg /* All "large" alignment decls come before all "small" alignment 1136 1.1 mrg decls, but "large" alignment decls are not sorted based on 1137 1.1 mrg their alignment. Increase large_align to track the largest 1138 1.1 mrg required alignment. */ 1139 1.1 mrg if ((alignb * BITS_PER_UNIT) > large_align) 1140 1.1 mrg large_align = alignb * BITS_PER_UNIT; 1141 1.1 mrg 1142 1.1 mrg /* Stop when we get to the first decl with "small" alignment. */ 1143 1.1 mrg if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 1144 1.1 mrg break; 1145 1.1 mrg 1146 1.1 mrg /* Skip variables that aren't partition representatives. */ 1147 1.1 mrg if (stack_vars[i].representative != i) 1148 1.1 mrg continue; 1149 1.1 mrg 1150 1.1 mrg /* Skip variables that have already had rtl assigned. See also 1151 1.1 mrg add_stack_var where we perpetrate this pc_rtx hack. */ 1152 1.1 mrg decl = stack_vars[i].decl; 1153 1.1 mrg if (TREE_CODE (decl) == SSA_NAME 1154 1.1 mrg ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)] != NULL_RTX 1155 1.1 mrg : DECL_RTL (decl) != pc_rtx) 1156 1.1 mrg continue; 1157 1.1 mrg 1158 1.1 mrg large_size = aligned_upper_bound (large_size, alignb); 1159 1.1 mrg large_size += stack_vars[i].size; 1160 1.1 mrg } 1161 1.1 mrg } 1162 1.1 mrg 1163 1.1 mrg for (si = 0; si < n; ++si) 1164 1.1 mrg { 1165 1.1 mrg rtx base; 1166 1.1 mrg unsigned base_align, alignb; 1167 1.1 mrg poly_int64 offset = 0; 1168 1.1 mrg 1169 1.1 mrg i = stack_vars_sorted[si]; 1170 1.1 mrg 1171 1.1 mrg /* Skip variables that aren't partition representatives, for now. */ 1172 1.1 mrg if (stack_vars[i].representative != i) 1173 1.1 mrg continue; 1174 1.1 mrg 1175 1.1 mrg /* Skip variables that have already had rtl assigned. See also 1176 1.1 mrg add_stack_var where we perpetrate this pc_rtx hack. */ 1177 1.1 mrg decl = stack_vars[i].decl; 1178 1.1 mrg if (TREE_CODE (decl) == SSA_NAME 1179 1.1 mrg ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)] != NULL_RTX 1180 1.1 mrg : DECL_RTL (decl) != pc_rtx) 1181 1.1 mrg continue; 1182 1.1 mrg 1183 1.1 mrg /* Check the predicate to see whether this variable should be 1184 1.1 mrg allocated in this pass. */ 1185 1.1 mrg if (pred && !pred (i)) 1186 1.1 mrg continue; 1187 1.1 mrg 1188 1.1 mrg base = (hwasan_sanitize_stack_p () 1189 1.1 mrg ? hwasan_frame_base () 1190 1.1 mrg : virtual_stack_vars_rtx); 1191 1.1 mrg alignb = stack_vars[i].alignb; 1192 1.1 mrg if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT) 1193 1.1 mrg { 1194 1.1 mrg poly_int64 hwasan_orig_offset; 1195 1.1 mrg if (hwasan_sanitize_stack_p ()) 1196 1.1 mrg { 1197 1.1 mrg /* There must be no tag granule "shared" between different 1198 1.1 mrg objects. This means that no HWASAN_TAG_GRANULE_SIZE byte 1199 1.1 mrg chunk can have more than one object in it. 1200 1.1 mrg 1201 1.1 mrg We ensure this by forcing the end of the last bit of data to 1202 1.1 mrg be aligned to HWASAN_TAG_GRANULE_SIZE bytes here, and setting 1203 1.1 mrg the start of each variable to be aligned to 1204 1.1 mrg HWASAN_TAG_GRANULE_SIZE bytes in `align_local_variable`. 1205 1.1 mrg 1206 1.1 mrg We can't align just one of the start or end, since there are 1207 1.1 mrg untagged things stored on the stack which we do not align to 1208 1.1 mrg HWASAN_TAG_GRANULE_SIZE bytes. If we only aligned the start 1209 1.1 mrg or the end of tagged objects then untagged objects could end 1210 1.1 mrg up sharing the first granule of a tagged object or sharing the 1211 1.1 mrg last granule of a tagged object respectively. */ 1212 1.1 mrg hwasan_orig_offset = align_frame_offset (HWASAN_TAG_GRANULE_SIZE); 1213 1.1 mrg gcc_assert (stack_vars[i].alignb >= HWASAN_TAG_GRANULE_SIZE); 1214 1.1 mrg } 1215 1.1 mrg /* ASAN description strings don't yet have a syntax for expressing 1216 1.1 mrg polynomial offsets. */ 1217 1.1 mrg HOST_WIDE_INT prev_offset; 1218 1.1 mrg if (asan_sanitize_stack_p () 1219 1.1 mrg && pred 1220 1.1 mrg && frame_offset.is_constant (&prev_offset) 1221 1.1 mrg && stack_vars[i].size.is_constant ()) 1222 1.1 mrg { 1223 1.1 mrg if (data->asan_vec.is_empty ()) 1224 1.1 mrg { 1225 1.1 mrg align_frame_offset (ASAN_RED_ZONE_SIZE); 1226 1.1 mrg prev_offset = frame_offset.to_constant (); 1227 1.1 mrg } 1228 1.1 mrg prev_offset = align_base (prev_offset, 1229 1.1 mrg ASAN_MIN_RED_ZONE_SIZE, 1230 1.1 mrg !FRAME_GROWS_DOWNWARD); 1231 1.1 mrg tree repr_decl = NULL_TREE; 1232 1.1 mrg unsigned HOST_WIDE_INT size 1233 1.1 mrg = asan_var_and_redzone_size (stack_vars[i].size.to_constant ()); 1234 1.1 mrg if (data->asan_vec.is_empty ()) 1235 1.1 mrg size = MAX (size, ASAN_RED_ZONE_SIZE); 1236 1.1 mrg 1237 1.1 mrg unsigned HOST_WIDE_INT alignment = MAX (alignb, 1238 1.1 mrg ASAN_MIN_RED_ZONE_SIZE); 1239 1.1 mrg offset = alloc_stack_frame_space (size, alignment); 1240 1.1 mrg 1241 1.1 mrg data->asan_vec.safe_push (prev_offset); 1242 1.1 mrg /* Allocating a constant amount of space from a constant 1243 1.1 mrg starting offset must give a constant result. */ 1244 1.1 mrg data->asan_vec.safe_push ((offset + stack_vars[i].size) 1245 1.1 mrg .to_constant ()); 1246 1.1 mrg /* Find best representative of the partition. 1247 1.1 mrg Prefer those with DECL_NAME, even better 1248 1.1 mrg satisfying asan_protect_stack_decl predicate. */ 1249 1.1 mrg for (j = i; j != EOC; j = stack_vars[j].next) 1250 1.1 mrg if (asan_protect_stack_decl (stack_vars[j].decl) 1251 1.1 mrg && DECL_NAME (stack_vars[j].decl)) 1252 1.1 mrg { 1253 1.1 mrg repr_decl = stack_vars[j].decl; 1254 1.1 mrg break; 1255 1.1 mrg } 1256 1.1 mrg else if (repr_decl == NULL_TREE 1257 1.1 mrg && DECL_P (stack_vars[j].decl) 1258 1.1 mrg && DECL_NAME (stack_vars[j].decl)) 1259 1.1 mrg repr_decl = stack_vars[j].decl; 1260 1.1 mrg if (repr_decl == NULL_TREE) 1261 1.1 mrg repr_decl = stack_vars[i].decl; 1262 1.1 mrg data->asan_decl_vec.safe_push (repr_decl); 1263 1.1 mrg 1264 1.1 mrg /* Make sure a representative is unpoison if another 1265 1.1 mrg variable in the partition is handled by 1266 1.1 mrg use-after-scope sanitization. */ 1267 1.1 mrg if (asan_handled_variables != NULL 1268 1.1 mrg && !asan_handled_variables->contains (repr_decl)) 1269 1.1 mrg { 1270 1.1 mrg for (j = i; j != EOC; j = stack_vars[j].next) 1271 1.1 mrg if (asan_handled_variables->contains (stack_vars[j].decl)) 1272 1.1 mrg break; 1273 1.1 mrg if (j != EOC) 1274 1.1 mrg asan_handled_variables->add (repr_decl); 1275 1.1 mrg } 1276 1.1 mrg 1277 1.1 mrg data->asan_alignb = MAX (data->asan_alignb, alignb); 1278 1.1 mrg if (data->asan_base == NULL) 1279 1.1 mrg data->asan_base = gen_reg_rtx (Pmode); 1280 1.1 mrg base = data->asan_base; 1281 1.1 mrg 1282 1.1 mrg if (!STRICT_ALIGNMENT) 1283 1.1 mrg base_align = crtl->max_used_stack_slot_alignment; 1284 1.1 mrg else 1285 1.1 mrg base_align = MAX (crtl->max_used_stack_slot_alignment, 1286 1.1 mrg GET_MODE_ALIGNMENT (SImode) 1287 1.1 mrg << ASAN_SHADOW_SHIFT); 1288 1.1 mrg } 1289 1.1 mrg else 1290 1.1 mrg { 1291 1.1 mrg offset = alloc_stack_frame_space (stack_vars[i].size, alignb); 1292 1.1 mrg base_align = crtl->max_used_stack_slot_alignment; 1293 1.1 mrg 1294 1.1 mrg if (hwasan_sanitize_stack_p ()) 1295 1.1 mrg { 1296 1.1 mrg /* Align again since the point of this alignment is to handle 1297 1.1 mrg the "end" of the object (i.e. smallest address after the 1298 1.1 mrg stack object). For FRAME_GROWS_DOWNWARD that requires 1299 1.1 mrg aligning the stack before allocating, but for a frame that 1300 1.1 mrg grows upwards that requires aligning the stack after 1301 1.1 mrg allocation. 1302 1.1 mrg 1303 1.1 mrg Use `frame_offset` to record the offset value rather than 1304 1.1 mrg `offset` since the `frame_offset` describes the extent 1305 1.1 mrg allocated for this particular variable while `offset` 1306 1.1 mrg describes the address that this variable starts at. */ 1307 1.1 mrg align_frame_offset (HWASAN_TAG_GRANULE_SIZE); 1308 1.1 mrg hwasan_record_stack_var (virtual_stack_vars_rtx, base, 1309 1.1 mrg hwasan_orig_offset, frame_offset); 1310 1.1 mrg } 1311 1.1 mrg } 1312 1.1 mrg } 1313 1.1 mrg else 1314 1.1 mrg { 1315 1.1 mrg /* Large alignment is only processed in the last pass. */ 1316 1.1 mrg if (pred) 1317 1.1 mrg continue; 1318 1.1 mrg 1319 1.1 mrg /* If there were any variables requiring "large" alignment, allocate 1320 1.1 mrg space. */ 1321 1.1 mrg if (maybe_ne (large_size, 0U) && ! large_allocation_done) 1322 1.1 mrg { 1323 1.1 mrg poly_int64 loffset; 1324 1.1 mrg rtx large_allocsize; 1325 1.1 mrg 1326 1.1 mrg large_allocsize = gen_int_mode (large_size, Pmode); 1327 1.1 mrg get_dynamic_stack_size (&large_allocsize, 0, large_align, NULL); 1328 1.1 mrg loffset = alloc_stack_frame_space 1329 1.1 mrg (rtx_to_poly_int64 (large_allocsize), 1330 1.1 mrg PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT); 1331 1.1 mrg large_base = get_dynamic_stack_base (loffset, large_align, base); 1332 1.1 mrg large_allocation_done = true; 1333 1.1 mrg } 1334 1.1 mrg 1335 1.1 mrg gcc_assert (large_base != NULL); 1336 1.1 mrg large_alloc = aligned_upper_bound (large_alloc, alignb); 1337 1.1 mrg offset = large_alloc; 1338 1.1 mrg large_alloc += stack_vars[i].size; 1339 1.1 mrg if (hwasan_sanitize_stack_p ()) 1340 1.1 mrg { 1341 1.1 mrg /* An object with a large alignment requirement means that the 1342 1.1 mrg alignment requirement is greater than the required alignment 1343 1.1 mrg for tags. */ 1344 1.1 mrg if (!large_untagged_base) 1345 1.1 mrg large_untagged_base 1346 1.1 mrg = targetm.memtag.untagged_pointer (large_base, NULL_RTX); 1347 1.1 mrg /* Ensure the end of the variable is also aligned correctly. */ 1348 1.1 mrg poly_int64 align_again 1349 1.1 mrg = aligned_upper_bound (large_alloc, HWASAN_TAG_GRANULE_SIZE); 1350 1.1 mrg /* For large allocations we always allocate a chunk of space 1351 1.1 mrg (which is addressed by large_untagged_base/large_base) and 1352 1.1 mrg then use positive offsets from that. Hence the farthest 1353 1.1 mrg offset is `align_again` and the nearest offset from the base 1354 1.1 mrg is `offset`. */ 1355 1.1 mrg hwasan_record_stack_var (large_untagged_base, large_base, 1356 1.1 mrg offset, align_again); 1357 1.1 mrg } 1358 1.1 mrg 1359 1.1 mrg base = large_base; 1360 1.1 mrg base_align = large_align; 1361 1.1 mrg } 1362 1.1 mrg 1363 1.1 mrg /* Create rtl for each variable based on their location within the 1364 1.1 mrg partition. */ 1365 1.1 mrg for (j = i; j != EOC; j = stack_vars[j].next) 1366 1.1 mrg { 1367 1.1 mrg expand_one_stack_var_at (stack_vars[j].decl, 1368 1.1 mrg base, base_align, offset); 1369 1.1 mrg } 1370 1.1 mrg if (hwasan_sanitize_stack_p ()) 1371 1.1 mrg hwasan_increment_frame_tag (); 1372 1.1 mrg } 1373 1.1 mrg 1374 1.1 mrg gcc_assert (known_eq (large_alloc, large_size)); 1375 1.1 mrg } 1376 1.1 mrg 1377 1.1 mrg /* Take into account all sizes of partitions and reset DECL_RTLs. */ 1378 1.1 mrg static poly_uint64 1379 1.1 mrg account_stack_vars (void) 1380 1.1 mrg { 1381 1.1 mrg size_t si, j, i, n = stack_vars_num; 1382 1.1 mrg poly_uint64 size = 0; 1383 1.1 mrg 1384 1.1 mrg for (si = 0; si < n; ++si) 1385 1.1 mrg { 1386 1.1 mrg i = stack_vars_sorted[si]; 1387 1.1 mrg 1388 1.1 mrg /* Skip variables that aren't partition representatives, for now. */ 1389 1.1 mrg if (stack_vars[i].representative != i) 1390 1.1 mrg continue; 1391 1.1 mrg 1392 1.1 mrg size += stack_vars[i].size; 1393 1.1 mrg for (j = i; j != EOC; j = stack_vars[j].next) 1394 1.1 mrg set_rtl (stack_vars[j].decl, NULL); 1395 1.1 mrg } 1396 1.1 mrg return size; 1397 1.1 mrg } 1398 1.1 mrg 1399 1.1 mrg /* Record the RTL assignment X for the default def of PARM. */ 1400 1.1 mrg 1401 1.1 mrg extern void 1402 1.1 mrg set_parm_rtl (tree parm, rtx x) 1403 1.1 mrg { 1404 1.1 mrg gcc_assert (TREE_CODE (parm) == PARM_DECL 1405 1.1 mrg || TREE_CODE (parm) == RESULT_DECL); 1406 1.1 mrg 1407 1.1 mrg if (x && !MEM_P (x)) 1408 1.1 mrg { 1409 1.1 mrg unsigned int align = MINIMUM_ALIGNMENT (TREE_TYPE (parm), 1410 1.1 mrg TYPE_MODE (TREE_TYPE (parm)), 1411 1.1 mrg TYPE_ALIGN (TREE_TYPE (parm))); 1412 1.1 mrg 1413 1.1 mrg /* If the variable alignment is very large we'll dynamicaly 1414 1.1 mrg allocate it, which means that in-frame portion is just a 1415 1.1 mrg pointer. ??? We've got a pseudo for sure here, do we 1416 1.1 mrg actually dynamically allocate its spilling area if needed? 1417 1.1 mrg ??? Isn't it a problem when Pmode alignment also exceeds 1418 1.1 mrg MAX_SUPPORTED_STACK_ALIGNMENT, as can happen on cris and lm32? */ 1419 1.1 mrg if (align > MAX_SUPPORTED_STACK_ALIGNMENT) 1420 1.1 mrg align = GET_MODE_ALIGNMENT (Pmode); 1421 1.1 mrg 1422 1.1 mrg record_alignment_for_reg_var (align); 1423 1.1 mrg } 1424 1.1 mrg 1425 1.1 mrg tree ssa = ssa_default_def (cfun, parm); 1426 1.1 mrg if (!ssa) 1427 1.1 mrg return set_rtl (parm, x); 1428 1.1 mrg 1429 1.1 mrg int part = var_to_partition (SA.map, ssa); 1430 1.1 mrg gcc_assert (part != NO_PARTITION); 1431 1.1 mrg 1432 1.1 mrg bool changed = bitmap_bit_p (SA.partitions_for_parm_default_defs, part); 1433 1.1 mrg gcc_assert (changed); 1434 1.1 mrg 1435 1.1 mrg set_rtl (ssa, x); 1436 1.1 mrg gcc_assert (DECL_RTL (parm) == x); 1437 1.1 mrg } 1438 1.1 mrg 1439 1.1 mrg /* A subroutine of expand_one_var. Called to immediately assign rtl 1440 1.1 mrg to a variable to be allocated in the stack frame. */ 1441 1.1 mrg 1442 1.1 mrg static void 1443 1.1 mrg expand_one_stack_var_1 (tree var) 1444 1.1 mrg { 1445 1.1 mrg poly_uint64 size; 1446 1.1 mrg poly_int64 offset; 1447 1.1 mrg unsigned byte_align; 1448 1.1 mrg 1449 1.1 mrg if (TREE_CODE (var) == SSA_NAME) 1450 1.1 mrg { 1451 1.1 mrg tree type = TREE_TYPE (var); 1452 1.1 mrg size = tree_to_poly_uint64 (TYPE_SIZE_UNIT (type)); 1453 1.1 mrg } 1454 1.1 mrg else 1455 1.1 mrg size = tree_to_poly_uint64 (DECL_SIZE_UNIT (var)); 1456 1.1 mrg 1457 1.1 mrg byte_align = align_local_variable (var, true); 1458 1.1 mrg 1459 1.1 mrg /* We handle highly aligned variables in expand_stack_vars. */ 1460 1.1 mrg gcc_assert (byte_align * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT); 1461 1.1 mrg 1462 1.1 mrg rtx base; 1463 1.1 mrg if (hwasan_sanitize_stack_p ()) 1464 1.1 mrg { 1465 1.1 mrg /* Allocate zero bytes to align the stack. */ 1466 1.1 mrg poly_int64 hwasan_orig_offset 1467 1.1 mrg = align_frame_offset (HWASAN_TAG_GRANULE_SIZE); 1468 1.1 mrg offset = alloc_stack_frame_space (size, byte_align); 1469 1.1 mrg align_frame_offset (HWASAN_TAG_GRANULE_SIZE); 1470 1.1 mrg base = hwasan_frame_base (); 1471 1.1 mrg /* Use `frame_offset` to automatically account for machines where the 1472 1.1 mrg frame grows upwards. 1473 1.1 mrg 1474 1.1 mrg `offset` will always point to the "start" of the stack object, which 1475 1.1 mrg will be the smallest address, for ! FRAME_GROWS_DOWNWARD this is *not* 1476 1.1 mrg the "furthest" offset from the base delimiting the current stack 1477 1.1 mrg object. `frame_offset` will always delimit the extent that the frame. 1478 1.1 mrg */ 1479 1.1 mrg hwasan_record_stack_var (virtual_stack_vars_rtx, base, 1480 1.1 mrg hwasan_orig_offset, frame_offset); 1481 1.1 mrg } 1482 1.1 mrg else 1483 1.1 mrg { 1484 1.1 mrg offset = alloc_stack_frame_space (size, byte_align); 1485 1.1 mrg base = virtual_stack_vars_rtx; 1486 1.1 mrg } 1487 1.1 mrg 1488 1.1 mrg expand_one_stack_var_at (var, base, 1489 1.1 mrg crtl->max_used_stack_slot_alignment, offset); 1490 1.1 mrg 1491 1.1 mrg if (hwasan_sanitize_stack_p ()) 1492 1.1 mrg hwasan_increment_frame_tag (); 1493 1.1 mrg } 1494 1.1 mrg 1495 1.1 mrg /* Wrapper for expand_one_stack_var_1 that checks SSA_NAMEs are 1496 1.1 mrg already assigned some MEM. */ 1497 1.1 mrg 1498 1.1 mrg static void 1499 1.1 mrg expand_one_stack_var (tree var) 1500 1.1 mrg { 1501 1.1 mrg if (TREE_CODE (var) == SSA_NAME) 1502 1.1 mrg { 1503 1.1 mrg int part = var_to_partition (SA.map, var); 1504 1.1 mrg if (part != NO_PARTITION) 1505 1.1 mrg { 1506 1.1 mrg rtx x = SA.partition_to_pseudo[part]; 1507 1.1 mrg gcc_assert (x); 1508 1.1 mrg gcc_assert (MEM_P (x)); 1509 1.1 mrg return; 1510 1.1 mrg } 1511 1.1 mrg } 1512 1.1 mrg 1513 1.1 mrg return expand_one_stack_var_1 (var); 1514 1.1 mrg } 1515 1.1 mrg 1516 1.1 mrg /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL 1517 1.1 mrg that will reside in a hard register. */ 1518 1.1 mrg 1519 1.1 mrg static void 1520 1.1 mrg expand_one_hard_reg_var (tree var) 1521 1.1 mrg { 1522 1.1 mrg rest_of_decl_compilation (var, 0, 0); 1523 1.1 mrg } 1524 1.1 mrg 1525 1.1 mrg /* Record the alignment requirements of some variable assigned to a 1526 1.1 mrg pseudo. */ 1527 1.1 mrg 1528 1.1 mrg static void 1529 1.1 mrg record_alignment_for_reg_var (unsigned int align) 1530 1.1 mrg { 1531 1.1 mrg if (SUPPORTS_STACK_ALIGNMENT 1532 1.1 mrg && crtl->stack_alignment_estimated < align) 1533 1.1 mrg { 1534 1.1 mrg /* stack_alignment_estimated shouldn't change after stack 1535 1.1 mrg realign decision made */ 1536 1.1 mrg gcc_assert (!crtl->stack_realign_processed); 1537 1.1 mrg crtl->stack_alignment_estimated = align; 1538 1.1 mrg } 1539 1.1 mrg 1540 1.1 mrg /* stack_alignment_needed > PREFERRED_STACK_BOUNDARY is permitted. 1541 1.1 mrg So here we only make sure stack_alignment_needed >= align. */ 1542 1.1 mrg if (crtl->stack_alignment_needed < align) 1543 1.1 mrg crtl->stack_alignment_needed = align; 1544 1.1 mrg if (crtl->max_used_stack_slot_alignment < align) 1545 1.1 mrg crtl->max_used_stack_slot_alignment = align; 1546 1.1 mrg } 1547 1.1 mrg 1548 1.1 mrg /* Create RTL for an SSA partition. */ 1549 1.1 mrg 1550 1.1 mrg static void 1551 1.1 mrg expand_one_ssa_partition (tree var) 1552 1.1 mrg { 1553 1.1 mrg int part = var_to_partition (SA.map, var); 1554 1.1 mrg gcc_assert (part != NO_PARTITION); 1555 1.1 mrg 1556 1.1 mrg if (SA.partition_to_pseudo[part]) 1557 1.1 mrg return; 1558 1.1 mrg 1559 1.1 mrg unsigned int align = MINIMUM_ALIGNMENT (TREE_TYPE (var), 1560 1.1 mrg TYPE_MODE (TREE_TYPE (var)), 1561 1.1 mrg TYPE_ALIGN (TREE_TYPE (var))); 1562 1.1 mrg 1563 1.1 mrg /* If the variable alignment is very large we'll dynamicaly allocate 1564 1.1 mrg it, which means that in-frame portion is just a pointer. */ 1565 1.1 mrg if (align > MAX_SUPPORTED_STACK_ALIGNMENT) 1566 1.1 mrg align = GET_MODE_ALIGNMENT (Pmode); 1567 1.1 mrg 1568 1.1 mrg record_alignment_for_reg_var (align); 1569 1.1 mrg 1570 1.1 mrg if (!use_register_for_decl (var)) 1571 1.1 mrg { 1572 1.1 mrg if (defer_stack_allocation (var, true)) 1573 1.1 mrg add_stack_var (var, true); 1574 1.1 mrg else 1575 1.1 mrg expand_one_stack_var_1 (var); 1576 1.1 mrg return; 1577 1.1 mrg } 1578 1.1 mrg 1579 1.1 mrg machine_mode reg_mode = promote_ssa_mode (var, NULL); 1580 1.1 mrg rtx x = gen_reg_rtx (reg_mode); 1581 1.1 mrg 1582 1.1 mrg set_rtl (var, x); 1583 1.1 mrg 1584 1.1 mrg /* For a promoted variable, X will not be used directly but wrapped in a 1585 1.1 mrg SUBREG with SUBREG_PROMOTED_VAR_P set, which means that the RTL land 1586 1.1 mrg will assume that its upper bits can be inferred from its lower bits. 1587 1.1 mrg Therefore, if X isn't initialized on every path from the entry, then 1588 1.1 mrg we must do it manually in order to fulfill the above assumption. */ 1589 1.1 mrg if (reg_mode != TYPE_MODE (TREE_TYPE (var)) 1590 1.1 mrg && bitmap_bit_p (SA.partitions_for_undefined_values, part)) 1591 1.1 mrg emit_move_insn (x, CONST0_RTX (reg_mode)); 1592 1.1 mrg } 1593 1.1 mrg 1594 1.1 mrg /* Record the association between the RTL generated for partition PART 1595 1.1 mrg and the underlying variable of the SSA_NAME VAR. */ 1596 1.1 mrg 1597 1.1 mrg static void 1598 1.1 mrg adjust_one_expanded_partition_var (tree var) 1599 1.1 mrg { 1600 1.1 mrg if (!var) 1601 1.1 mrg return; 1602 1.1 mrg 1603 1.1 mrg tree decl = SSA_NAME_VAR (var); 1604 1.1 mrg 1605 1.1 mrg int part = var_to_partition (SA.map, var); 1606 1.1 mrg if (part == NO_PARTITION) 1607 1.1 mrg return; 1608 1.1 mrg 1609 1.1 mrg rtx x = SA.partition_to_pseudo[part]; 1610 1.1 mrg 1611 1.1 mrg gcc_assert (x); 1612 1.1 mrg 1613 1.1 mrg set_rtl (var, x); 1614 1.1 mrg 1615 1.1 mrg if (!REG_P (x)) 1616 1.1 mrg return; 1617 1.1 mrg 1618 1.1 mrg /* Note if the object is a user variable. */ 1619 1.1 mrg if (decl && !DECL_ARTIFICIAL (decl)) 1620 1.1 mrg mark_user_reg (x); 1621 1.1 mrg 1622 1.1 mrg if (POINTER_TYPE_P (decl ? TREE_TYPE (decl) : TREE_TYPE (var))) 1623 1.1 mrg mark_reg_pointer (x, get_pointer_alignment (var)); 1624 1.1 mrg } 1625 1.1 mrg 1626 1.1 mrg /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL 1627 1.1 mrg that will reside in a pseudo register. */ 1628 1.1 mrg 1629 1.1 mrg static void 1630 1.1 mrg expand_one_register_var (tree var) 1631 1.1 mrg { 1632 1.1 mrg if (TREE_CODE (var) == SSA_NAME) 1633 1.1 mrg { 1634 1.1 mrg int part = var_to_partition (SA.map, var); 1635 1.1 mrg if (part != NO_PARTITION) 1636 1.1 mrg { 1637 1.1 mrg rtx x = SA.partition_to_pseudo[part]; 1638 1.1 mrg gcc_assert (x); 1639 1.1 mrg gcc_assert (REG_P (x)); 1640 1.1 mrg return; 1641 1.1 mrg } 1642 1.1 mrg gcc_unreachable (); 1643 1.1 mrg } 1644 1.1 mrg 1645 1.1 mrg tree decl = var; 1646 1.1 mrg tree type = TREE_TYPE (decl); 1647 1.1 mrg machine_mode reg_mode = promote_decl_mode (decl, NULL); 1648 1.1 mrg rtx x = gen_reg_rtx (reg_mode); 1649 1.1 mrg 1650 1.1 mrg set_rtl (var, x); 1651 1.1 mrg 1652 1.1 mrg /* Note if the object is a user variable. */ 1653 1.1 mrg if (!DECL_ARTIFICIAL (decl)) 1654 1.1 mrg mark_user_reg (x); 1655 1.1 mrg 1656 1.1 mrg if (POINTER_TYPE_P (type)) 1657 1.1 mrg mark_reg_pointer (x, get_pointer_alignment (var)); 1658 1.1 mrg } 1659 1.1 mrg 1660 1.1 mrg /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL that 1661 1.1 mrg has some associated error, e.g. its type is error-mark. We just need 1662 1.1 mrg to pick something that won't crash the rest of the compiler. */ 1663 1.1 mrg 1664 1.1 mrg static void 1665 1.1 mrg expand_one_error_var (tree var) 1666 1.1 mrg { 1667 1.1 mrg machine_mode mode = DECL_MODE (var); 1668 1.1 mrg rtx x; 1669 1.1 mrg 1670 1.1 mrg if (mode == BLKmode) 1671 1.1 mrg x = gen_rtx_MEM (BLKmode, const0_rtx); 1672 1.1 mrg else if (mode == VOIDmode) 1673 1.1 mrg x = const0_rtx; 1674 1.1 mrg else 1675 1.1 mrg x = gen_reg_rtx (mode); 1676 1.1 mrg 1677 1.1 mrg SET_DECL_RTL (var, x); 1678 1.1 mrg } 1679 1.1 mrg 1680 1.1 mrg /* A subroutine of expand_one_var. VAR is a variable that will be 1681 1.1 mrg allocated to the local stack frame. Return true if we wish to 1682 1.1 mrg add VAR to STACK_VARS so that it will be coalesced with other 1683 1.1 mrg variables. Return false to allocate VAR immediately. 1684 1.1 mrg 1685 1.1 mrg This function is used to reduce the number of variables considered 1686 1.1 mrg for coalescing, which reduces the size of the quadratic problem. */ 1687 1.1 mrg 1688 1.1 mrg static bool 1689 1.1 mrg defer_stack_allocation (tree var, bool toplevel) 1690 1.1 mrg { 1691 1.1 mrg tree size_unit = TREE_CODE (var) == SSA_NAME 1692 1.1 mrg ? TYPE_SIZE_UNIT (TREE_TYPE (var)) 1693 1.1 mrg : DECL_SIZE_UNIT (var); 1694 1.1 mrg poly_uint64 size; 1695 1.1 mrg 1696 1.1 mrg /* Whether the variable is small enough for immediate allocation not to be 1697 1.1 mrg a problem with regard to the frame size. */ 1698 1.1 mrg bool smallish 1699 1.1 mrg = (poly_int_tree_p (size_unit, &size) 1700 1.1 mrg && (estimated_poly_value (size) 1701 1.1 mrg < param_min_size_for_stack_sharing)); 1702 1.1 mrg 1703 1.1 mrg /* If stack protection is enabled, *all* stack variables must be deferred, 1704 1.1 mrg so that we can re-order the strings to the top of the frame. 1705 1.1 mrg Similarly for Address Sanitizer. */ 1706 1.1 mrg if (flag_stack_protect || asan_sanitize_stack_p ()) 1707 1.1 mrg return true; 1708 1.1 mrg 1709 1.1 mrg unsigned int align = TREE_CODE (var) == SSA_NAME 1710 1.1 mrg ? TYPE_ALIGN (TREE_TYPE (var)) 1711 1.1 mrg : DECL_ALIGN (var); 1712 1.1 mrg 1713 1.1 mrg /* We handle "large" alignment via dynamic allocation. We want to handle 1714 1.1 mrg this extra complication in only one place, so defer them. */ 1715 1.1 mrg if (align > MAX_SUPPORTED_STACK_ALIGNMENT) 1716 1.1 mrg return true; 1717 1.1 mrg 1718 1.1 mrg bool ignored = TREE_CODE (var) == SSA_NAME 1719 1.1 mrg ? !SSAVAR (var) || DECL_IGNORED_P (SSA_NAME_VAR (var)) 1720 1.1 mrg : DECL_IGNORED_P (var); 1721 1.1 mrg 1722 1.1 mrg /* When optimization is enabled, DECL_IGNORED_P variables originally scoped 1723 1.1 mrg might be detached from their block and appear at toplevel when we reach 1724 1.1 mrg here. We want to coalesce them with variables from other blocks when 1725 1.1 mrg the immediate contribution to the frame size would be noticeable. */ 1726 1.1 mrg if (toplevel && optimize > 0 && ignored && !smallish) 1727 1.1 mrg return true; 1728 1.1 mrg 1729 1.1 mrg /* Variables declared in the outermost scope automatically conflict 1730 1.1 mrg with every other variable. The only reason to want to defer them 1731 1.1 mrg at all is that, after sorting, we can more efficiently pack 1732 1.1 mrg small variables in the stack frame. Continue to defer at -O2. */ 1733 1.1 mrg if (toplevel && optimize < 2) 1734 1.1 mrg return false; 1735 1.1 mrg 1736 1.1 mrg /* Without optimization, *most* variables are allocated from the 1737 1.1 mrg stack, which makes the quadratic problem large exactly when we 1738 1.1 mrg want compilation to proceed as quickly as possible. On the 1739 1.1 mrg other hand, we don't want the function's stack frame size to 1740 1.1 mrg get completely out of hand. So we avoid adding scalars and 1741 1.1 mrg "small" aggregates to the list at all. */ 1742 1.1 mrg if (optimize == 0 && smallish) 1743 1.1 mrg return false; 1744 1.1 mrg 1745 1.1 mrg return true; 1746 1.1 mrg } 1747 1.1 mrg 1748 1.1 mrg /* A subroutine of expand_used_vars. Expand one variable according to 1749 1.1 mrg its flavor. Variables to be placed on the stack are not actually 1750 1.1 mrg expanded yet, merely recorded. 1751 1.1 mrg When REALLY_EXPAND is false, only add stack values to be allocated. 1752 1.1 mrg Return stack usage this variable is supposed to take. 1753 1.1 mrg */ 1754 1.1 mrg 1755 1.1 mrg static poly_uint64 1756 1.1 mrg expand_one_var (tree var, bool toplevel, bool really_expand, 1757 1.1 mrg bitmap forced_stack_var = NULL) 1758 1.1 mrg { 1759 1.1 mrg unsigned int align = BITS_PER_UNIT; 1760 1.1 mrg tree origvar = var; 1761 1.1 mrg 1762 1.1 mrg var = SSAVAR (var); 1763 1.1 mrg 1764 1.1 mrg if (TREE_TYPE (var) != error_mark_node && VAR_P (var)) 1765 1.1 mrg { 1766 1.1 mrg if (is_global_var (var)) 1767 1.1 mrg return 0; 1768 1.1 mrg 1769 1.1 mrg /* Because we don't know if VAR will be in register or on stack, 1770 1.1 mrg we conservatively assume it will be on stack even if VAR is 1771 1.1 mrg eventually put into register after RA pass. For non-automatic 1772 1.1 mrg variables, which won't be on stack, we collect alignment of 1773 1.1 mrg type and ignore user specified alignment. Similarly for 1774 1.1 mrg SSA_NAMEs for which use_register_for_decl returns true. */ 1775 1.1 mrg if (TREE_STATIC (var) 1776 1.1 mrg || DECL_EXTERNAL (var) 1777 1.1 mrg || (TREE_CODE (origvar) == SSA_NAME && use_register_for_decl (var))) 1778 1.1 mrg align = MINIMUM_ALIGNMENT (TREE_TYPE (var), 1779 1.1 mrg TYPE_MODE (TREE_TYPE (var)), 1780 1.1 mrg TYPE_ALIGN (TREE_TYPE (var))); 1781 1.1 mrg else if (DECL_HAS_VALUE_EXPR_P (var) 1782 1.1 mrg || (DECL_RTL_SET_P (var) && MEM_P (DECL_RTL (var)))) 1783 1.1 mrg /* Don't consider debug only variables with DECL_HAS_VALUE_EXPR_P set 1784 1.1 mrg or variables which were assigned a stack slot already by 1785 1.1 mrg expand_one_stack_var_at - in the latter case DECL_ALIGN has been 1786 1.1 mrg changed from the offset chosen to it. */ 1787 1.1 mrg align = crtl->stack_alignment_estimated; 1788 1.1 mrg else 1789 1.1 mrg align = MINIMUM_ALIGNMENT (var, DECL_MODE (var), DECL_ALIGN (var)); 1790 1.1 mrg 1791 1.1 mrg /* If the variable alignment is very large we'll dynamicaly allocate 1792 1.1 mrg it, which means that in-frame portion is just a pointer. */ 1793 1.1 mrg if (align > MAX_SUPPORTED_STACK_ALIGNMENT) 1794 1.1 mrg align = GET_MODE_ALIGNMENT (Pmode); 1795 1.1 mrg } 1796 1.1 mrg 1797 1.1 mrg record_alignment_for_reg_var (align); 1798 1.1 mrg 1799 1.1 mrg poly_uint64 size; 1800 1.1 mrg if (TREE_CODE (origvar) == SSA_NAME) 1801 1.1 mrg { 1802 1.1 mrg gcc_assert (!VAR_P (var) 1803 1.1 mrg || (!DECL_EXTERNAL (var) 1804 1.1 mrg && !DECL_HAS_VALUE_EXPR_P (var) 1805 1.1 mrg && !TREE_STATIC (var) 1806 1.1 mrg && TREE_TYPE (var) != error_mark_node 1807 1.1 mrg && !DECL_HARD_REGISTER (var) 1808 1.1 mrg && really_expand)); 1809 1.1 mrg } 1810 1.1 mrg if (!VAR_P (var) && TREE_CODE (origvar) != SSA_NAME) 1811 1.1 mrg ; 1812 1.1 mrg else if (DECL_EXTERNAL (var)) 1813 1.1 mrg ; 1814 1.1 mrg else if (DECL_HAS_VALUE_EXPR_P (var)) 1815 1.1 mrg ; 1816 1.1 mrg else if (TREE_STATIC (var)) 1817 1.1 mrg ; 1818 1.1 mrg else if (TREE_CODE (origvar) != SSA_NAME && DECL_RTL_SET_P (var)) 1819 1.1 mrg ; 1820 1.1 mrg else if (TREE_TYPE (var) == error_mark_node) 1821 1.1 mrg { 1822 1.1 mrg if (really_expand) 1823 1.1 mrg expand_one_error_var (var); 1824 1.1 mrg } 1825 1.1 mrg else if (VAR_P (var) && DECL_HARD_REGISTER (var)) 1826 1.1 mrg { 1827 1.1 mrg if (really_expand) 1828 1.1 mrg { 1829 1.1 mrg expand_one_hard_reg_var (var); 1830 1.1 mrg if (!DECL_HARD_REGISTER (var)) 1831 1.1 mrg /* Invalid register specification. */ 1832 1.1 mrg expand_one_error_var (var); 1833 1.1 mrg } 1834 1.1 mrg } 1835 1.1 mrg else if (use_register_for_decl (var) 1836 1.1 mrg && (!forced_stack_var 1837 1.1 mrg || !bitmap_bit_p (forced_stack_var, DECL_UID (var)))) 1838 1.1 mrg { 1839 1.1 mrg if (really_expand) 1840 1.1 mrg expand_one_register_var (origvar); 1841 1.1 mrg } 1842 1.1 mrg else if (!poly_int_tree_p (DECL_SIZE_UNIT (var), &size) 1843 1.1 mrg || !valid_constant_size_p (DECL_SIZE_UNIT (var))) 1844 1.1 mrg { 1845 1.1 mrg /* Reject variables which cover more than half of the address-space. */ 1846 1.1 mrg if (really_expand) 1847 1.1 mrg { 1848 1.1 mrg if (DECL_NONLOCAL_FRAME (var)) 1849 1.1 mrg error_at (DECL_SOURCE_LOCATION (current_function_decl), 1850 1.1 mrg "total size of local objects is too large"); 1851 1.1 mrg else 1852 1.1 mrg error_at (DECL_SOURCE_LOCATION (var), 1853 1.1 mrg "size of variable %q+D is too large", var); 1854 1.1 mrg expand_one_error_var (var); 1855 1.1 mrg } 1856 1.1 mrg } 1857 1.1 mrg else if (defer_stack_allocation (var, toplevel)) 1858 1.1 mrg add_stack_var (origvar, really_expand); 1859 1.1 mrg else 1860 1.1 mrg { 1861 1.1 mrg if (really_expand) 1862 1.1 mrg { 1863 1.1 mrg if (lookup_attribute ("naked", 1864 1.1 mrg DECL_ATTRIBUTES (current_function_decl))) 1865 1.1 mrg error ("cannot allocate stack for variable %q+D, naked function", 1866 1.1 mrg var); 1867 1.1 mrg 1868 1.1 mrg expand_one_stack_var (origvar); 1869 1.1 mrg } 1870 1.1 mrg return size; 1871 1.1 mrg } 1872 1.1 mrg return 0; 1873 1.1 mrg } 1874 1.1 mrg 1875 1.1 mrg /* A subroutine of expand_used_vars. Walk down through the BLOCK tree 1876 1.1 mrg expanding variables. Those variables that can be put into registers 1877 1.1 mrg are allocated pseudos; those that can't are put on the stack. 1878 1.1 mrg 1879 1.1 mrg TOPLEVEL is true if this is the outermost BLOCK. */ 1880 1.1 mrg 1881 1.1 mrg static void 1882 1.1 mrg expand_used_vars_for_block (tree block, bool toplevel, bitmap forced_stack_vars) 1883 1.1 mrg { 1884 1.1 mrg tree t; 1885 1.1 mrg 1886 1.1 mrg /* Expand all variables at this level. */ 1887 1.1 mrg for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t)) 1888 1.1 mrg if (TREE_USED (t) 1889 1.1 mrg && ((!VAR_P (t) && TREE_CODE (t) != RESULT_DECL) 1890 1.1 mrg || !DECL_NONSHAREABLE (t))) 1891 1.1 mrg expand_one_var (t, toplevel, true, forced_stack_vars); 1892 1.1 mrg 1893 1.1 mrg /* Expand all variables at containing levels. */ 1894 1.1 mrg for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t)) 1895 1.1 mrg expand_used_vars_for_block (t, false, forced_stack_vars); 1896 1.1 mrg } 1897 1.1 mrg 1898 1.1 mrg /* A subroutine of expand_used_vars. Walk down through the BLOCK tree 1899 1.1 mrg and clear TREE_USED on all local variables. */ 1900 1.1 mrg 1901 1.1 mrg static void 1902 1.1 mrg clear_tree_used (tree block) 1903 1.1 mrg { 1904 1.1 mrg tree t; 1905 1.1 mrg 1906 1.1 mrg for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t)) 1907 1.1 mrg /* if (!TREE_STATIC (t) && !DECL_EXTERNAL (t)) */ 1908 1.1 mrg if ((!VAR_P (t) && TREE_CODE (t) != RESULT_DECL) 1909 1.1 mrg || !DECL_NONSHAREABLE (t)) 1910 1.1 mrg TREE_USED (t) = 0; 1911 1.1 mrg 1912 1.1 mrg for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t)) 1913 1.1 mrg clear_tree_used (t); 1914 1.1 mrg } 1915 1.1 mrg 1916 1.1 mrg /* Examine TYPE and determine a bit mask of the following features. */ 1917 1.1 mrg 1918 1.1 mrg #define SPCT_HAS_LARGE_CHAR_ARRAY 1 1919 1.1 mrg #define SPCT_HAS_SMALL_CHAR_ARRAY 2 1920 1.1 mrg #define SPCT_HAS_ARRAY 4 1921 1.1 mrg #define SPCT_HAS_AGGREGATE 8 1922 1.1 mrg 1923 1.1 mrg static unsigned int 1924 1.1 mrg stack_protect_classify_type (tree type) 1925 1.1 mrg { 1926 1.1 mrg unsigned int ret = 0; 1927 1.1 mrg tree t; 1928 1.1 mrg 1929 1.1 mrg switch (TREE_CODE (type)) 1930 1.1 mrg { 1931 1.1 mrg case ARRAY_TYPE: 1932 1.1 mrg t = TYPE_MAIN_VARIANT (TREE_TYPE (type)); 1933 1.1 mrg if (t == char_type_node 1934 1.1 mrg || t == signed_char_type_node 1935 1.1 mrg || t == unsigned_char_type_node) 1936 1.1 mrg { 1937 1.1 mrg unsigned HOST_WIDE_INT max = param_ssp_buffer_size; 1938 1.1 mrg unsigned HOST_WIDE_INT len; 1939 1.1 mrg 1940 1.1 mrg if (!TYPE_SIZE_UNIT (type) 1941 1.1 mrg || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))) 1942 1.1 mrg len = max; 1943 1.1 mrg else 1944 1.1 mrg len = tree_to_uhwi (TYPE_SIZE_UNIT (type)); 1945 1.1 mrg 1946 1.2 mrg if (len == 0) 1947 1.2 mrg ret = SPCT_HAS_ARRAY; 1948 1.2 mrg else if (len < max) 1949 1.1 mrg ret = SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_ARRAY; 1950 1.1 mrg else 1951 1.1 mrg ret = SPCT_HAS_LARGE_CHAR_ARRAY | SPCT_HAS_ARRAY; 1952 1.1 mrg } 1953 1.1 mrg else 1954 1.1 mrg ret = SPCT_HAS_ARRAY; 1955 1.1 mrg break; 1956 1.1 mrg 1957 1.1 mrg case UNION_TYPE: 1958 1.1 mrg case QUAL_UNION_TYPE: 1959 1.1 mrg case RECORD_TYPE: 1960 1.1 mrg ret = SPCT_HAS_AGGREGATE; 1961 1.1 mrg for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t)) 1962 1.1 mrg if (TREE_CODE (t) == FIELD_DECL) 1963 1.1 mrg ret |= stack_protect_classify_type (TREE_TYPE (t)); 1964 1.1 mrg break; 1965 1.1 mrg 1966 1.1 mrg default: 1967 1.1 mrg break; 1968 1.1 mrg } 1969 1.1 mrg 1970 1.1 mrg return ret; 1971 1.1 mrg } 1972 1.1 mrg 1973 1.1 mrg /* Return nonzero if DECL should be segregated into the "vulnerable" upper 1974 1.1 mrg part of the local stack frame. Remember if we ever return nonzero for 1975 1.1 mrg any variable in this function. The return value is the phase number in 1976 1.1 mrg which the variable should be allocated. */ 1977 1.1 mrg 1978 1.1 mrg static int 1979 1.1 mrg stack_protect_decl_phase (tree decl) 1980 1.1 mrg { 1981 1.1 mrg unsigned int bits = stack_protect_classify_type (TREE_TYPE (decl)); 1982 1.1 mrg int ret = 0; 1983 1.1 mrg 1984 1.1 mrg if (bits & SPCT_HAS_SMALL_CHAR_ARRAY) 1985 1.1 mrg has_short_buffer = true; 1986 1.1 mrg 1987 1.1 mrg tree attribs = DECL_ATTRIBUTES (current_function_decl); 1988 1.1 mrg if (!lookup_attribute ("no_stack_protector", attribs) 1989 1.1 mrg && (flag_stack_protect == SPCT_FLAG_ALL 1990 1.1 mrg || flag_stack_protect == SPCT_FLAG_STRONG 1991 1.1 mrg || (flag_stack_protect == SPCT_FLAG_EXPLICIT 1992 1.1 mrg && lookup_attribute ("stack_protect", attribs)))) 1993 1.1 mrg { 1994 1.1 mrg if ((bits & (SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_LARGE_CHAR_ARRAY)) 1995 1.1 mrg && !(bits & SPCT_HAS_AGGREGATE)) 1996 1.1 mrg ret = 1; 1997 1.1 mrg else if (bits & SPCT_HAS_ARRAY) 1998 1.1 mrg ret = 2; 1999 1.1 mrg } 2000 1.1 mrg else 2001 1.1 mrg ret = (bits & SPCT_HAS_LARGE_CHAR_ARRAY) != 0; 2002 1.1 mrg 2003 1.1 mrg if (ret) 2004 1.1 mrg has_protected_decls = true; 2005 1.1 mrg 2006 1.1 mrg return ret; 2007 1.1 mrg } 2008 1.1 mrg 2009 1.1 mrg /* Two helper routines that check for phase 1 and phase 2. These are used 2010 1.1 mrg as callbacks for expand_stack_vars. */ 2011 1.1 mrg 2012 1.1 mrg static bool 2013 1.1 mrg stack_protect_decl_phase_1 (size_t i) 2014 1.1 mrg { 2015 1.1 mrg return stack_protect_decl_phase (stack_vars[i].decl) == 1; 2016 1.1 mrg } 2017 1.1 mrg 2018 1.1 mrg static bool 2019 1.1 mrg stack_protect_decl_phase_2 (size_t i) 2020 1.1 mrg { 2021 1.1 mrg return stack_protect_decl_phase (stack_vars[i].decl) == 2; 2022 1.1 mrg } 2023 1.1 mrg 2024 1.1 mrg /* And helper function that checks for asan phase (with stack protector 2025 1.1 mrg it is phase 3). This is used as callback for expand_stack_vars. 2026 1.1 mrg Returns true if any of the vars in the partition need to be protected. */ 2027 1.1 mrg 2028 1.1 mrg static bool 2029 1.1 mrg asan_decl_phase_3 (size_t i) 2030 1.1 mrg { 2031 1.1 mrg while (i != EOC) 2032 1.1 mrg { 2033 1.1 mrg if (asan_protect_stack_decl (stack_vars[i].decl)) 2034 1.1 mrg return true; 2035 1.1 mrg i = stack_vars[i].next; 2036 1.1 mrg } 2037 1.1 mrg return false; 2038 1.1 mrg } 2039 1.1 mrg 2040 1.1 mrg /* Ensure that variables in different stack protection phases conflict 2041 1.1 mrg so that they are not merged and share the same stack slot. 2042 1.1 mrg Return true if there are any address taken variables. */ 2043 1.1 mrg 2044 1.1 mrg static bool 2045 1.1 mrg add_stack_protection_conflicts (void) 2046 1.1 mrg { 2047 1.1 mrg size_t i, j, n = stack_vars_num; 2048 1.1 mrg unsigned char *phase; 2049 1.1 mrg bool ret = false; 2050 1.1 mrg 2051 1.1 mrg phase = XNEWVEC (unsigned char, n); 2052 1.1 mrg for (i = 0; i < n; ++i) 2053 1.1 mrg { 2054 1.1 mrg phase[i] = stack_protect_decl_phase (stack_vars[i].decl); 2055 1.1 mrg if (TREE_ADDRESSABLE (stack_vars[i].decl)) 2056 1.1 mrg ret = true; 2057 1.1 mrg } 2058 1.1 mrg 2059 1.1 mrg for (i = 0; i < n; ++i) 2060 1.1 mrg { 2061 1.1 mrg unsigned char ph_i = phase[i]; 2062 1.1 mrg for (j = i + 1; j < n; ++j) 2063 1.1 mrg if (ph_i != phase[j]) 2064 1.1 mrg add_stack_var_conflict (i, j); 2065 1.1 mrg } 2066 1.1 mrg 2067 1.1 mrg XDELETEVEC (phase); 2068 1.1 mrg return ret; 2069 1.1 mrg } 2070 1.1 mrg 2071 1.1 mrg /* Create a decl for the guard at the top of the stack frame. */ 2072 1.1 mrg 2073 1.1 mrg static void 2074 1.1 mrg create_stack_guard (void) 2075 1.1 mrg { 2076 1.1 mrg tree guard = build_decl (DECL_SOURCE_LOCATION (current_function_decl), 2077 1.1 mrg VAR_DECL, NULL, ptr_type_node); 2078 1.6 kalvisd machine_mode mode = TYPE_MODE (TREE_TYPE (guard)); 2079 1.1 mrg TREE_THIS_VOLATILE (guard) = 1; 2080 1.1 mrg TREE_USED (guard) = 1; 2081 1.6 kalvisd // record the alignment requirements for this stack slot 2082 1.6 kalvisd record_alignment_for_reg_var (GET_MODE_ALIGNMENT (mode)); 2083 1.1 mrg expand_one_stack_var (guard); 2084 1.1 mrg crtl->stack_protect_guard = guard; 2085 1.1 mrg } 2086 1.1 mrg 2087 1.1 mrg /* Prepare for expanding variables. */ 2088 1.1 mrg static void 2089 1.1 mrg init_vars_expansion (void) 2090 1.1 mrg { 2091 1.1 mrg /* Conflict bitmaps, and a few related temporary bitmaps, go here. */ 2092 1.1 mrg bitmap_obstack_initialize (&stack_var_bitmap_obstack); 2093 1.1 mrg 2094 1.1 mrg /* A map from decl to stack partition. */ 2095 1.1 mrg decl_to_stack_part = new hash_map<tree, size_t>; 2096 1.1 mrg 2097 1.1 mrg /* Initialize local stack smashing state. */ 2098 1.1 mrg has_protected_decls = false; 2099 1.1 mrg has_short_buffer = false; 2100 1.1 mrg if (hwasan_sanitize_stack_p ()) 2101 1.1 mrg hwasan_record_frame_init (); 2102 1.1 mrg } 2103 1.1 mrg 2104 1.1 mrg /* Free up stack variable graph data. */ 2105 1.1 mrg static void 2106 1.1 mrg fini_vars_expansion (void) 2107 1.1 mrg { 2108 1.1 mrg bitmap_obstack_release (&stack_var_bitmap_obstack); 2109 1.1 mrg if (stack_vars) 2110 1.1 mrg XDELETEVEC (stack_vars); 2111 1.1 mrg if (stack_vars_sorted) 2112 1.1 mrg XDELETEVEC (stack_vars_sorted); 2113 1.1 mrg stack_vars = NULL; 2114 1.1 mrg stack_vars_sorted = NULL; 2115 1.1 mrg stack_vars_alloc = stack_vars_num = 0; 2116 1.1 mrg delete decl_to_stack_part; 2117 1.1 mrg decl_to_stack_part = NULL; 2118 1.1 mrg } 2119 1.1 mrg 2120 1.1 mrg /* Make a fair guess for the size of the stack frame of the function 2121 1.1 mrg in NODE. This doesn't have to be exact, the result is only used in 2122 1.1 mrg the inline heuristics. So we don't want to run the full stack var 2123 1.1 mrg packing algorithm (which is quadratic in the number of stack vars). 2124 1.1 mrg Instead, we calculate the total size of all stack vars. This turns 2125 1.1 mrg out to be a pretty fair estimate -- packing of stack vars doesn't 2126 1.1 mrg happen very often. */ 2127 1.1 mrg 2128 1.1 mrg HOST_WIDE_INT 2129 1.1 mrg estimated_stack_frame_size (struct cgraph_node *node) 2130 1.1 mrg { 2131 1.1 mrg poly_int64 size = 0; 2132 1.1 mrg size_t i; 2133 1.1 mrg tree var; 2134 1.1 mrg struct function *fn = DECL_STRUCT_FUNCTION (node->decl); 2135 1.1 mrg 2136 1.1 mrg push_cfun (fn); 2137 1.1 mrg 2138 1.1 mrg init_vars_expansion (); 2139 1.1 mrg 2140 1.1 mrg FOR_EACH_LOCAL_DECL (fn, i, var) 2141 1.1 mrg if (auto_var_in_fn_p (var, fn->decl)) 2142 1.1 mrg size += expand_one_var (var, true, false); 2143 1.1 mrg 2144 1.1 mrg if (stack_vars_num > 0) 2145 1.1 mrg { 2146 1.1 mrg /* Fake sorting the stack vars for account_stack_vars (). */ 2147 1.1 mrg stack_vars_sorted = XNEWVEC (size_t, stack_vars_num); 2148 1.1 mrg for (i = 0; i < stack_vars_num; ++i) 2149 1.1 mrg stack_vars_sorted[i] = i; 2150 1.1 mrg size += account_stack_vars (); 2151 1.1 mrg } 2152 1.1 mrg 2153 1.1 mrg fini_vars_expansion (); 2154 1.1 mrg pop_cfun (); 2155 1.1 mrg return estimated_poly_value (size); 2156 1.1 mrg } 2157 1.1 mrg 2158 1.1 mrg /* Check if the current function has calls that use a return slot. */ 2159 1.1 mrg 2160 1.1 mrg static bool 2161 1.1 mrg stack_protect_return_slot_p () 2162 1.1 mrg { 2163 1.1 mrg basic_block bb; 2164 1.1 mrg 2165 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 2166 1.1 mrg for (gimple_stmt_iterator gsi = gsi_start_bb (bb); 2167 1.1 mrg !gsi_end_p (gsi); gsi_next (&gsi)) 2168 1.1 mrg { 2169 1.1 mrg gimple *stmt = gsi_stmt (gsi); 2170 1.1 mrg /* This assumes that calls to internal-only functions never 2171 1.1 mrg use a return slot. */ 2172 1.1 mrg if (is_gimple_call (stmt) 2173 1.1 mrg && !gimple_call_internal_p (stmt) 2174 1.1 mrg && aggregate_value_p (TREE_TYPE (gimple_call_fntype (stmt)), 2175 1.1 mrg gimple_call_fndecl (stmt))) 2176 1.1 mrg return true; 2177 1.1 mrg } 2178 1.1 mrg return false; 2179 1.1 mrg } 2180 1.1 mrg 2181 1.1 mrg /* Expand all variables used in the function. */ 2182 1.1 mrg 2183 1.1 mrg static rtx_insn * 2184 1.1 mrg expand_used_vars (bitmap forced_stack_vars) 2185 1.1 mrg { 2186 1.1 mrg tree var, outer_block = DECL_INITIAL (current_function_decl); 2187 1.1 mrg auto_vec<tree> maybe_local_decls; 2188 1.1 mrg rtx_insn *var_end_seq = NULL; 2189 1.1 mrg unsigned i; 2190 1.1 mrg unsigned len; 2191 1.1 mrg bool gen_stack_protect_signal = false; 2192 1.1 mrg 2193 1.1 mrg /* Compute the phase of the stack frame for this function. */ 2194 1.1 mrg { 2195 1.1 mrg int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; 2196 1.1 mrg int off = targetm.starting_frame_offset () % align; 2197 1.1 mrg frame_phase = off ? align - off : 0; 2198 1.1 mrg } 2199 1.1 mrg 2200 1.1 mrg /* Set TREE_USED on all variables in the local_decls. */ 2201 1.1 mrg FOR_EACH_LOCAL_DECL (cfun, i, var) 2202 1.1 mrg TREE_USED (var) = 1; 2203 1.1 mrg /* Clear TREE_USED on all variables associated with a block scope. */ 2204 1.1 mrg clear_tree_used (DECL_INITIAL (current_function_decl)); 2205 1.1 mrg 2206 1.1 mrg init_vars_expansion (); 2207 1.1 mrg 2208 1.1 mrg if (targetm.use_pseudo_pic_reg ()) 2209 1.1 mrg pic_offset_table_rtx = gen_reg_rtx (Pmode); 2210 1.1 mrg 2211 1.1 mrg for (i = 0; i < SA.map->num_partitions; i++) 2212 1.1 mrg { 2213 1.1 mrg if (bitmap_bit_p (SA.partitions_for_parm_default_defs, i)) 2214 1.1 mrg continue; 2215 1.1 mrg 2216 1.1 mrg tree var = partition_to_var (SA.map, i); 2217 1.1 mrg 2218 1.1 mrg gcc_assert (!virtual_operand_p (var)); 2219 1.1 mrg 2220 1.1 mrg expand_one_ssa_partition (var); 2221 1.1 mrg } 2222 1.1 mrg 2223 1.1 mrg if (flag_stack_protect == SPCT_FLAG_STRONG) 2224 1.1 mrg gen_stack_protect_signal = stack_protect_return_slot_p (); 2225 1.1 mrg 2226 1.1 mrg /* At this point all variables on the local_decls with TREE_USED 2227 1.1 mrg set are not associated with any block scope. Lay them out. */ 2228 1.1 mrg 2229 1.1 mrg len = vec_safe_length (cfun->local_decls); 2230 1.1 mrg FOR_EACH_LOCAL_DECL (cfun, i, var) 2231 1.1 mrg { 2232 1.1 mrg bool expand_now = false; 2233 1.1 mrg 2234 1.1 mrg /* Expanded above already. */ 2235 1.1 mrg if (is_gimple_reg (var)) 2236 1.1 mrg { 2237 1.1 mrg TREE_USED (var) = 0; 2238 1.1 mrg goto next; 2239 1.1 mrg } 2240 1.1 mrg /* We didn't set a block for static or extern because it's hard 2241 1.1 mrg to tell the difference between a global variable (re)declared 2242 1.1 mrg in a local scope, and one that's really declared there to 2243 1.1 mrg begin with. And it doesn't really matter much, since we're 2244 1.1 mrg not giving them stack space. Expand them now. */ 2245 1.1 mrg else if (TREE_STATIC (var) || DECL_EXTERNAL (var)) 2246 1.1 mrg expand_now = true; 2247 1.1 mrg 2248 1.1 mrg /* Expand variables not associated with any block now. Those created by 2249 1.1 mrg the optimizers could be live anywhere in the function. Those that 2250 1.1 mrg could possibly have been scoped originally and detached from their 2251 1.1 mrg block will have their allocation deferred so we coalesce them with 2252 1.1 mrg others when optimization is enabled. */ 2253 1.1 mrg else if (TREE_USED (var)) 2254 1.1 mrg expand_now = true; 2255 1.1 mrg 2256 1.1 mrg /* Finally, mark all variables on the list as used. We'll use 2257 1.1 mrg this in a moment when we expand those associated with scopes. */ 2258 1.1 mrg TREE_USED (var) = 1; 2259 1.1 mrg 2260 1.1 mrg if (expand_now) 2261 1.1 mrg expand_one_var (var, true, true, forced_stack_vars); 2262 1.1 mrg 2263 1.1 mrg next: 2264 1.1 mrg if (DECL_ARTIFICIAL (var) && !DECL_IGNORED_P (var)) 2265 1.1 mrg { 2266 1.1 mrg rtx rtl = DECL_RTL_IF_SET (var); 2267 1.1 mrg 2268 1.1 mrg /* Keep artificial non-ignored vars in cfun->local_decls 2269 1.1 mrg chain until instantiate_decls. */ 2270 1.1 mrg if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT)) 2271 1.1 mrg add_local_decl (cfun, var); 2272 1.1 mrg else if (rtl == NULL_RTX) 2273 1.1 mrg /* If rtl isn't set yet, which can happen e.g. with 2274 1.1 mrg -fstack-protector, retry before returning from this 2275 1.1 mrg function. */ 2276 1.1 mrg maybe_local_decls.safe_push (var); 2277 1.1 mrg } 2278 1.1 mrg } 2279 1.1 mrg 2280 1.1 mrg /* We duplicated some of the decls in CFUN->LOCAL_DECLS. 2281 1.1 mrg 2282 1.1 mrg +-----------------+-----------------+ 2283 1.1 mrg | ...processed... | ...duplicates...| 2284 1.1 mrg +-----------------+-----------------+ 2285 1.1 mrg ^ 2286 1.1 mrg +-- LEN points here. 2287 1.1 mrg 2288 1.1 mrg We just want the duplicates, as those are the artificial 2289 1.1 mrg non-ignored vars that we want to keep until instantiate_decls. 2290 1.1 mrg Move them down and truncate the array. */ 2291 1.1 mrg if (!vec_safe_is_empty (cfun->local_decls)) 2292 1.1 mrg cfun->local_decls->block_remove (0, len); 2293 1.1 mrg 2294 1.1 mrg /* At this point, all variables within the block tree with TREE_USED 2295 1.1 mrg set are actually used by the optimized function. Lay them out. */ 2296 1.1 mrg expand_used_vars_for_block (outer_block, true, forced_stack_vars); 2297 1.1 mrg 2298 1.1 mrg tree attribs = DECL_ATTRIBUTES (current_function_decl); 2299 1.1 mrg if (stack_vars_num > 0) 2300 1.1 mrg { 2301 1.1 mrg bool has_addressable_vars = false; 2302 1.1 mrg 2303 1.1 mrg add_scope_conflicts (); 2304 1.1 mrg 2305 1.1 mrg /* If stack protection is enabled, we don't share space between 2306 1.1 mrg vulnerable data and non-vulnerable data. */ 2307 1.1 mrg if (flag_stack_protect != 0 2308 1.1 mrg && !lookup_attribute ("no_stack_protector", attribs) 2309 1.1 mrg && (flag_stack_protect != SPCT_FLAG_EXPLICIT 2310 1.1 mrg || (flag_stack_protect == SPCT_FLAG_EXPLICIT 2311 1.1 mrg && lookup_attribute ("stack_protect", attribs)))) 2312 1.1 mrg has_addressable_vars = add_stack_protection_conflicts (); 2313 1.1 mrg 2314 1.1 mrg if (flag_stack_protect == SPCT_FLAG_STRONG && has_addressable_vars) 2315 1.1 mrg gen_stack_protect_signal = true; 2316 1.1 mrg 2317 1.1 mrg /* Now that we have collected all stack variables, and have computed a 2318 1.1 mrg minimal interference graph, attempt to save some stack space. */ 2319 1.1 mrg partition_stack_vars (); 2320 1.1 mrg if (dump_file) 2321 1.1 mrg dump_stack_var_partition (); 2322 1.1 mrg } 2323 1.1 mrg 2324 1.1 mrg 2325 1.1 mrg if (!lookup_attribute ("no_stack_protector", attribs)) 2326 1.1 mrg switch (flag_stack_protect) 2327 1.1 mrg { 2328 1.1 mrg case SPCT_FLAG_ALL: 2329 1.1 mrg create_stack_guard (); 2330 1.1 mrg break; 2331 1.1 mrg 2332 1.1 mrg case SPCT_FLAG_STRONG: 2333 1.1 mrg if (gen_stack_protect_signal 2334 1.1 mrg || cfun->calls_alloca 2335 1.1 mrg || has_protected_decls 2336 1.1 mrg || lookup_attribute ("stack_protect", attribs)) 2337 1.1 mrg create_stack_guard (); 2338 1.1 mrg break; 2339 1.1 mrg 2340 1.1 mrg case SPCT_FLAG_DEFAULT: 2341 1.1 mrg if (cfun->calls_alloca 2342 1.1 mrg || has_protected_decls 2343 1.1 mrg || lookup_attribute ("stack_protect", attribs)) 2344 1.1 mrg create_stack_guard (); 2345 1.1 mrg break; 2346 1.1 mrg 2347 1.1 mrg case SPCT_FLAG_EXPLICIT: 2348 1.1 mrg if (lookup_attribute ("stack_protect", attribs)) 2349 1.1 mrg create_stack_guard (); 2350 1.1 mrg break; 2351 1.1 mrg 2352 1.1 mrg default: 2353 1.1 mrg break; 2354 1.1 mrg } 2355 1.1 mrg 2356 1.1 mrg /* Assign rtl to each variable based on these partitions. */ 2357 1.1 mrg if (stack_vars_num > 0) 2358 1.1 mrg { 2359 1.1 mrg class stack_vars_data data; 2360 1.1 mrg 2361 1.1 mrg data.asan_base = NULL_RTX; 2362 1.1 mrg data.asan_alignb = 0; 2363 1.1 mrg 2364 1.1 mrg /* Reorder decls to be protected by iterating over the variables 2365 1.1 mrg array multiple times, and allocating out of each phase in turn. */ 2366 1.1 mrg /* ??? We could probably integrate this into the qsort we did 2367 1.1 mrg earlier, such that we naturally see these variables first, 2368 1.1 mrg and thus naturally allocate things in the right order. */ 2369 1.1 mrg if (has_protected_decls) 2370 1.1 mrg { 2371 1.1 mrg /* Phase 1 contains only character arrays. */ 2372 1.1 mrg expand_stack_vars (stack_protect_decl_phase_1, &data); 2373 1.1 mrg 2374 1.1 mrg /* Phase 2 contains other kinds of arrays. */ 2375 1.1 mrg if (!lookup_attribute ("no_stack_protector", attribs) 2376 1.1 mrg && (flag_stack_protect == SPCT_FLAG_ALL 2377 1.1 mrg || flag_stack_protect == SPCT_FLAG_STRONG 2378 1.1 mrg || (flag_stack_protect == SPCT_FLAG_EXPLICIT 2379 1.1 mrg && lookup_attribute ("stack_protect", attribs)))) 2380 1.1 mrg expand_stack_vars (stack_protect_decl_phase_2, &data); 2381 1.1 mrg } 2382 1.1 mrg 2383 1.1 mrg if (asan_sanitize_stack_p ()) 2384 1.1 mrg /* Phase 3, any partitions that need asan protection 2385 1.1 mrg in addition to phase 1 and 2. */ 2386 1.1 mrg expand_stack_vars (asan_decl_phase_3, &data); 2387 1.1 mrg 2388 1.1 mrg /* ASAN description strings don't yet have a syntax for expressing 2389 1.1 mrg polynomial offsets. */ 2390 1.1 mrg HOST_WIDE_INT prev_offset; 2391 1.1 mrg if (!data.asan_vec.is_empty () 2392 1.1 mrg && frame_offset.is_constant (&prev_offset)) 2393 1.1 mrg { 2394 1.1 mrg HOST_WIDE_INT offset, sz, redzonesz; 2395 1.1 mrg redzonesz = ASAN_RED_ZONE_SIZE; 2396 1.1 mrg sz = data.asan_vec[0] - prev_offset; 2397 1.1 mrg if (data.asan_alignb > ASAN_RED_ZONE_SIZE 2398 1.1 mrg && data.asan_alignb <= 4096 2399 1.1 mrg && sz + ASAN_RED_ZONE_SIZE >= (int) data.asan_alignb) 2400 1.1 mrg redzonesz = ((sz + ASAN_RED_ZONE_SIZE + data.asan_alignb - 1) 2401 1.1 mrg & ~(data.asan_alignb - HOST_WIDE_INT_1)) - sz; 2402 1.1 mrg /* Allocating a constant amount of space from a constant 2403 1.1 mrg starting offset must give a constant result. */ 2404 1.1 mrg offset = (alloc_stack_frame_space (redzonesz, ASAN_RED_ZONE_SIZE) 2405 1.1 mrg .to_constant ()); 2406 1.1 mrg data.asan_vec.safe_push (prev_offset); 2407 1.1 mrg data.asan_vec.safe_push (offset); 2408 1.1 mrg /* Leave space for alignment if STRICT_ALIGNMENT. */ 2409 1.1 mrg if (STRICT_ALIGNMENT) 2410 1.1 mrg alloc_stack_frame_space ((GET_MODE_ALIGNMENT (SImode) 2411 1.1 mrg << ASAN_SHADOW_SHIFT) 2412 1.1 mrg / BITS_PER_UNIT, 1); 2413 1.1 mrg 2414 1.1 mrg var_end_seq 2415 1.1 mrg = asan_emit_stack_protection (virtual_stack_vars_rtx, 2416 1.1 mrg data.asan_base, 2417 1.1 mrg data.asan_alignb, 2418 1.1 mrg data.asan_vec.address (), 2419 1.1 mrg data.asan_decl_vec.address (), 2420 1.1 mrg data.asan_vec.length ()); 2421 1.1 mrg } 2422 1.1 mrg 2423 1.1 mrg expand_stack_vars (NULL, &data); 2424 1.1 mrg } 2425 1.1 mrg 2426 1.1 mrg if (hwasan_sanitize_stack_p ()) 2427 1.1 mrg hwasan_emit_prologue (); 2428 1.1 mrg if (asan_sanitize_allocas_p () && cfun->calls_alloca) 2429 1.1 mrg var_end_seq = asan_emit_allocas_unpoison (virtual_stack_dynamic_rtx, 2430 1.1 mrg virtual_stack_vars_rtx, 2431 1.1 mrg var_end_seq); 2432 1.1 mrg else if (hwasan_sanitize_allocas_p () && cfun->calls_alloca) 2433 1.1 mrg /* When using out-of-line instrumentation we only want to emit one function 2434 1.1 mrg call for clearing the tags in a region of shadow stack. When there are 2435 1.1 mrg alloca calls in this frame we want to emit a call using the 2436 1.1 mrg virtual_stack_dynamic_rtx, but when not we use the hwasan_frame_extent 2437 1.1 mrg rtx we created in expand_stack_vars. */ 2438 1.1 mrg var_end_seq = hwasan_emit_untag_frame (virtual_stack_dynamic_rtx, 2439 1.1 mrg virtual_stack_vars_rtx); 2440 1.1 mrg else if (hwasan_sanitize_stack_p ()) 2441 1.1 mrg /* If no variables were stored on the stack, `hwasan_get_frame_extent` 2442 1.1 mrg will return NULL_RTX and hence `hwasan_emit_untag_frame` will return 2443 1.1 mrg NULL (i.e. an empty sequence). */ 2444 1.1 mrg var_end_seq = hwasan_emit_untag_frame (hwasan_get_frame_extent (), 2445 1.1 mrg virtual_stack_vars_rtx); 2446 1.1 mrg 2447 1.1 mrg fini_vars_expansion (); 2448 1.1 mrg 2449 1.1 mrg /* If there were any artificial non-ignored vars without rtl 2450 1.1 mrg found earlier, see if deferred stack allocation hasn't assigned 2451 1.1 mrg rtl to them. */ 2452 1.1 mrg FOR_EACH_VEC_ELT_REVERSE (maybe_local_decls, i, var) 2453 1.1 mrg { 2454 1.1 mrg rtx rtl = DECL_RTL_IF_SET (var); 2455 1.1 mrg 2456 1.1 mrg /* Keep artificial non-ignored vars in cfun->local_decls 2457 1.1 mrg chain until instantiate_decls. */ 2458 1.1 mrg if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT)) 2459 1.1 mrg add_local_decl (cfun, var); 2460 1.1 mrg } 2461 1.1 mrg 2462 1.1 mrg /* If the target requires that FRAME_OFFSET be aligned, do it. */ 2463 1.1 mrg if (STACK_ALIGNMENT_NEEDED) 2464 1.1 mrg { 2465 1.1 mrg HOST_WIDE_INT align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; 2466 1.1 mrg if (FRAME_GROWS_DOWNWARD) 2467 1.1 mrg frame_offset = aligned_lower_bound (frame_offset, align); 2468 1.1 mrg else 2469 1.1 mrg frame_offset = aligned_upper_bound (frame_offset, align); 2470 1.1 mrg } 2471 1.1 mrg 2472 1.1 mrg return var_end_seq; 2473 1.1 mrg } 2474 1.1 mrg 2475 1.1 mrg 2476 1.1 mrg /* If we need to produce a detailed dump, print the tree representation 2477 1.1 mrg for STMT to the dump file. SINCE is the last RTX after which the RTL 2478 1.1 mrg generated for STMT should have been appended. */ 2479 1.1 mrg 2480 1.1 mrg static void 2481 1.1 mrg maybe_dump_rtl_for_gimple_stmt (gimple *stmt, rtx_insn *since) 2482 1.1 mrg { 2483 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 2484 1.1 mrg { 2485 1.1 mrg fprintf (dump_file, "\n;; "); 2486 1.1 mrg print_gimple_stmt (dump_file, stmt, 0, 2487 1.1 mrg TDF_SLIM | (dump_flags & TDF_LINENO)); 2488 1.1 mrg fprintf (dump_file, "\n"); 2489 1.1 mrg 2490 1.1 mrg print_rtl (dump_file, since ? NEXT_INSN (since) : since); 2491 1.1 mrg } 2492 1.1 mrg } 2493 1.1 mrg 2494 1.1 mrg /* Maps the blocks that do not contain tree labels to rtx labels. */ 2495 1.1 mrg 2496 1.1 mrg static hash_map<basic_block, rtx_code_label *> *lab_rtx_for_bb; 2497 1.1 mrg 2498 1.1 mrg /* Returns the label_rtx expression for a label starting basic block BB. */ 2499 1.1 mrg 2500 1.1 mrg static rtx_code_label * 2501 1.1 mrg label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED) 2502 1.1 mrg { 2503 1.1 mrg if (bb->flags & BB_RTL) 2504 1.1 mrg return block_label (bb); 2505 1.1 mrg 2506 1.1 mrg rtx_code_label **elt = lab_rtx_for_bb->get (bb); 2507 1.1 mrg if (elt) 2508 1.1 mrg return *elt; 2509 1.1 mrg 2510 1.1 mrg /* Find the tree label if it is present. */ 2511 1.1 mrg gimple_stmt_iterator gsi = gsi_start_bb (bb); 2512 1.1 mrg glabel *lab_stmt; 2513 1.1 mrg if (!gsi_end_p (gsi) 2514 1.1 mrg && (lab_stmt = dyn_cast <glabel *> (gsi_stmt (gsi))) 2515 1.1 mrg && !DECL_NONLOCAL (gimple_label_label (lab_stmt))) 2516 1.1 mrg return jump_target_rtx (gimple_label_label (lab_stmt)); 2517 1.1 mrg 2518 1.1 mrg rtx_code_label *l = gen_label_rtx (); 2519 1.1 mrg lab_rtx_for_bb->put (bb, l); 2520 1.1 mrg return l; 2521 1.1 mrg } 2522 1.1 mrg 2523 1.1 mrg 2524 1.1 mrg /* A subroutine of expand_gimple_cond. Given E, a fallthrough edge 2525 1.1 mrg of a basic block where we just expanded the conditional at the end, 2526 1.1 mrg possibly clean up the CFG and instruction sequence. LAST is the 2527 1.1 mrg last instruction before the just emitted jump sequence. */ 2528 1.1 mrg 2529 1.1 mrg static void 2530 1.1 mrg maybe_cleanup_end_of_block (edge e, rtx_insn *last) 2531 1.1 mrg { 2532 1.1 mrg /* Special case: when jumpif decides that the condition is 2533 1.1 mrg trivial it emits an unconditional jump (and the necessary 2534 1.1 mrg barrier). But we still have two edges, the fallthru one is 2535 1.1 mrg wrong. purge_dead_edges would clean this up later. Unfortunately 2536 1.1 mrg we have to insert insns (and split edges) before 2537 1.1 mrg find_many_sub_basic_blocks and hence before purge_dead_edges. 2538 1.1 mrg But splitting edges might create new blocks which depend on the 2539 1.1 mrg fact that if there are two edges there's no barrier. So the 2540 1.1 mrg barrier would get lost and verify_flow_info would ICE. Instead 2541 1.1 mrg of auditing all edge splitters to care for the barrier (which 2542 1.1 mrg normally isn't there in a cleaned CFG), fix it here. */ 2543 1.1 mrg if (BARRIER_P (get_last_insn ())) 2544 1.1 mrg { 2545 1.1 mrg rtx_insn *insn; 2546 1.1 mrg remove_edge (e); 2547 1.1 mrg /* Now, we have a single successor block, if we have insns to 2548 1.1 mrg insert on the remaining edge we potentially will insert 2549 1.1 mrg it at the end of this block (if the dest block isn't feasible) 2550 1.1 mrg in order to avoid splitting the edge. This insertion will take 2551 1.1 mrg place in front of the last jump. But we might have emitted 2552 1.1 mrg multiple jumps (conditional and one unconditional) to the 2553 1.1 mrg same destination. Inserting in front of the last one then 2554 1.1 mrg is a problem. See PR 40021. We fix this by deleting all 2555 1.1 mrg jumps except the last unconditional one. */ 2556 1.1 mrg insn = PREV_INSN (get_last_insn ()); 2557 1.1 mrg /* Make sure we have an unconditional jump. Otherwise we're 2558 1.1 mrg confused. */ 2559 1.1 mrg gcc_assert (JUMP_P (insn) && !any_condjump_p (insn)); 2560 1.1 mrg for (insn = PREV_INSN (insn); insn != last;) 2561 1.1 mrg { 2562 1.1 mrg insn = PREV_INSN (insn); 2563 1.1 mrg if (JUMP_P (NEXT_INSN (insn))) 2564 1.1 mrg { 2565 1.1 mrg if (!any_condjump_p (NEXT_INSN (insn))) 2566 1.1 mrg { 2567 1.1 mrg gcc_assert (BARRIER_P (NEXT_INSN (NEXT_INSN (insn)))); 2568 1.1 mrg delete_insn (NEXT_INSN (NEXT_INSN (insn))); 2569 1.1 mrg } 2570 1.1 mrg delete_insn (NEXT_INSN (insn)); 2571 1.1 mrg } 2572 1.1 mrg } 2573 1.1 mrg } 2574 1.1 mrg } 2575 1.1 mrg 2576 1.1 mrg /* A subroutine of expand_gimple_basic_block. Expand one GIMPLE_COND. 2577 1.1 mrg Returns a new basic block if we've terminated the current basic 2578 1.1 mrg block and created a new one. */ 2579 1.1 mrg 2580 1.1 mrg static basic_block 2581 1.1 mrg expand_gimple_cond (basic_block bb, gcond *stmt) 2582 1.1 mrg { 2583 1.1 mrg basic_block new_bb, dest; 2584 1.1 mrg edge true_edge; 2585 1.1 mrg edge false_edge; 2586 1.1 mrg rtx_insn *last2, *last; 2587 1.1 mrg enum tree_code code; 2588 1.1 mrg tree op0, op1; 2589 1.1 mrg 2590 1.1 mrg code = gimple_cond_code (stmt); 2591 1.1 mrg op0 = gimple_cond_lhs (stmt); 2592 1.1 mrg op1 = gimple_cond_rhs (stmt); 2593 1.1 mrg /* We're sometimes presented with such code: 2594 1.1 mrg D.123_1 = x < y; 2595 1.1 mrg if (D.123_1 != 0) 2596 1.1 mrg ... 2597 1.1 mrg This would expand to two comparisons which then later might 2598 1.1 mrg be cleaned up by combine. But some pattern matchers like if-conversion 2599 1.1 mrg work better when there's only one compare, so make up for this 2600 1.1 mrg here as special exception if TER would have made the same change. */ 2601 1.1 mrg if (SA.values 2602 1.1 mrg && TREE_CODE (op0) == SSA_NAME 2603 1.1 mrg && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE 2604 1.1 mrg && TREE_CODE (op1) == INTEGER_CST 2605 1.1 mrg && ((gimple_cond_code (stmt) == NE_EXPR 2606 1.1 mrg && integer_zerop (op1)) 2607 1.1 mrg || (gimple_cond_code (stmt) == EQ_EXPR 2608 1.1 mrg && integer_onep (op1))) 2609 1.1 mrg && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0))) 2610 1.1 mrg { 2611 1.1 mrg gimple *second = SSA_NAME_DEF_STMT (op0); 2612 1.1 mrg if (gimple_code (second) == GIMPLE_ASSIGN) 2613 1.1 mrg { 2614 1.1 mrg enum tree_code code2 = gimple_assign_rhs_code (second); 2615 1.1 mrg if (TREE_CODE_CLASS (code2) == tcc_comparison) 2616 1.1 mrg { 2617 1.1 mrg code = code2; 2618 1.1 mrg op0 = gimple_assign_rhs1 (second); 2619 1.1 mrg op1 = gimple_assign_rhs2 (second); 2620 1.1 mrg } 2621 1.1 mrg /* If jumps are cheap and the target does not support conditional 2622 1.1 mrg compare, turn some more codes into jumpy sequences. */ 2623 1.1 mrg else if (BRANCH_COST (optimize_insn_for_speed_p (), false) < 4 2624 1.1 mrg && targetm.gen_ccmp_first == NULL) 2625 1.1 mrg { 2626 1.1 mrg if ((code2 == BIT_AND_EXPR 2627 1.1 mrg && TYPE_PRECISION (TREE_TYPE (op0)) == 1 2628 1.1 mrg && TREE_CODE (gimple_assign_rhs2 (second)) != INTEGER_CST) 2629 1.1 mrg || code2 == TRUTH_AND_EXPR) 2630 1.1 mrg { 2631 1.1 mrg code = TRUTH_ANDIF_EXPR; 2632 1.1 mrg op0 = gimple_assign_rhs1 (second); 2633 1.1 mrg op1 = gimple_assign_rhs2 (second); 2634 1.1 mrg } 2635 1.1 mrg else if (code2 == BIT_IOR_EXPR || code2 == TRUTH_OR_EXPR) 2636 1.1 mrg { 2637 1.1 mrg code = TRUTH_ORIF_EXPR; 2638 1.1 mrg op0 = gimple_assign_rhs1 (second); 2639 1.1 mrg op1 = gimple_assign_rhs2 (second); 2640 1.1 mrg } 2641 1.1 mrg } 2642 1.1 mrg } 2643 1.1 mrg } 2644 1.1 mrg 2645 1.1 mrg /* Optimize (x % C1) == C2 or (x % C1) != C2 if it is beneficial 2646 1.1 mrg into (x - C2) * C3 < C4. */ 2647 1.1 mrg if ((code == EQ_EXPR || code == NE_EXPR) 2648 1.1 mrg && TREE_CODE (op0) == SSA_NAME 2649 1.1 mrg && TREE_CODE (op1) == INTEGER_CST) 2650 1.1 mrg code = maybe_optimize_mod_cmp (code, &op0, &op1); 2651 1.1 mrg 2652 1.1 mrg /* Optimize (x - y) < 0 into x < y if x - y has undefined overflow. */ 2653 1.1 mrg if (!TYPE_UNSIGNED (TREE_TYPE (op0)) 2654 1.1 mrg && (code == LT_EXPR || code == LE_EXPR 2655 1.1 mrg || code == GT_EXPR || code == GE_EXPR) 2656 1.1 mrg && integer_zerop (op1) 2657 1.1 mrg && TREE_CODE (op0) == SSA_NAME) 2658 1.1 mrg maybe_optimize_sub_cmp_0 (code, &op0, &op1); 2659 1.1 mrg 2660 1.1 mrg last2 = last = get_last_insn (); 2661 1.1 mrg 2662 1.1 mrg extract_true_false_edges_from_block (bb, &true_edge, &false_edge); 2663 1.1 mrg set_curr_insn_location (gimple_location (stmt)); 2664 1.1 mrg 2665 1.1 mrg /* These flags have no purpose in RTL land. */ 2666 1.1 mrg true_edge->flags &= ~EDGE_TRUE_VALUE; 2667 1.1 mrg false_edge->flags &= ~EDGE_FALSE_VALUE; 2668 1.1 mrg 2669 1.1 mrg /* We can either have a pure conditional jump with one fallthru edge or 2670 1.1 mrg two-way jump that needs to be decomposed into two basic blocks. */ 2671 1.1 mrg if (false_edge->dest == bb->next_bb) 2672 1.1 mrg { 2673 1.1 mrg jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest), 2674 1.1 mrg true_edge->probability); 2675 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last); 2676 1.1 mrg if (true_edge->goto_locus != UNKNOWN_LOCATION) 2677 1.1 mrg set_curr_insn_location (true_edge->goto_locus); 2678 1.1 mrg false_edge->flags |= EDGE_FALLTHRU; 2679 1.1 mrg maybe_cleanup_end_of_block (false_edge, last); 2680 1.1 mrg return NULL; 2681 1.1 mrg } 2682 1.1 mrg if (true_edge->dest == bb->next_bb) 2683 1.1 mrg { 2684 1.1 mrg jumpifnot_1 (code, op0, op1, label_rtx_for_bb (false_edge->dest), 2685 1.1 mrg false_edge->probability); 2686 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last); 2687 1.1 mrg if (false_edge->goto_locus != UNKNOWN_LOCATION) 2688 1.1 mrg set_curr_insn_location (false_edge->goto_locus); 2689 1.1 mrg true_edge->flags |= EDGE_FALLTHRU; 2690 1.1 mrg maybe_cleanup_end_of_block (true_edge, last); 2691 1.1 mrg return NULL; 2692 1.1 mrg } 2693 1.1 mrg 2694 1.1 mrg jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest), 2695 1.1 mrg true_edge->probability); 2696 1.1 mrg last = get_last_insn (); 2697 1.1 mrg if (false_edge->goto_locus != UNKNOWN_LOCATION) 2698 1.1 mrg set_curr_insn_location (false_edge->goto_locus); 2699 1.1 mrg emit_jump (label_rtx_for_bb (false_edge->dest)); 2700 1.1 mrg 2701 1.1 mrg BB_END (bb) = last; 2702 1.1 mrg if (BARRIER_P (BB_END (bb))) 2703 1.1 mrg BB_END (bb) = PREV_INSN (BB_END (bb)); 2704 1.1 mrg update_bb_for_insn (bb); 2705 1.1 mrg 2706 1.1 mrg new_bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb); 2707 1.1 mrg dest = false_edge->dest; 2708 1.1 mrg redirect_edge_succ (false_edge, new_bb); 2709 1.1 mrg false_edge->flags |= EDGE_FALLTHRU; 2710 1.1 mrg new_bb->count = false_edge->count (); 2711 1.1 mrg loop_p loop = find_common_loop (bb->loop_father, dest->loop_father); 2712 1.1 mrg add_bb_to_loop (new_bb, loop); 2713 1.1 mrg if (loop->latch == bb 2714 1.1 mrg && loop->header == dest) 2715 1.1 mrg loop->latch = new_bb; 2716 1.1 mrg make_single_succ_edge (new_bb, dest, 0); 2717 1.1 mrg if (BARRIER_P (BB_END (new_bb))) 2718 1.1 mrg BB_END (new_bb) = PREV_INSN (BB_END (new_bb)); 2719 1.1 mrg update_bb_for_insn (new_bb); 2720 1.1 mrg 2721 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last2); 2722 1.1 mrg 2723 1.1 mrg if (true_edge->goto_locus != UNKNOWN_LOCATION) 2724 1.1 mrg { 2725 1.1 mrg set_curr_insn_location (true_edge->goto_locus); 2726 1.1 mrg true_edge->goto_locus = curr_insn_location (); 2727 1.1 mrg } 2728 1.1 mrg 2729 1.1 mrg return new_bb; 2730 1.1 mrg } 2731 1.1 mrg 2732 1.1 mrg /* Mark all calls that can have a transaction restart. */ 2733 1.1 mrg 2734 1.1 mrg static void 2735 1.1 mrg mark_transaction_restart_calls (gimple *stmt) 2736 1.1 mrg { 2737 1.1 mrg struct tm_restart_node dummy; 2738 1.1 mrg tm_restart_node **slot; 2739 1.1 mrg 2740 1.1 mrg if (!cfun->gimple_df->tm_restart) 2741 1.1 mrg return; 2742 1.1 mrg 2743 1.1 mrg dummy.stmt = stmt; 2744 1.1 mrg slot = cfun->gimple_df->tm_restart->find_slot (&dummy, NO_INSERT); 2745 1.1 mrg if (slot) 2746 1.1 mrg { 2747 1.1 mrg struct tm_restart_node *n = *slot; 2748 1.1 mrg tree list = n->label_or_list; 2749 1.1 mrg rtx_insn *insn; 2750 1.1 mrg 2751 1.1 mrg for (insn = next_real_insn (get_last_insn ()); 2752 1.1 mrg !CALL_P (insn); 2753 1.1 mrg insn = next_real_insn (insn)) 2754 1.1 mrg continue; 2755 1.1 mrg 2756 1.1 mrg if (TREE_CODE (list) == LABEL_DECL) 2757 1.1 mrg add_reg_note (insn, REG_TM, label_rtx (list)); 2758 1.1 mrg else 2759 1.1 mrg for (; list ; list = TREE_CHAIN (list)) 2760 1.1 mrg add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list))); 2761 1.1 mrg } 2762 1.1 mrg } 2763 1.1 mrg 2764 1.1 mrg /* A subroutine of expand_gimple_stmt_1, expanding one GIMPLE_CALL 2765 1.1 mrg statement STMT. */ 2766 1.1 mrg 2767 1.1 mrg static void 2768 1.1 mrg expand_call_stmt (gcall *stmt) 2769 1.1 mrg { 2770 1.1 mrg tree exp, decl, lhs; 2771 1.1 mrg bool builtin_p; 2772 1.1 mrg size_t i; 2773 1.1 mrg 2774 1.1 mrg if (gimple_call_internal_p (stmt)) 2775 1.1 mrg { 2776 1.1 mrg expand_internal_call (stmt); 2777 1.1 mrg return; 2778 1.1 mrg } 2779 1.1 mrg 2780 1.1 mrg /* If this is a call to a built-in function and it has no effect other 2781 1.1 mrg than setting the lhs, try to implement it using an internal function 2782 1.1 mrg instead. */ 2783 1.1 mrg decl = gimple_call_fndecl (stmt); 2784 1.1 mrg if (gimple_call_lhs (stmt) 2785 1.1 mrg && !gimple_has_side_effects (stmt) 2786 1.1 mrg && (optimize || (decl && called_as_built_in (decl)))) 2787 1.1 mrg { 2788 1.1 mrg internal_fn ifn = replacement_internal_fn (stmt); 2789 1.1 mrg if (ifn != IFN_LAST) 2790 1.1 mrg { 2791 1.1 mrg expand_internal_call (ifn, stmt); 2792 1.1 mrg return; 2793 1.1 mrg } 2794 1.1 mrg } 2795 1.1 mrg 2796 1.1 mrg exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3); 2797 1.1 mrg 2798 1.1 mrg CALL_EXPR_FN (exp) = gimple_call_fn (stmt); 2799 1.1 mrg builtin_p = decl && fndecl_built_in_p (decl); 2800 1.1 mrg 2801 1.1 mrg /* If this is not a builtin function, the function type through which the 2802 1.1 mrg call is made may be different from the type of the function. */ 2803 1.1 mrg if (!builtin_p) 2804 1.1 mrg CALL_EXPR_FN (exp) 2805 1.1 mrg = fold_convert (build_pointer_type (gimple_call_fntype (stmt)), 2806 1.1 mrg CALL_EXPR_FN (exp)); 2807 1.1 mrg 2808 1.1 mrg TREE_TYPE (exp) = gimple_call_return_type (stmt); 2809 1.1 mrg CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt); 2810 1.1 mrg 2811 1.1 mrg for (i = 0; i < gimple_call_num_args (stmt); i++) 2812 1.1 mrg { 2813 1.1 mrg tree arg = gimple_call_arg (stmt, i); 2814 1.1 mrg gimple *def; 2815 1.1 mrg /* TER addresses into arguments of builtin functions so we have a 2816 1.1 mrg chance to infer more correct alignment information. See PR39954. */ 2817 1.1 mrg if (builtin_p 2818 1.1 mrg && TREE_CODE (arg) == SSA_NAME 2819 1.1 mrg && (def = get_gimple_for_ssa_name (arg)) 2820 1.1 mrg && gimple_assign_rhs_code (def) == ADDR_EXPR) 2821 1.1 mrg arg = gimple_assign_rhs1 (def); 2822 1.1 mrg CALL_EXPR_ARG (exp, i) = arg; 2823 1.1 mrg } 2824 1.1 mrg 2825 1.1 mrg if (gimple_has_side_effects (stmt) 2826 1.1 mrg /* ??? Downstream in expand_expr_real_1 we assume that expressions 2827 1.1 mrg w/o side-effects do not throw so work around this here. */ 2828 1.1 mrg || stmt_could_throw_p (cfun, stmt)) 2829 1.1 mrg TREE_SIDE_EFFECTS (exp) = 1; 2830 1.1 mrg 2831 1.1 mrg if (gimple_call_nothrow_p (stmt)) 2832 1.1 mrg TREE_NOTHROW (exp) = 1; 2833 1.1 mrg 2834 1.1 mrg CALL_EXPR_TAILCALL (exp) = gimple_call_tail_p (stmt); 2835 1.1 mrg CALL_EXPR_MUST_TAIL_CALL (exp) = gimple_call_must_tail_p (stmt); 2836 1.1 mrg CALL_EXPR_RETURN_SLOT_OPT (exp) = gimple_call_return_slot_opt_p (stmt); 2837 1.1 mrg if (decl 2838 1.1 mrg && fndecl_built_in_p (decl, BUILT_IN_NORMAL) 2839 1.1 mrg && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (decl))) 2840 1.1 mrg CALL_ALLOCA_FOR_VAR_P (exp) = gimple_call_alloca_for_var_p (stmt); 2841 1.1 mrg else 2842 1.1 mrg CALL_FROM_THUNK_P (exp) = gimple_call_from_thunk_p (stmt); 2843 1.1 mrg CALL_EXPR_VA_ARG_PACK (exp) = gimple_call_va_arg_pack_p (stmt); 2844 1.1 mrg CALL_EXPR_BY_DESCRIPTOR (exp) = gimple_call_by_descriptor_p (stmt); 2845 1.1 mrg SET_EXPR_LOCATION (exp, gimple_location (stmt)); 2846 1.1 mrg 2847 1.1 mrg /* Must come after copying location. */ 2848 1.1 mrg copy_warning (exp, stmt); 2849 1.1 mrg 2850 1.1 mrg /* Ensure RTL is created for debug args. */ 2851 1.1 mrg if (decl && DECL_HAS_DEBUG_ARGS_P (decl)) 2852 1.1 mrg { 2853 1.1 mrg vec<tree, va_gc> **debug_args = decl_debug_args_lookup (decl); 2854 1.1 mrg unsigned int ix; 2855 1.1 mrg tree dtemp; 2856 1.1 mrg 2857 1.1 mrg if (debug_args) 2858 1.1 mrg for (ix = 1; (*debug_args)->iterate (ix, &dtemp); ix += 2) 2859 1.1 mrg { 2860 1.1 mrg gcc_assert (TREE_CODE (dtemp) == DEBUG_EXPR_DECL); 2861 1.1 mrg expand_debug_expr (dtemp); 2862 1.1 mrg } 2863 1.1 mrg } 2864 1.1 mrg 2865 1.1 mrg rtx_insn *before_call = get_last_insn (); 2866 1.1 mrg lhs = gimple_call_lhs (stmt); 2867 1.1 mrg if (lhs) 2868 1.1 mrg expand_assignment (lhs, exp, false); 2869 1.1 mrg else 2870 1.1 mrg expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL); 2871 1.1 mrg 2872 1.1 mrg /* If the gimple call is an indirect call and has 'nocf_check' 2873 1.1 mrg attribute find a generated CALL insn to mark it as no 2874 1.1 mrg control-flow verification is needed. */ 2875 1.1 mrg if (gimple_call_nocf_check_p (stmt) 2876 1.1 mrg && !gimple_call_fndecl (stmt)) 2877 1.1 mrg { 2878 1.1 mrg rtx_insn *last = get_last_insn (); 2879 1.1 mrg while (!CALL_P (last) 2880 1.1 mrg && last != before_call) 2881 1.1 mrg last = PREV_INSN (last); 2882 1.1 mrg 2883 1.1 mrg if (last != before_call) 2884 1.1 mrg add_reg_note (last, REG_CALL_NOCF_CHECK, const0_rtx); 2885 1.1 mrg } 2886 1.1 mrg 2887 1.1 mrg mark_transaction_restart_calls (stmt); 2888 1.1 mrg } 2889 1.1 mrg 2890 1.1 mrg 2891 1.1 mrg /* Generate RTL for an asm statement (explicit assembler code). 2892 1.1 mrg STRING is a STRING_CST node containing the assembler code text, 2893 1.1 mrg or an ADDR_EXPR containing a STRING_CST. VOL nonzero means the 2894 1.1 mrg insn is volatile; don't optimize it. */ 2895 1.1 mrg 2896 1.1 mrg static void 2897 1.1 mrg expand_asm_loc (tree string, int vol, location_t locus) 2898 1.1 mrg { 2899 1.1 mrg rtx body; 2900 1.1 mrg 2901 1.1 mrg body = gen_rtx_ASM_INPUT_loc (VOIDmode, 2902 1.1 mrg ggc_strdup (TREE_STRING_POINTER (string)), 2903 1.1 mrg locus); 2904 1.1 mrg 2905 1.1 mrg MEM_VOLATILE_P (body) = vol; 2906 1.1 mrg 2907 1.1 mrg /* Non-empty basic ASM implicitly clobbers memory. */ 2908 1.1 mrg if (TREE_STRING_LENGTH (string) != 0) 2909 1.1 mrg { 2910 1.1 mrg rtx asm_op, clob; 2911 1.1 mrg unsigned i, nclobbers; 2912 1.1 mrg auto_vec<rtx> input_rvec, output_rvec; 2913 1.1 mrg auto_vec<machine_mode> input_mode; 2914 1.1 mrg auto_vec<const char *> constraints; 2915 1.5 mrg auto_vec<rtx> use_rvec; 2916 1.1 mrg auto_vec<rtx> clobber_rvec; 2917 1.1 mrg HARD_REG_SET clobbered_regs; 2918 1.1 mrg CLEAR_HARD_REG_SET (clobbered_regs); 2919 1.1 mrg 2920 1.1 mrg clob = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)); 2921 1.1 mrg clobber_rvec.safe_push (clob); 2922 1.1 mrg 2923 1.1 mrg if (targetm.md_asm_adjust) 2924 1.1 mrg targetm.md_asm_adjust (output_rvec, input_rvec, input_mode, 2925 1.5 mrg constraints, use_rvec, clobber_rvec, 2926 1.5 mrg clobbered_regs, locus); 2927 1.1 mrg 2928 1.1 mrg asm_op = body; 2929 1.1 mrg nclobbers = clobber_rvec.length (); 2930 1.5 mrg auto nuses = use_rvec.length (); 2931 1.5 mrg body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (1 + nuses + nclobbers)); 2932 1.1 mrg 2933 1.5 mrg i = 0; 2934 1.5 mrg XVECEXP (body, 0, i++) = asm_op; 2935 1.5 mrg for (rtx use : use_rvec) 2936 1.5 mrg XVECEXP (body, 0, i++) = gen_rtx_USE (VOIDmode, use); 2937 1.5 mrg for (rtx clobber : clobber_rvec) 2938 1.5 mrg XVECEXP (body, 0, i++) = gen_rtx_CLOBBER (VOIDmode, clobber); 2939 1.1 mrg } 2940 1.1 mrg 2941 1.1 mrg emit_insn (body); 2942 1.1 mrg } 2943 1.1 mrg 2944 1.1 mrg /* Return the number of times character C occurs in string S. */ 2945 1.1 mrg static int 2946 1.1 mrg n_occurrences (int c, const char *s) 2947 1.1 mrg { 2948 1.1 mrg int n = 0; 2949 1.1 mrg while (*s) 2950 1.1 mrg n += (*s++ == c); 2951 1.1 mrg return n; 2952 1.1 mrg } 2953 1.1 mrg 2954 1.1 mrg /* A subroutine of expand_asm_operands. Check that all operands have 2955 1.1 mrg the same number of alternatives. Return true if so. */ 2956 1.1 mrg 2957 1.1 mrg static bool 2958 1.1 mrg check_operand_nalternatives (const vec<const char *> &constraints) 2959 1.1 mrg { 2960 1.1 mrg unsigned len = constraints.length(); 2961 1.1 mrg if (len > 0) 2962 1.1 mrg { 2963 1.1 mrg int nalternatives = n_occurrences (',', constraints[0]); 2964 1.1 mrg 2965 1.1 mrg if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES) 2966 1.1 mrg { 2967 1.1 mrg error ("too many alternatives in %<asm%>"); 2968 1.1 mrg return false; 2969 1.1 mrg } 2970 1.1 mrg 2971 1.1 mrg for (unsigned i = 1; i < len; ++i) 2972 1.1 mrg if (n_occurrences (',', constraints[i]) != nalternatives) 2973 1.1 mrg { 2974 1.1 mrg error ("operand constraints for %<asm%> differ " 2975 1.1 mrg "in number of alternatives"); 2976 1.1 mrg return false; 2977 1.1 mrg } 2978 1.1 mrg } 2979 1.1 mrg return true; 2980 1.1 mrg } 2981 1.1 mrg 2982 1.1 mrg /* Check for overlap between registers marked in CLOBBERED_REGS and 2983 1.1 mrg anything inappropriate in T. Emit error and return the register 2984 1.1 mrg variable definition for error, NULL_TREE for ok. */ 2985 1.1 mrg 2986 1.1 mrg static bool 2987 1.1 mrg tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs, 2988 1.1 mrg location_t loc) 2989 1.1 mrg { 2990 1.1 mrg /* Conflicts between asm-declared register variables and the clobber 2991 1.1 mrg list are not allowed. */ 2992 1.1 mrg tree overlap = tree_overlaps_hard_reg_set (t, clobbered_regs); 2993 1.1 mrg 2994 1.1 mrg if (overlap) 2995 1.1 mrg { 2996 1.1 mrg error_at (loc, "%<asm%> specifier for variable %qE conflicts with " 2997 1.1 mrg "%<asm%> clobber list", DECL_NAME (overlap)); 2998 1.1 mrg 2999 1.1 mrg /* Reset registerness to stop multiple errors emitted for a single 3000 1.1 mrg variable. */ 3001 1.1 mrg DECL_REGISTER (overlap) = 0; 3002 1.1 mrg return true; 3003 1.1 mrg } 3004 1.1 mrg 3005 1.1 mrg return false; 3006 1.1 mrg } 3007 1.1 mrg 3008 1.1 mrg /* Check that the given REGNO spanning NREGS is a valid 3009 1.1 mrg asm clobber operand. Some HW registers cannot be 3010 1.1 mrg saved/restored, hence they should not be clobbered by 3011 1.1 mrg asm statements. */ 3012 1.1 mrg static bool 3013 1.1 mrg asm_clobber_reg_is_valid (int regno, int nregs, const char *regname) 3014 1.1 mrg { 3015 1.1 mrg bool is_valid = true; 3016 1.1 mrg HARD_REG_SET regset; 3017 1.1 mrg 3018 1.1 mrg CLEAR_HARD_REG_SET (regset); 3019 1.1 mrg 3020 1.1 mrg add_range_to_hard_reg_set (®set, regno, nregs); 3021 1.1 mrg 3022 1.1 mrg /* Clobbering the PIC register is an error. */ 3023 1.1 mrg if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM 3024 1.1 mrg && overlaps_hard_reg_set_p (regset, Pmode, PIC_OFFSET_TABLE_REGNUM)) 3025 1.1 mrg { 3026 1.1 mrg /* ??? Diagnose during gimplification? */ 3027 1.1 mrg error ("PIC register clobbered by %qs in %<asm%>", regname); 3028 1.1 mrg is_valid = false; 3029 1.1 mrg } 3030 1.1 mrg else if (!in_hard_reg_set_p 3031 1.1 mrg (accessible_reg_set, reg_raw_mode[regno], regno)) 3032 1.1 mrg { 3033 1.1 mrg /* ??? Diagnose during gimplification? */ 3034 1.1 mrg error ("the register %qs cannot be clobbered in %<asm%>" 3035 1.1 mrg " for the current target", regname); 3036 1.1 mrg is_valid = false; 3037 1.1 mrg } 3038 1.1 mrg 3039 1.1 mrg /* Clobbering the stack pointer register is deprecated. GCC expects 3040 1.1 mrg the value of the stack pointer after an asm statement to be the same 3041 1.1 mrg as it was before, so no asm can validly clobber the stack pointer in 3042 1.1 mrg the usual sense. Adding the stack pointer to the clobber list has 3043 1.1 mrg traditionally had some undocumented and somewhat obscure side-effects. */ 3044 1.1 mrg if (overlaps_hard_reg_set_p (regset, Pmode, STACK_POINTER_REGNUM)) 3045 1.1 mrg { 3046 1.1 mrg crtl->sp_is_clobbered_by_asm = true; 3047 1.1 mrg if (warning (OPT_Wdeprecated, "listing the stack pointer register" 3048 1.1 mrg " %qs in a clobber list is deprecated", regname)) 3049 1.1 mrg inform (input_location, "the value of the stack pointer after" 3050 1.1 mrg " an %<asm%> statement must be the same as it was before" 3051 1.1 mrg " the statement"); 3052 1.1 mrg } 3053 1.1 mrg 3054 1.1 mrg return is_valid; 3055 1.1 mrg } 3056 1.1 mrg 3057 1.1 mrg /* Generate RTL for an asm statement with arguments. 3058 1.1 mrg STRING is the instruction template. 3059 1.1 mrg OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs. 3060 1.1 mrg Each output or input has an expression in the TREE_VALUE and 3061 1.1 mrg a tree list in TREE_PURPOSE which in turn contains a constraint 3062 1.1 mrg name in TREE_VALUE (or NULL_TREE) and a constraint string 3063 1.1 mrg in TREE_PURPOSE. 3064 1.1 mrg CLOBBERS is a list of STRING_CST nodes each naming a hard register 3065 1.1 mrg that is clobbered by this insn. 3066 1.1 mrg 3067 1.1 mrg LABELS is a list of labels, and if LABELS is non-NULL, FALLTHRU_BB 3068 1.1 mrg should be the fallthru basic block of the asm goto. 3069 1.1 mrg 3070 1.1 mrg Not all kinds of lvalue that may appear in OUTPUTS can be stored directly. 3071 1.1 mrg Some elements of OUTPUTS may be replaced with trees representing temporary 3072 1.1 mrg values. The caller should copy those temporary values to the originally 3073 1.1 mrg specified lvalues. 3074 1.1 mrg 3075 1.1 mrg VOL nonzero means the insn is volatile; don't optimize it. */ 3076 1.1 mrg 3077 1.1 mrg static void 3078 1.1 mrg expand_asm_stmt (gasm *stmt) 3079 1.1 mrg { 3080 1.1 mrg class save_input_location 3081 1.1 mrg { 3082 1.1 mrg location_t old; 3083 1.1 mrg 3084 1.1 mrg public: 3085 1.1 mrg explicit save_input_location(location_t where) 3086 1.1 mrg { 3087 1.1 mrg old = input_location; 3088 1.1 mrg input_location = where; 3089 1.1 mrg } 3090 1.1 mrg 3091 1.1 mrg ~save_input_location() 3092 1.1 mrg { 3093 1.1 mrg input_location = old; 3094 1.1 mrg } 3095 1.1 mrg }; 3096 1.1 mrg 3097 1.1 mrg location_t locus = gimple_location (stmt); 3098 1.1 mrg 3099 1.1 mrg if (gimple_asm_input_p (stmt)) 3100 1.1 mrg { 3101 1.1 mrg const char *s = gimple_asm_string (stmt); 3102 1.1 mrg tree string = build_string (strlen (s), s); 3103 1.1 mrg expand_asm_loc (string, gimple_asm_volatile_p (stmt), locus); 3104 1.1 mrg return; 3105 1.1 mrg } 3106 1.1 mrg 3107 1.1 mrg /* There are some legacy diagnostics in here. */ 3108 1.1 mrg save_input_location s_i_l(locus); 3109 1.1 mrg 3110 1.1 mrg unsigned noutputs = gimple_asm_noutputs (stmt); 3111 1.1 mrg unsigned ninputs = gimple_asm_ninputs (stmt); 3112 1.1 mrg unsigned nlabels = gimple_asm_nlabels (stmt); 3113 1.1 mrg unsigned i; 3114 1.1 mrg bool error_seen = false; 3115 1.1 mrg 3116 1.1 mrg /* ??? Diagnose during gimplification? */ 3117 1.1 mrg if (ninputs + noutputs + nlabels > MAX_RECOG_OPERANDS) 3118 1.1 mrg { 3119 1.1 mrg error_at (locus, "more than %d operands in %<asm%>", MAX_RECOG_OPERANDS); 3120 1.1 mrg return; 3121 1.1 mrg } 3122 1.1 mrg 3123 1.1 mrg auto_vec<tree, MAX_RECOG_OPERANDS> output_tvec; 3124 1.1 mrg auto_vec<tree, MAX_RECOG_OPERANDS> input_tvec; 3125 1.1 mrg auto_vec<const char *, MAX_RECOG_OPERANDS> constraints; 3126 1.1 mrg 3127 1.1 mrg /* Copy the gimple vectors into new vectors that we can manipulate. */ 3128 1.1 mrg 3129 1.1 mrg output_tvec.safe_grow (noutputs, true); 3130 1.1 mrg input_tvec.safe_grow (ninputs, true); 3131 1.1 mrg constraints.safe_grow (noutputs + ninputs, true); 3132 1.1 mrg 3133 1.1 mrg for (i = 0; i < noutputs; ++i) 3134 1.1 mrg { 3135 1.1 mrg tree t = gimple_asm_output_op (stmt, i); 3136 1.1 mrg output_tvec[i] = TREE_VALUE (t); 3137 1.1 mrg constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t))); 3138 1.1 mrg } 3139 1.1 mrg for (i = 0; i < ninputs; i++) 3140 1.1 mrg { 3141 1.1 mrg tree t = gimple_asm_input_op (stmt, i); 3142 1.1 mrg input_tvec[i] = TREE_VALUE (t); 3143 1.1 mrg constraints[i + noutputs] 3144 1.1 mrg = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t))); 3145 1.1 mrg } 3146 1.1 mrg 3147 1.1 mrg /* ??? Diagnose during gimplification? */ 3148 1.1 mrg if (! check_operand_nalternatives (constraints)) 3149 1.1 mrg return; 3150 1.1 mrg 3151 1.1 mrg /* Count the number of meaningful clobbered registers, ignoring what 3152 1.1 mrg we would ignore later. */ 3153 1.1 mrg auto_vec<rtx> clobber_rvec; 3154 1.1 mrg HARD_REG_SET clobbered_regs; 3155 1.1 mrg CLEAR_HARD_REG_SET (clobbered_regs); 3156 1.1 mrg 3157 1.1 mrg if (unsigned n = gimple_asm_nclobbers (stmt)) 3158 1.1 mrg { 3159 1.1 mrg clobber_rvec.reserve (n); 3160 1.1 mrg for (i = 0; i < n; i++) 3161 1.1 mrg { 3162 1.1 mrg tree t = gimple_asm_clobber_op (stmt, i); 3163 1.1 mrg const char *regname = TREE_STRING_POINTER (TREE_VALUE (t)); 3164 1.1 mrg int nregs, j; 3165 1.1 mrg 3166 1.1 mrg j = decode_reg_name_and_count (regname, &nregs); 3167 1.1 mrg if (j < 0) 3168 1.1 mrg { 3169 1.1 mrg if (j == -2) 3170 1.1 mrg { 3171 1.1 mrg /* ??? Diagnose during gimplification? */ 3172 1.1 mrg error_at (locus, "unknown register name %qs in %<asm%>", 3173 1.1 mrg regname); 3174 1.1 mrg error_seen = true; 3175 1.1 mrg } 3176 1.1 mrg else if (j == -4) 3177 1.1 mrg { 3178 1.1 mrg rtx x = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)); 3179 1.1 mrg clobber_rvec.safe_push (x); 3180 1.1 mrg } 3181 1.1 mrg else 3182 1.1 mrg { 3183 1.1 mrg /* Otherwise we should have -1 == empty string 3184 1.1 mrg or -3 == cc, which is not a register. */ 3185 1.1 mrg gcc_assert (j == -1 || j == -3); 3186 1.1 mrg } 3187 1.1 mrg } 3188 1.1 mrg else 3189 1.1 mrg for (int reg = j; reg < j + nregs; reg++) 3190 1.1 mrg { 3191 1.1 mrg if (!asm_clobber_reg_is_valid (reg, nregs, regname)) 3192 1.1 mrg return; 3193 1.1 mrg 3194 1.1 mrg SET_HARD_REG_BIT (clobbered_regs, reg); 3195 1.1 mrg rtx x = gen_rtx_REG (reg_raw_mode[reg], reg); 3196 1.1 mrg clobber_rvec.safe_push (x); 3197 1.1 mrg } 3198 1.1 mrg } 3199 1.1 mrg } 3200 1.1 mrg 3201 1.1 mrg /* First pass over inputs and outputs checks validity and sets 3202 1.1 mrg mark_addressable if needed. */ 3203 1.1 mrg /* ??? Diagnose during gimplification? */ 3204 1.1 mrg 3205 1.1 mrg for (i = 0; i < noutputs; ++i) 3206 1.1 mrg { 3207 1.1 mrg tree val = output_tvec[i]; 3208 1.1 mrg tree type = TREE_TYPE (val); 3209 1.1 mrg const char *constraint; 3210 1.1 mrg bool is_inout; 3211 1.1 mrg bool allows_reg; 3212 1.1 mrg bool allows_mem; 3213 1.1 mrg 3214 1.1 mrg /* Try to parse the output constraint. If that fails, there's 3215 1.1 mrg no point in going further. */ 3216 1.1 mrg constraint = constraints[i]; 3217 1.1 mrg if (!parse_output_constraint (&constraint, i, ninputs, noutputs, 3218 1.1 mrg &allows_mem, &allows_reg, &is_inout)) 3219 1.1 mrg return; 3220 1.1 mrg 3221 1.1 mrg /* If the output is a hard register, verify it doesn't conflict with 3222 1.1 mrg any other operand's possible hard register use. */ 3223 1.1 mrg if (DECL_P (val) 3224 1.1 mrg && REG_P (DECL_RTL (val)) 3225 1.1 mrg && HARD_REGISTER_P (DECL_RTL (val))) 3226 1.1 mrg { 3227 1.1 mrg unsigned j, output_hregno = REGNO (DECL_RTL (val)); 3228 1.1 mrg bool early_clobber_p = strchr (constraints[i], '&') != NULL; 3229 1.1 mrg unsigned long match; 3230 1.1 mrg 3231 1.1 mrg /* Verify the other outputs do not use the same hard register. */ 3232 1.1 mrg for (j = i + 1; j < noutputs; ++j) 3233 1.1 mrg if (DECL_P (output_tvec[j]) 3234 1.1 mrg && REG_P (DECL_RTL (output_tvec[j])) 3235 1.1 mrg && HARD_REGISTER_P (DECL_RTL (output_tvec[j])) 3236 1.1 mrg && output_hregno == REGNO (DECL_RTL (output_tvec[j]))) 3237 1.1 mrg { 3238 1.1 mrg error_at (locus, "invalid hard register usage between output " 3239 1.1 mrg "operands"); 3240 1.1 mrg error_seen = true; 3241 1.1 mrg } 3242 1.1 mrg 3243 1.1 mrg /* Verify matching constraint operands use the same hard register 3244 1.1 mrg and that the non-matching constraint operands do not use the same 3245 1.1 mrg hard register if the output is an early clobber operand. */ 3246 1.1 mrg for (j = 0; j < ninputs; ++j) 3247 1.1 mrg if (DECL_P (input_tvec[j]) 3248 1.1 mrg && REG_P (DECL_RTL (input_tvec[j])) 3249 1.1 mrg && HARD_REGISTER_P (DECL_RTL (input_tvec[j]))) 3250 1.1 mrg { 3251 1.1 mrg unsigned input_hregno = REGNO (DECL_RTL (input_tvec[j])); 3252 1.1 mrg switch (*constraints[j + noutputs]) 3253 1.1 mrg { 3254 1.1 mrg case '0': case '1': case '2': case '3': case '4': 3255 1.1 mrg case '5': case '6': case '7': case '8': case '9': 3256 1.1 mrg match = strtoul (constraints[j + noutputs], NULL, 10); 3257 1.1 mrg break; 3258 1.1 mrg default: 3259 1.1 mrg match = ULONG_MAX; 3260 1.1 mrg break; 3261 1.1 mrg } 3262 1.1 mrg if (i == match 3263 1.1 mrg && output_hregno != input_hregno) 3264 1.1 mrg { 3265 1.1 mrg error_at (locus, "invalid hard register usage between " 3266 1.1 mrg "output operand and matching constraint operand"); 3267 1.1 mrg error_seen = true; 3268 1.1 mrg } 3269 1.1 mrg else if (early_clobber_p 3270 1.1 mrg && i != match 3271 1.1 mrg && output_hregno == input_hregno) 3272 1.1 mrg { 3273 1.1 mrg error_at (locus, "invalid hard register usage between " 3274 1.1 mrg "earlyclobber operand and input operand"); 3275 1.1 mrg error_seen = true; 3276 1.1 mrg } 3277 1.1 mrg } 3278 1.1 mrg } 3279 1.1 mrg 3280 1.1 mrg if (! allows_reg 3281 1.1 mrg && (allows_mem 3282 1.1 mrg || is_inout 3283 1.1 mrg || (DECL_P (val) 3284 1.1 mrg && REG_P (DECL_RTL (val)) 3285 1.1 mrg && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))) 3286 1.1 mrg mark_addressable (val); 3287 1.1 mrg } 3288 1.1 mrg 3289 1.1 mrg for (i = 0; i < ninputs; ++i) 3290 1.1 mrg { 3291 1.1 mrg bool allows_reg, allows_mem; 3292 1.1 mrg const char *constraint; 3293 1.1 mrg 3294 1.1 mrg constraint = constraints[i + noutputs]; 3295 1.1 mrg if (! parse_input_constraint (&constraint, i, ninputs, noutputs, 0, 3296 1.1 mrg constraints.address (), 3297 1.1 mrg &allows_mem, &allows_reg)) 3298 1.1 mrg return; 3299 1.1 mrg 3300 1.1 mrg if (! allows_reg && allows_mem) 3301 1.1 mrg mark_addressable (input_tvec[i]); 3302 1.1 mrg } 3303 1.1 mrg 3304 1.1 mrg /* Second pass evaluates arguments. */ 3305 1.1 mrg 3306 1.1 mrg /* Make sure stack is consistent for asm goto. */ 3307 1.1 mrg if (nlabels > 0) 3308 1.1 mrg do_pending_stack_adjust (); 3309 1.1 mrg int old_generating_concat_p = generating_concat_p; 3310 1.1 mrg 3311 1.1 mrg /* Vector of RTX's of evaluated output operands. */ 3312 1.1 mrg auto_vec<rtx, MAX_RECOG_OPERANDS> output_rvec; 3313 1.1 mrg auto_vec<int, MAX_RECOG_OPERANDS> inout_opnum; 3314 1.1 mrg rtx_insn *after_rtl_seq = NULL, *after_rtl_end = NULL; 3315 1.1 mrg 3316 1.1 mrg output_rvec.safe_grow (noutputs, true); 3317 1.1 mrg 3318 1.1 mrg for (i = 0; i < noutputs; ++i) 3319 1.1 mrg { 3320 1.1 mrg tree val = output_tvec[i]; 3321 1.1 mrg tree type = TREE_TYPE (val); 3322 1.1 mrg bool is_inout, allows_reg, allows_mem, ok; 3323 1.1 mrg rtx op; 3324 1.1 mrg 3325 1.1 mrg ok = parse_output_constraint (&constraints[i], i, ninputs, 3326 1.1 mrg noutputs, &allows_mem, &allows_reg, 3327 1.1 mrg &is_inout); 3328 1.1 mrg gcc_assert (ok); 3329 1.1 mrg 3330 1.1 mrg /* If an output operand is not a decl or indirect ref and our constraint 3331 1.1 mrg allows a register, make a temporary to act as an intermediate. 3332 1.1 mrg Make the asm insn write into that, then we will copy it to 3333 1.1 mrg the real output operand. Likewise for promoted variables. */ 3334 1.1 mrg 3335 1.1 mrg generating_concat_p = 0; 3336 1.1 mrg 3337 1.1 mrg gcc_assert (TREE_CODE (val) != INDIRECT_REF); 3338 1.1 mrg if (((TREE_CODE (val) == MEM_REF 3339 1.1 mrg && TREE_CODE (TREE_OPERAND (val, 0)) != ADDR_EXPR) 3340 1.1 mrg && allows_mem) 3341 1.1 mrg || (DECL_P (val) 3342 1.1 mrg && (allows_mem || REG_P (DECL_RTL (val))) 3343 1.1 mrg && ! (REG_P (DECL_RTL (val)) 3344 1.1 mrg && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))) 3345 1.1 mrg || ! allows_reg 3346 1.1 mrg || is_inout 3347 1.1 mrg || TREE_ADDRESSABLE (type) 3348 1.1 mrg || (!tree_fits_poly_int64_p (TYPE_SIZE (type)) 3349 1.1 mrg && !known_size_p (max_int_size_in_bytes (type)))) 3350 1.1 mrg { 3351 1.1 mrg op = expand_expr (val, NULL_RTX, VOIDmode, 3352 1.1 mrg !allows_reg ? EXPAND_MEMORY : EXPAND_WRITE); 3353 1.1 mrg if (MEM_P (op)) 3354 1.1 mrg op = validize_mem (op); 3355 1.1 mrg 3356 1.1 mrg if (! allows_reg && !MEM_P (op)) 3357 1.1 mrg { 3358 1.1 mrg error_at (locus, "output number %d not directly addressable", i); 3359 1.1 mrg error_seen = true; 3360 1.1 mrg } 3361 1.1 mrg if ((! allows_mem && MEM_P (op) && GET_MODE (op) != BLKmode) 3362 1.1 mrg || GET_CODE (op) == CONCAT) 3363 1.1 mrg { 3364 1.1 mrg rtx old_op = op; 3365 1.1 mrg op = gen_reg_rtx (GET_MODE (op)); 3366 1.1 mrg 3367 1.1 mrg generating_concat_p = old_generating_concat_p; 3368 1.1 mrg 3369 1.1 mrg if (is_inout) 3370 1.1 mrg emit_move_insn (op, old_op); 3371 1.1 mrg 3372 1.1 mrg push_to_sequence2 (after_rtl_seq, after_rtl_end); 3373 1.1 mrg emit_move_insn (old_op, op); 3374 1.1 mrg after_rtl_seq = get_insns (); 3375 1.1 mrg after_rtl_end = get_last_insn (); 3376 1.1 mrg end_sequence (); 3377 1.1 mrg } 3378 1.1 mrg } 3379 1.1 mrg else 3380 1.1 mrg { 3381 1.1 mrg op = assign_temp (type, 0, 1); 3382 1.1 mrg op = validize_mem (op); 3383 1.1 mrg if (!MEM_P (op) && TREE_CODE (val) == SSA_NAME) 3384 1.1 mrg set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (val), op); 3385 1.1 mrg 3386 1.1 mrg generating_concat_p = old_generating_concat_p; 3387 1.1 mrg 3388 1.1 mrg push_to_sequence2 (after_rtl_seq, after_rtl_end); 3389 1.1 mrg expand_assignment (val, make_tree (type, op), false); 3390 1.1 mrg after_rtl_seq = get_insns (); 3391 1.1 mrg after_rtl_end = get_last_insn (); 3392 1.1 mrg end_sequence (); 3393 1.1 mrg } 3394 1.1 mrg output_rvec[i] = op; 3395 1.1 mrg 3396 1.1 mrg if (is_inout) 3397 1.1 mrg inout_opnum.safe_push (i); 3398 1.1 mrg } 3399 1.1 mrg 3400 1.1 mrg const char *str = gimple_asm_string (stmt); 3401 1.1 mrg if (error_seen) 3402 1.1 mrg { 3403 1.1 mrg ninputs = 0; 3404 1.1 mrg noutputs = 0; 3405 1.1 mrg inout_opnum.truncate (0); 3406 1.1 mrg output_rvec.truncate (0); 3407 1.1 mrg clobber_rvec.truncate (0); 3408 1.1 mrg constraints.truncate (0); 3409 1.1 mrg CLEAR_HARD_REG_SET (clobbered_regs); 3410 1.1 mrg str = ""; 3411 1.1 mrg } 3412 1.1 mrg 3413 1.1 mrg auto_vec<rtx, MAX_RECOG_OPERANDS> input_rvec; 3414 1.1 mrg auto_vec<machine_mode, MAX_RECOG_OPERANDS> input_mode; 3415 1.1 mrg 3416 1.1 mrg input_rvec.safe_grow (ninputs, true); 3417 1.1 mrg input_mode.safe_grow (ninputs, true); 3418 1.1 mrg 3419 1.1 mrg generating_concat_p = 0; 3420 1.1 mrg 3421 1.1 mrg for (i = 0; i < ninputs; ++i) 3422 1.1 mrg { 3423 1.1 mrg tree val = input_tvec[i]; 3424 1.1 mrg tree type = TREE_TYPE (val); 3425 1.1 mrg bool allows_reg, allows_mem, ok; 3426 1.1 mrg const char *constraint; 3427 1.1 mrg rtx op; 3428 1.1 mrg 3429 1.1 mrg constraint = constraints[i + noutputs]; 3430 1.1 mrg ok = parse_input_constraint (&constraint, i, ninputs, noutputs, 0, 3431 1.1 mrg constraints.address (), 3432 1.1 mrg &allows_mem, &allows_reg); 3433 1.1 mrg gcc_assert (ok); 3434 1.1 mrg 3435 1.1 mrg /* EXPAND_INITIALIZER will not generate code for valid initializer 3436 1.1 mrg constants, but will still generate code for other types of operand. 3437 1.1 mrg This is the behavior we want for constant constraints. */ 3438 1.1 mrg op = expand_expr (val, NULL_RTX, VOIDmode, 3439 1.1 mrg allows_reg ? EXPAND_NORMAL 3440 1.1 mrg : allows_mem ? EXPAND_MEMORY 3441 1.1 mrg : EXPAND_INITIALIZER); 3442 1.1 mrg 3443 1.1 mrg /* Never pass a CONCAT to an ASM. */ 3444 1.1 mrg if (GET_CODE (op) == CONCAT) 3445 1.1 mrg op = force_reg (GET_MODE (op), op); 3446 1.1 mrg else if (MEM_P (op)) 3447 1.1 mrg op = validize_mem (op); 3448 1.1 mrg 3449 1.1 mrg if (asm_operand_ok (op, constraint, NULL) <= 0) 3450 1.1 mrg { 3451 1.1 mrg if (allows_reg && TYPE_MODE (type) != BLKmode) 3452 1.1 mrg op = force_reg (TYPE_MODE (type), op); 3453 1.1 mrg else if (!allows_mem) 3454 1.1 mrg warning_at (locus, 0, "%<asm%> operand %d probably does not match " 3455 1.1 mrg "constraints", i + noutputs); 3456 1.1 mrg else if (MEM_P (op)) 3457 1.1 mrg { 3458 1.1 mrg /* We won't recognize either volatile memory or memory 3459 1.1 mrg with a queued address as available a memory_operand 3460 1.1 mrg at this point. Ignore it: clearly this *is* a memory. */ 3461 1.1 mrg } 3462 1.1 mrg else 3463 1.1 mrg gcc_unreachable (); 3464 1.1 mrg } 3465 1.1 mrg input_rvec[i] = op; 3466 1.1 mrg input_mode[i] = TYPE_MODE (type); 3467 1.1 mrg } 3468 1.1 mrg 3469 1.1 mrg /* For in-out operands, copy output rtx to input rtx. */ 3470 1.1 mrg unsigned ninout = inout_opnum.length (); 3471 1.1 mrg for (i = 0; i < ninout; i++) 3472 1.1 mrg { 3473 1.1 mrg int j = inout_opnum[i]; 3474 1.1 mrg rtx o = output_rvec[j]; 3475 1.1 mrg 3476 1.1 mrg input_rvec.safe_push (o); 3477 1.1 mrg input_mode.safe_push (GET_MODE (o)); 3478 1.1 mrg 3479 1.1 mrg char buffer[16]; 3480 1.1 mrg sprintf (buffer, "%d", j); 3481 1.1 mrg constraints.safe_push (ggc_strdup (buffer)); 3482 1.1 mrg } 3483 1.1 mrg ninputs += ninout; 3484 1.1 mrg 3485 1.1 mrg /* Sometimes we wish to automatically clobber registers across an asm. 3486 1.1 mrg Case in point is when the i386 backend moved from cc0 to a hard reg -- 3487 1.1 mrg maintaining source-level compatibility means automatically clobbering 3488 1.1 mrg the flags register. */ 3489 1.1 mrg rtx_insn *after_md_seq = NULL; 3490 1.5 mrg auto_vec<rtx> use_rvec; 3491 1.1 mrg if (targetm.md_asm_adjust) 3492 1.1 mrg after_md_seq 3493 1.1 mrg = targetm.md_asm_adjust (output_rvec, input_rvec, input_mode, 3494 1.5 mrg constraints, use_rvec, clobber_rvec, 3495 1.5 mrg clobbered_regs, locus); 3496 1.1 mrg 3497 1.1 mrg /* Do not allow the hook to change the output and input count, 3498 1.1 mrg lest it mess up the operand numbering. */ 3499 1.1 mrg gcc_assert (output_rvec.length() == noutputs); 3500 1.1 mrg gcc_assert (input_rvec.length() == ninputs); 3501 1.1 mrg gcc_assert (constraints.length() == noutputs + ninputs); 3502 1.1 mrg 3503 1.5 mrg /* But it certainly can adjust the uses and clobbers. */ 3504 1.5 mrg unsigned nuses = use_rvec.length (); 3505 1.1 mrg unsigned nclobbers = clobber_rvec.length (); 3506 1.1 mrg 3507 1.1 mrg /* Third pass checks for easy conflicts. */ 3508 1.1 mrg /* ??? Why are we doing this on trees instead of rtx. */ 3509 1.1 mrg 3510 1.1 mrg bool clobber_conflict_found = 0; 3511 1.1 mrg for (i = 0; i < noutputs; ++i) 3512 1.1 mrg if (tree_conflicts_with_clobbers_p (output_tvec[i], &clobbered_regs, locus)) 3513 1.1 mrg clobber_conflict_found = 1; 3514 1.1 mrg for (i = 0; i < ninputs - ninout; ++i) 3515 1.1 mrg if (tree_conflicts_with_clobbers_p (input_tvec[i], &clobbered_regs, locus)) 3516 1.1 mrg clobber_conflict_found = 1; 3517 1.1 mrg 3518 1.1 mrg /* Make vectors for the expression-rtx, constraint strings, 3519 1.1 mrg and named operands. */ 3520 1.1 mrg 3521 1.1 mrg rtvec argvec = rtvec_alloc (ninputs); 3522 1.1 mrg rtvec constraintvec = rtvec_alloc (ninputs); 3523 1.1 mrg rtvec labelvec = rtvec_alloc (nlabels); 3524 1.1 mrg 3525 1.1 mrg rtx body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode 3526 1.1 mrg : GET_MODE (output_rvec[0])), 3527 1.1 mrg ggc_strdup (str), 3528 1.1 mrg "", 0, argvec, constraintvec, 3529 1.1 mrg labelvec, locus); 3530 1.1 mrg MEM_VOLATILE_P (body) = gimple_asm_volatile_p (stmt); 3531 1.1 mrg 3532 1.1 mrg for (i = 0; i < ninputs; ++i) 3533 1.1 mrg { 3534 1.1 mrg ASM_OPERANDS_INPUT (body, i) = input_rvec[i]; 3535 1.1 mrg ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i) 3536 1.1 mrg = gen_rtx_ASM_INPUT_loc (input_mode[i], 3537 1.1 mrg constraints[i + noutputs], 3538 1.1 mrg locus); 3539 1.1 mrg } 3540 1.1 mrg 3541 1.1 mrg /* Copy labels to the vector. */ 3542 1.1 mrg rtx_code_label *fallthru_label = NULL; 3543 1.1 mrg if (nlabels > 0) 3544 1.1 mrg { 3545 1.1 mrg basic_block fallthru_bb = NULL; 3546 1.1 mrg edge fallthru = find_fallthru_edge (gimple_bb (stmt)->succs); 3547 1.1 mrg if (fallthru) 3548 1.1 mrg fallthru_bb = fallthru->dest; 3549 1.1 mrg 3550 1.1 mrg for (i = 0; i < nlabels; ++i) 3551 1.1 mrg { 3552 1.1 mrg tree label = TREE_VALUE (gimple_asm_label_op (stmt, i)); 3553 1.1 mrg rtx_insn *r; 3554 1.1 mrg /* If asm goto has any labels in the fallthru basic block, use 3555 1.1 mrg a label that we emit immediately after the asm goto. Expansion 3556 1.1 mrg may insert further instructions into the same basic block after 3557 1.1 mrg asm goto and if we don't do this, insertion of instructions on 3558 1.1 mrg the fallthru edge might misbehave. See PR58670. */ 3559 1.1 mrg if (fallthru_bb && label_to_block (cfun, label) == fallthru_bb) 3560 1.1 mrg { 3561 1.1 mrg if (fallthru_label == NULL_RTX) 3562 1.1 mrg fallthru_label = gen_label_rtx (); 3563 1.1 mrg r = fallthru_label; 3564 1.1 mrg } 3565 1.1 mrg else 3566 1.1 mrg r = label_rtx (label); 3567 1.1 mrg ASM_OPERANDS_LABEL (body, i) = gen_rtx_LABEL_REF (Pmode, r); 3568 1.1 mrg } 3569 1.1 mrg } 3570 1.1 mrg 3571 1.1 mrg /* Now, for each output, construct an rtx 3572 1.1 mrg (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER 3573 1.1 mrg ARGVEC CONSTRAINTS OPNAMES)) 3574 1.1 mrg If there is more than one, put them inside a PARALLEL. */ 3575 1.1 mrg 3576 1.5 mrg if (noutputs == 0 && nuses == 0 && nclobbers == 0) 3577 1.1 mrg { 3578 1.1 mrg /* No output operands: put in a raw ASM_OPERANDS rtx. */ 3579 1.1 mrg if (nlabels > 0) 3580 1.1 mrg emit_jump_insn (body); 3581 1.1 mrg else 3582 1.1 mrg emit_insn (body); 3583 1.1 mrg } 3584 1.5 mrg else if (noutputs == 1 && nuses == 0 && nclobbers == 0) 3585 1.1 mrg { 3586 1.1 mrg ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0]; 3587 1.1 mrg if (nlabels > 0) 3588 1.1 mrg emit_jump_insn (gen_rtx_SET (output_rvec[0], body)); 3589 1.1 mrg else 3590 1.1 mrg emit_insn (gen_rtx_SET (output_rvec[0], body)); 3591 1.1 mrg } 3592 1.1 mrg else 3593 1.1 mrg { 3594 1.1 mrg rtx obody = body; 3595 1.1 mrg int num = noutputs; 3596 1.1 mrg 3597 1.1 mrg if (num == 0) 3598 1.1 mrg num = 1; 3599 1.1 mrg 3600 1.5 mrg body = gen_rtx_PARALLEL (VOIDmode, 3601 1.5 mrg rtvec_alloc (num + nuses + nclobbers)); 3602 1.1 mrg 3603 1.1 mrg /* For each output operand, store a SET. */ 3604 1.1 mrg for (i = 0; i < noutputs; ++i) 3605 1.1 mrg { 3606 1.1 mrg rtx src, o = output_rvec[i]; 3607 1.1 mrg if (i == 0) 3608 1.1 mrg { 3609 1.1 mrg ASM_OPERANDS_OUTPUT_CONSTRAINT (obody) = constraints[0]; 3610 1.1 mrg src = obody; 3611 1.1 mrg } 3612 1.1 mrg else 3613 1.1 mrg { 3614 1.1 mrg src = gen_rtx_ASM_OPERANDS (GET_MODE (o), 3615 1.1 mrg ASM_OPERANDS_TEMPLATE (obody), 3616 1.1 mrg constraints[i], i, argvec, 3617 1.1 mrg constraintvec, labelvec, locus); 3618 1.1 mrg MEM_VOLATILE_P (src) = gimple_asm_volatile_p (stmt); 3619 1.1 mrg } 3620 1.1 mrg XVECEXP (body, 0, i) = gen_rtx_SET (o, src); 3621 1.1 mrg } 3622 1.1 mrg 3623 1.1 mrg /* If there are no outputs (but there are some clobbers) 3624 1.1 mrg store the bare ASM_OPERANDS into the PARALLEL. */ 3625 1.1 mrg if (i == 0) 3626 1.1 mrg XVECEXP (body, 0, i++) = obody; 3627 1.1 mrg 3628 1.5 mrg /* Add the uses specified by the target hook. No checking should 3629 1.5 mrg be needed since this doesn't come directly from user code. */ 3630 1.5 mrg for (rtx use : use_rvec) 3631 1.5 mrg XVECEXP (body, 0, i++) = gen_rtx_USE (VOIDmode, use); 3632 1.5 mrg 3633 1.1 mrg /* Store (clobber REG) for each clobbered register specified. */ 3634 1.1 mrg for (unsigned j = 0; j < nclobbers; ++j) 3635 1.1 mrg { 3636 1.1 mrg rtx clobbered_reg = clobber_rvec[j]; 3637 1.1 mrg 3638 1.1 mrg /* Do sanity check for overlap between clobbers and respectively 3639 1.1 mrg input and outputs that hasn't been handled. Such overlap 3640 1.1 mrg should have been detected and reported above. */ 3641 1.1 mrg if (!clobber_conflict_found && REG_P (clobbered_reg)) 3642 1.1 mrg { 3643 1.1 mrg /* We test the old body (obody) contents to avoid 3644 1.1 mrg tripping over the under-construction body. */ 3645 1.1 mrg for (unsigned k = 0; k < noutputs; ++k) 3646 1.1 mrg if (reg_overlap_mentioned_p (clobbered_reg, output_rvec[k])) 3647 1.1 mrg internal_error ("%<asm%> clobber conflict with " 3648 1.1 mrg "output operand"); 3649 1.1 mrg 3650 1.1 mrg for (unsigned k = 0; k < ninputs - ninout; ++k) 3651 1.1 mrg if (reg_overlap_mentioned_p (clobbered_reg, input_rvec[k])) 3652 1.1 mrg internal_error ("%<asm%> clobber conflict with " 3653 1.1 mrg "input operand"); 3654 1.1 mrg } 3655 1.1 mrg 3656 1.1 mrg XVECEXP (body, 0, i++) = gen_rtx_CLOBBER (VOIDmode, clobbered_reg); 3657 1.1 mrg } 3658 1.1 mrg 3659 1.1 mrg if (nlabels > 0) 3660 1.1 mrg emit_jump_insn (body); 3661 1.1 mrg else 3662 1.1 mrg emit_insn (body); 3663 1.1 mrg } 3664 1.1 mrg 3665 1.1 mrg generating_concat_p = old_generating_concat_p; 3666 1.1 mrg 3667 1.1 mrg if (fallthru_label) 3668 1.1 mrg emit_label (fallthru_label); 3669 1.1 mrg 3670 1.1 mrg if (after_md_seq) 3671 1.1 mrg emit_insn (after_md_seq); 3672 1.1 mrg if (after_rtl_seq) 3673 1.1 mrg { 3674 1.1 mrg if (nlabels == 0) 3675 1.1 mrg emit_insn (after_rtl_seq); 3676 1.1 mrg else 3677 1.1 mrg { 3678 1.1 mrg edge e; 3679 1.1 mrg edge_iterator ei; 3680 1.5 mrg unsigned int cnt = EDGE_COUNT (gimple_bb (stmt)->succs); 3681 1.5 mrg 3682 1.1 mrg FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs) 3683 1.1 mrg { 3684 1.5 mrg rtx_insn *copy; 3685 1.5 mrg if (--cnt == 0) 3686 1.5 mrg copy = after_rtl_seq; 3687 1.5 mrg else 3688 1.5 mrg { 3689 1.5 mrg start_sequence (); 3690 1.5 mrg duplicate_insn_chain (after_rtl_seq, after_rtl_end, 3691 1.5 mrg NULL, NULL); 3692 1.5 mrg copy = get_insns (); 3693 1.5 mrg end_sequence (); 3694 1.5 mrg } 3695 1.3 mrg prepend_insn_to_edge (copy, e); 3696 1.1 mrg } 3697 1.1 mrg } 3698 1.1 mrg } 3699 1.1 mrg 3700 1.1 mrg free_temp_slots (); 3701 1.1 mrg crtl->has_asm_statement = 1; 3702 1.1 mrg } 3703 1.1 mrg 3704 1.1 mrg /* Emit code to jump to the address 3705 1.1 mrg specified by the pointer expression EXP. */ 3706 1.1 mrg 3707 1.1 mrg static void 3708 1.1 mrg expand_computed_goto (tree exp) 3709 1.1 mrg { 3710 1.1 mrg rtx x = expand_normal (exp); 3711 1.1 mrg 3712 1.1 mrg do_pending_stack_adjust (); 3713 1.1 mrg emit_indirect_jump (x); 3714 1.1 mrg } 3715 1.1 mrg 3716 1.1 mrg /* Generate RTL code for a `goto' statement with target label LABEL. 3717 1.1 mrg LABEL should be a LABEL_DECL tree node that was or will later be 3718 1.1 mrg defined with `expand_label'. */ 3719 1.1 mrg 3720 1.1 mrg static void 3721 1.1 mrg expand_goto (tree label) 3722 1.1 mrg { 3723 1.1 mrg if (flag_checking) 3724 1.1 mrg { 3725 1.1 mrg /* Check for a nonlocal goto to a containing function. Should have 3726 1.1 mrg gotten translated to __builtin_nonlocal_goto. */ 3727 1.1 mrg tree context = decl_function_context (label); 3728 1.1 mrg gcc_assert (!context || context == current_function_decl); 3729 1.1 mrg } 3730 1.1 mrg 3731 1.1 mrg emit_jump (jump_target_rtx (label)); 3732 1.1 mrg } 3733 1.1 mrg 3734 1.1 mrg /* Output a return with no value. */ 3735 1.1 mrg 3736 1.1 mrg static void 3737 1.1 mrg expand_null_return_1 (void) 3738 1.1 mrg { 3739 1.1 mrg clear_pending_stack_adjust (); 3740 1.1 mrg do_pending_stack_adjust (); 3741 1.1 mrg emit_jump (return_label); 3742 1.1 mrg } 3743 1.1 mrg 3744 1.1 mrg /* Generate RTL to return from the current function, with no value. 3745 1.1 mrg (That is, we do not do anything about returning any value.) */ 3746 1.1 mrg 3747 1.1 mrg void 3748 1.1 mrg expand_null_return (void) 3749 1.1 mrg { 3750 1.1 mrg /* If this function was declared to return a value, but we 3751 1.1 mrg didn't, clobber the return registers so that they are not 3752 1.1 mrg propagated live to the rest of the function. */ 3753 1.1 mrg clobber_return_register (); 3754 1.1 mrg 3755 1.1 mrg expand_null_return_1 (); 3756 1.1 mrg } 3757 1.1 mrg 3758 1.1 mrg /* Generate RTL to return from the current function, with value VAL. */ 3759 1.1 mrg 3760 1.1 mrg static void 3761 1.1 mrg expand_value_return (rtx val) 3762 1.1 mrg { 3763 1.1 mrg /* Copy the value to the return location unless it's already there. */ 3764 1.1 mrg 3765 1.1 mrg tree decl = DECL_RESULT (current_function_decl); 3766 1.1 mrg rtx return_reg = DECL_RTL (decl); 3767 1.1 mrg if (return_reg != val) 3768 1.1 mrg { 3769 1.1 mrg tree funtype = TREE_TYPE (current_function_decl); 3770 1.1 mrg tree type = TREE_TYPE (decl); 3771 1.1 mrg int unsignedp = TYPE_UNSIGNED (type); 3772 1.1 mrg machine_mode old_mode = DECL_MODE (decl); 3773 1.1 mrg machine_mode mode; 3774 1.1 mrg if (DECL_BY_REFERENCE (decl)) 3775 1.1 mrg mode = promote_function_mode (type, old_mode, &unsignedp, funtype, 2); 3776 1.1 mrg else 3777 1.1 mrg mode = promote_function_mode (type, old_mode, &unsignedp, funtype, 1); 3778 1.1 mrg 3779 1.1 mrg if (mode != old_mode) 3780 1.5 mrg { 3781 1.5 mrg /* Some ABIs require scalar floating point modes to be returned 3782 1.5 mrg in a wider scalar integer mode. We need to explicitly 3783 1.5 mrg reinterpret to an integer mode of the correct precision 3784 1.5 mrg before extending to the desired result. */ 3785 1.5 mrg if (SCALAR_INT_MODE_P (mode) 3786 1.5 mrg && SCALAR_FLOAT_MODE_P (old_mode) 3787 1.5 mrg && known_gt (GET_MODE_SIZE (mode), GET_MODE_SIZE (old_mode))) 3788 1.5 mrg val = convert_float_to_wider_int (mode, old_mode, val); 3789 1.5 mrg else 3790 1.5 mrg val = convert_modes (mode, old_mode, val, unsignedp); 3791 1.5 mrg } 3792 1.1 mrg 3793 1.1 mrg if (GET_CODE (return_reg) == PARALLEL) 3794 1.1 mrg emit_group_load (return_reg, val, type, int_size_in_bytes (type)); 3795 1.1 mrg else 3796 1.1 mrg emit_move_insn (return_reg, val); 3797 1.1 mrg } 3798 1.1 mrg 3799 1.1 mrg expand_null_return_1 (); 3800 1.1 mrg } 3801 1.1 mrg 3802 1.1 mrg /* Generate RTL to evaluate the expression RETVAL and return it 3803 1.1 mrg from the current function. */ 3804 1.1 mrg 3805 1.1 mrg static void 3806 1.1 mrg expand_return (tree retval) 3807 1.1 mrg { 3808 1.1 mrg rtx result_rtl; 3809 1.1 mrg rtx val = 0; 3810 1.1 mrg tree retval_rhs; 3811 1.1 mrg 3812 1.1 mrg /* If function wants no value, give it none. */ 3813 1.5 mrg if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl)))) 3814 1.1 mrg { 3815 1.1 mrg expand_normal (retval); 3816 1.1 mrg expand_null_return (); 3817 1.1 mrg return; 3818 1.1 mrg } 3819 1.1 mrg 3820 1.1 mrg if (retval == error_mark_node) 3821 1.1 mrg { 3822 1.1 mrg /* Treat this like a return of no value from a function that 3823 1.1 mrg returns a value. */ 3824 1.1 mrg expand_null_return (); 3825 1.1 mrg return; 3826 1.1 mrg } 3827 1.1 mrg else if ((TREE_CODE (retval) == MODIFY_EXPR 3828 1.1 mrg || TREE_CODE (retval) == INIT_EXPR) 3829 1.1 mrg && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL) 3830 1.1 mrg retval_rhs = TREE_OPERAND (retval, 1); 3831 1.1 mrg else 3832 1.1 mrg retval_rhs = retval; 3833 1.1 mrg 3834 1.1 mrg result_rtl = DECL_RTL (DECL_RESULT (current_function_decl)); 3835 1.1 mrg 3836 1.1 mrg /* If we are returning the RESULT_DECL, then the value has already 3837 1.1 mrg been stored into it, so we don't have to do anything special. */ 3838 1.1 mrg if (TREE_CODE (retval_rhs) == RESULT_DECL) 3839 1.1 mrg expand_value_return (result_rtl); 3840 1.1 mrg 3841 1.1 mrg /* If the result is an aggregate that is being returned in one (or more) 3842 1.1 mrg registers, load the registers here. */ 3843 1.1 mrg 3844 1.1 mrg else if (retval_rhs != 0 3845 1.1 mrg && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode 3846 1.1 mrg && REG_P (result_rtl)) 3847 1.1 mrg { 3848 1.1 mrg val = copy_blkmode_to_reg (GET_MODE (result_rtl), retval_rhs); 3849 1.1 mrg if (val) 3850 1.1 mrg { 3851 1.1 mrg /* Use the mode of the result value on the return register. */ 3852 1.1 mrg PUT_MODE (result_rtl, GET_MODE (val)); 3853 1.1 mrg expand_value_return (val); 3854 1.1 mrg } 3855 1.1 mrg else 3856 1.1 mrg expand_null_return (); 3857 1.1 mrg } 3858 1.1 mrg else if (retval_rhs != 0 3859 1.1 mrg && !VOID_TYPE_P (TREE_TYPE (retval_rhs)) 3860 1.1 mrg && (REG_P (result_rtl) 3861 1.1 mrg || (GET_CODE (result_rtl) == PARALLEL))) 3862 1.1 mrg { 3863 1.1 mrg /* Compute the return value into a temporary (usually a pseudo reg). */ 3864 1.1 mrg val 3865 1.1 mrg = assign_temp (TREE_TYPE (DECL_RESULT (current_function_decl)), 0, 1); 3866 1.1 mrg val = expand_expr (retval_rhs, val, GET_MODE (val), EXPAND_NORMAL); 3867 1.1 mrg val = force_not_mem (val); 3868 1.1 mrg expand_value_return (val); 3869 1.1 mrg } 3870 1.1 mrg else 3871 1.1 mrg { 3872 1.1 mrg /* No hard reg used; calculate value into hard return reg. */ 3873 1.1 mrg expand_expr (retval, const0_rtx, VOIDmode, EXPAND_NORMAL); 3874 1.1 mrg expand_value_return (result_rtl); 3875 1.1 mrg } 3876 1.1 mrg } 3877 1.1 mrg 3878 1.1 mrg /* Expand a clobber of LHS. If LHS is stored it in a multi-part 3879 1.1 mrg register, tell the rtl optimizers that its value is no longer 3880 1.1 mrg needed. */ 3881 1.1 mrg 3882 1.1 mrg static void 3883 1.1 mrg expand_clobber (tree lhs) 3884 1.1 mrg { 3885 1.1 mrg if (DECL_P (lhs)) 3886 1.1 mrg { 3887 1.1 mrg rtx decl_rtl = DECL_RTL_IF_SET (lhs); 3888 1.1 mrg if (decl_rtl && REG_P (decl_rtl)) 3889 1.1 mrg { 3890 1.1 mrg machine_mode decl_mode = GET_MODE (decl_rtl); 3891 1.1 mrg if (maybe_gt (GET_MODE_SIZE (decl_mode), 3892 1.1 mrg REGMODE_NATURAL_SIZE (decl_mode))) 3893 1.1 mrg emit_clobber (decl_rtl); 3894 1.1 mrg } 3895 1.1 mrg } 3896 1.1 mrg } 3897 1.1 mrg 3898 1.1 mrg /* A subroutine of expand_gimple_stmt, expanding one gimple statement 3899 1.1 mrg STMT that doesn't require special handling for outgoing edges. That 3900 1.1 mrg is no tailcalls and no GIMPLE_COND. */ 3901 1.1 mrg 3902 1.1 mrg static void 3903 1.1 mrg expand_gimple_stmt_1 (gimple *stmt) 3904 1.1 mrg { 3905 1.1 mrg tree op0; 3906 1.1 mrg 3907 1.1 mrg set_curr_insn_location (gimple_location (stmt)); 3908 1.1 mrg 3909 1.1 mrg switch (gimple_code (stmt)) 3910 1.1 mrg { 3911 1.1 mrg case GIMPLE_GOTO: 3912 1.1 mrg op0 = gimple_goto_dest (stmt); 3913 1.1 mrg if (TREE_CODE (op0) == LABEL_DECL) 3914 1.1 mrg expand_goto (op0); 3915 1.1 mrg else 3916 1.1 mrg expand_computed_goto (op0); 3917 1.1 mrg break; 3918 1.1 mrg case GIMPLE_LABEL: 3919 1.1 mrg expand_label (gimple_label_label (as_a <glabel *> (stmt))); 3920 1.1 mrg break; 3921 1.1 mrg case GIMPLE_NOP: 3922 1.1 mrg case GIMPLE_PREDICT: 3923 1.1 mrg break; 3924 1.1 mrg case GIMPLE_SWITCH: 3925 1.1 mrg { 3926 1.1 mrg gswitch *swtch = as_a <gswitch *> (stmt); 3927 1.1 mrg if (gimple_switch_num_labels (swtch) == 1) 3928 1.1 mrg expand_goto (CASE_LABEL (gimple_switch_default_label (swtch))); 3929 1.1 mrg else 3930 1.1 mrg expand_case (swtch); 3931 1.1 mrg } 3932 1.1 mrg break; 3933 1.1 mrg case GIMPLE_ASM: 3934 1.1 mrg expand_asm_stmt (as_a <gasm *> (stmt)); 3935 1.1 mrg break; 3936 1.1 mrg case GIMPLE_CALL: 3937 1.1 mrg expand_call_stmt (as_a <gcall *> (stmt)); 3938 1.1 mrg break; 3939 1.1 mrg 3940 1.1 mrg case GIMPLE_RETURN: 3941 1.1 mrg { 3942 1.1 mrg op0 = gimple_return_retval (as_a <greturn *> (stmt)); 3943 1.1 mrg 3944 1.1 mrg /* If a return doesn't have a location, it very likely represents 3945 1.1 mrg multiple user returns so we cannot let it inherit the location 3946 1.1 mrg of the last statement of the previous basic block in RTL. */ 3947 1.1 mrg if (!gimple_has_location (stmt)) 3948 1.1 mrg set_curr_insn_location (cfun->function_end_locus); 3949 1.1 mrg 3950 1.1 mrg if (op0 && op0 != error_mark_node) 3951 1.1 mrg { 3952 1.1 mrg tree result = DECL_RESULT (current_function_decl); 3953 1.1 mrg 3954 1.1 mrg /* If we are not returning the current function's RESULT_DECL, 3955 1.1 mrg build an assignment to it. */ 3956 1.1 mrg if (op0 != result) 3957 1.1 mrg { 3958 1.1 mrg /* I believe that a function's RESULT_DECL is unique. */ 3959 1.1 mrg gcc_assert (TREE_CODE (op0) != RESULT_DECL); 3960 1.1 mrg 3961 1.1 mrg /* ??? We'd like to use simply expand_assignment here, 3962 1.1 mrg but this fails if the value is of BLKmode but the return 3963 1.1 mrg decl is a register. expand_return has special handling 3964 1.1 mrg for this combination, which eventually should move 3965 1.1 mrg to common code. See comments there. Until then, let's 3966 1.1 mrg build a modify expression :-/ */ 3967 1.1 mrg op0 = build2 (MODIFY_EXPR, TREE_TYPE (result), 3968 1.1 mrg result, op0); 3969 1.1 mrg } 3970 1.1 mrg } 3971 1.1 mrg 3972 1.1 mrg if (!op0) 3973 1.1 mrg expand_null_return (); 3974 1.1 mrg else 3975 1.1 mrg expand_return (op0); 3976 1.1 mrg } 3977 1.1 mrg break; 3978 1.1 mrg 3979 1.1 mrg case GIMPLE_ASSIGN: 3980 1.1 mrg { 3981 1.1 mrg gassign *assign_stmt = as_a <gassign *> (stmt); 3982 1.1 mrg tree lhs = gimple_assign_lhs (assign_stmt); 3983 1.1 mrg 3984 1.1 mrg /* Tree expand used to fiddle with |= and &= of two bitfield 3985 1.1 mrg COMPONENT_REFs here. This can't happen with gimple, the LHS 3986 1.1 mrg of binary assigns must be a gimple reg. */ 3987 1.1 mrg 3988 1.1 mrg if (TREE_CODE (lhs) != SSA_NAME 3989 1.1 mrg || gimple_assign_rhs_class (assign_stmt) == GIMPLE_SINGLE_RHS) 3990 1.1 mrg { 3991 1.1 mrg tree rhs = gimple_assign_rhs1 (assign_stmt); 3992 1.1 mrg gcc_assert (gimple_assign_rhs_class (assign_stmt) 3993 1.1 mrg == GIMPLE_SINGLE_RHS); 3994 1.1 mrg if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs) 3995 1.1 mrg /* Do not put locations on possibly shared trees. */ 3996 1.1 mrg && !is_gimple_min_invariant (rhs)) 3997 1.1 mrg SET_EXPR_LOCATION (rhs, gimple_location (stmt)); 3998 1.1 mrg if (TREE_CLOBBER_P (rhs)) 3999 1.1 mrg /* This is a clobber to mark the going out of scope for 4000 1.1 mrg this LHS. */ 4001 1.1 mrg expand_clobber (lhs); 4002 1.1 mrg else 4003 1.1 mrg expand_assignment (lhs, rhs, 4004 1.1 mrg gimple_assign_nontemporal_move_p ( 4005 1.1 mrg assign_stmt)); 4006 1.1 mrg } 4007 1.1 mrg else 4008 1.1 mrg { 4009 1.1 mrg rtx target, temp; 4010 1.1 mrg bool nontemporal = gimple_assign_nontemporal_move_p (assign_stmt); 4011 1.1 mrg bool promoted = false; 4012 1.1 mrg 4013 1.1 mrg target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); 4014 1.1 mrg if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target)) 4015 1.1 mrg promoted = true; 4016 1.1 mrg 4017 1.5 mrg /* If we want to use a nontemporal store, force the value to 4018 1.5 mrg register first. If we store into a promoted register, 4019 1.5 mrg don't directly expand to target. */ 4020 1.1 mrg temp = nontemporal || promoted ? NULL_RTX : target; 4021 1.5 mrg temp = expand_expr_real_gassign (assign_stmt, temp, 4022 1.5 mrg GET_MODE (target), EXPAND_NORMAL); 4023 1.1 mrg 4024 1.1 mrg if (temp == target) 4025 1.1 mrg ; 4026 1.1 mrg else if (promoted) 4027 1.1 mrg { 4028 1.1 mrg int unsignedp = SUBREG_PROMOTED_SIGN (target); 4029 1.1 mrg /* If TEMP is a VOIDmode constant, use convert_modes to make 4030 1.1 mrg sure that we properly convert it. */ 4031 1.1 mrg if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode) 4032 1.1 mrg { 4033 1.1 mrg temp = convert_modes (GET_MODE (target), 4034 1.5 mrg TYPE_MODE (TREE_TYPE (lhs)), 4035 1.1 mrg temp, unsignedp); 4036 1.1 mrg temp = convert_modes (GET_MODE (SUBREG_REG (target)), 4037 1.1 mrg GET_MODE (target), temp, unsignedp); 4038 1.1 mrg } 4039 1.1 mrg 4040 1.1 mrg convert_move (SUBREG_REG (target), temp, unsignedp); 4041 1.1 mrg } 4042 1.1 mrg else if (nontemporal && emit_storent_insn (target, temp)) 4043 1.1 mrg ; 4044 1.1 mrg else 4045 1.1 mrg { 4046 1.1 mrg temp = force_operand (temp, target); 4047 1.5 mrg if (temp == target) 4048 1.5 mrg ; 4049 1.5 mrg else if (GET_MODE (target) != BLKmode) 4050 1.1 mrg emit_move_insn (target, temp); 4051 1.5 mrg else 4052 1.5 mrg emit_block_move (target, temp, expr_size (lhs), 4053 1.5 mrg BLOCK_OP_NORMAL); 4054 1.1 mrg } 4055 1.1 mrg } 4056 1.1 mrg } 4057 1.1 mrg break; 4058 1.1 mrg 4059 1.1 mrg default: 4060 1.1 mrg gcc_unreachable (); 4061 1.1 mrg } 4062 1.1 mrg } 4063 1.1 mrg 4064 1.1 mrg /* Expand one gimple statement STMT and return the last RTL instruction 4065 1.1 mrg before any of the newly generated ones. 4066 1.1 mrg 4067 1.1 mrg In addition to generating the necessary RTL instructions this also 4068 1.1 mrg sets REG_EH_REGION notes if necessary and sets the current source 4069 1.1 mrg location for diagnostics. */ 4070 1.1 mrg 4071 1.1 mrg static rtx_insn * 4072 1.1 mrg expand_gimple_stmt (gimple *stmt) 4073 1.1 mrg { 4074 1.1 mrg location_t saved_location = input_location; 4075 1.1 mrg rtx_insn *last = get_last_insn (); 4076 1.1 mrg int lp_nr; 4077 1.1 mrg 4078 1.1 mrg gcc_assert (cfun); 4079 1.1 mrg 4080 1.1 mrg /* We need to save and restore the current source location so that errors 4081 1.1 mrg discovered during expansion are emitted with the right location. But 4082 1.1 mrg it would be better if the diagnostic routines used the source location 4083 1.1 mrg embedded in the tree nodes rather than globals. */ 4084 1.1 mrg if (gimple_has_location (stmt)) 4085 1.1 mrg input_location = gimple_location (stmt); 4086 1.1 mrg 4087 1.1 mrg expand_gimple_stmt_1 (stmt); 4088 1.1 mrg 4089 1.1 mrg /* Free any temporaries used to evaluate this statement. */ 4090 1.1 mrg free_temp_slots (); 4091 1.1 mrg 4092 1.1 mrg input_location = saved_location; 4093 1.1 mrg 4094 1.1 mrg /* Mark all insns that may trap. */ 4095 1.1 mrg lp_nr = lookup_stmt_eh_lp (stmt); 4096 1.1 mrg if (lp_nr) 4097 1.1 mrg { 4098 1.1 mrg rtx_insn *insn; 4099 1.1 mrg for (insn = next_real_insn (last); insn; 4100 1.1 mrg insn = next_real_insn (insn)) 4101 1.1 mrg { 4102 1.1 mrg if (! find_reg_note (insn, REG_EH_REGION, NULL_RTX) 4103 1.1 mrg /* If we want exceptions for non-call insns, any 4104 1.1 mrg may_trap_p instruction may throw. */ 4105 1.1 mrg && GET_CODE (PATTERN (insn)) != CLOBBER 4106 1.1 mrg && GET_CODE (PATTERN (insn)) != USE 4107 1.1 mrg && insn_could_throw_p (insn)) 4108 1.1 mrg make_reg_eh_region_note (insn, 0, lp_nr); 4109 1.1 mrg } 4110 1.1 mrg } 4111 1.1 mrg 4112 1.1 mrg return last; 4113 1.1 mrg } 4114 1.1 mrg 4115 1.1 mrg /* A subroutine of expand_gimple_basic_block. Expand one GIMPLE_CALL 4116 1.1 mrg that has CALL_EXPR_TAILCALL set. Returns non-null if we actually 4117 1.1 mrg generated a tail call (something that might be denied by the ABI 4118 1.1 mrg rules governing the call; see calls.cc). 4119 1.1 mrg 4120 1.1 mrg Sets CAN_FALLTHRU if we generated a *conditional* tail call, and 4121 1.1 mrg can still reach the rest of BB. The case here is __builtin_sqrt, 4122 1.1 mrg where the NaN result goes through the external function (with a 4123 1.1 mrg tailcall) and the normal result happens via a sqrt instruction. */ 4124 1.1 mrg 4125 1.1 mrg static basic_block 4126 1.1 mrg expand_gimple_tailcall (basic_block bb, gcall *stmt, bool *can_fallthru) 4127 1.1 mrg { 4128 1.1 mrg rtx_insn *last2, *last; 4129 1.1 mrg edge e; 4130 1.1 mrg edge_iterator ei; 4131 1.1 mrg profile_probability probability; 4132 1.1 mrg 4133 1.1 mrg last2 = last = expand_gimple_stmt (stmt); 4134 1.1 mrg 4135 1.1 mrg for (last = NEXT_INSN (last); last; last = NEXT_INSN (last)) 4136 1.1 mrg if (CALL_P (last) && SIBLING_CALL_P (last)) 4137 1.1 mrg goto found; 4138 1.1 mrg 4139 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last2); 4140 1.1 mrg 4141 1.1 mrg *can_fallthru = true; 4142 1.1 mrg return NULL; 4143 1.1 mrg 4144 1.1 mrg found: 4145 1.1 mrg /* ??? Wouldn't it be better to just reset any pending stack adjust? 4146 1.1 mrg Any instructions emitted here are about to be deleted. */ 4147 1.1 mrg do_pending_stack_adjust (); 4148 1.1 mrg 4149 1.1 mrg /* Remove any non-eh, non-abnormal edges that don't go to exit. */ 4150 1.1 mrg /* ??? I.e. the fallthrough edge. HOWEVER! If there were to be 4151 1.1 mrg EH or abnormal edges, we shouldn't have created a tail call in 4152 1.1 mrg the first place. So it seems to me we should just be removing 4153 1.1 mrg all edges here, or redirecting the existing fallthru edge to 4154 1.1 mrg the exit block. */ 4155 1.1 mrg 4156 1.1 mrg probability = profile_probability::never (); 4157 1.1 mrg 4158 1.1 mrg for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 4159 1.1 mrg { 4160 1.1 mrg if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH))) 4161 1.1 mrg { 4162 1.1 mrg if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)) 4163 1.1 mrg e->dest->count -= e->count (); 4164 1.1 mrg probability += e->probability; 4165 1.1 mrg remove_edge (e); 4166 1.1 mrg } 4167 1.1 mrg else 4168 1.1 mrg ei_next (&ei); 4169 1.1 mrg } 4170 1.1 mrg 4171 1.1 mrg /* This is somewhat ugly: the call_expr expander often emits instructions 4172 1.1 mrg after the sibcall (to perform the function return). These confuse the 4173 1.1 mrg find_many_sub_basic_blocks code, so we need to get rid of these. */ 4174 1.1 mrg last = NEXT_INSN (last); 4175 1.1 mrg gcc_assert (BARRIER_P (last)); 4176 1.1 mrg 4177 1.1 mrg *can_fallthru = false; 4178 1.1 mrg while (NEXT_INSN (last)) 4179 1.1 mrg { 4180 1.1 mrg /* For instance an sqrt builtin expander expands if with 4181 1.1 mrg sibcall in the then and label for `else`. */ 4182 1.1 mrg if (LABEL_P (NEXT_INSN (last))) 4183 1.1 mrg { 4184 1.1 mrg *can_fallthru = true; 4185 1.1 mrg break; 4186 1.1 mrg } 4187 1.1 mrg delete_insn (NEXT_INSN (last)); 4188 1.1 mrg } 4189 1.1 mrg 4190 1.1 mrg e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_ABNORMAL 4191 1.1 mrg | EDGE_SIBCALL); 4192 1.1 mrg e->probability = probability; 4193 1.1 mrg BB_END (bb) = last; 4194 1.1 mrg update_bb_for_insn (bb); 4195 1.1 mrg 4196 1.1 mrg if (NEXT_INSN (last)) 4197 1.1 mrg { 4198 1.1 mrg bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb); 4199 1.1 mrg 4200 1.1 mrg last = BB_END (bb); 4201 1.1 mrg if (BARRIER_P (last)) 4202 1.1 mrg BB_END (bb) = PREV_INSN (last); 4203 1.1 mrg } 4204 1.1 mrg 4205 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last2); 4206 1.1 mrg 4207 1.1 mrg return bb; 4208 1.1 mrg } 4209 1.1 mrg 4210 1.1 mrg /* Return the difference between the floor and the truncated result of 4211 1.1 mrg a signed division by OP1 with remainder MOD. */ 4212 1.1 mrg static rtx 4213 1.1 mrg floor_sdiv_adjust (machine_mode mode, rtx mod, rtx op1) 4214 1.1 mrg { 4215 1.1 mrg /* (mod != 0 ? (op1 / mod < 0 ? -1 : 0) : 0) */ 4216 1.1 mrg return gen_rtx_IF_THEN_ELSE 4217 1.1 mrg (mode, gen_rtx_NE (BImode, mod, const0_rtx), 4218 1.1 mrg gen_rtx_IF_THEN_ELSE 4219 1.1 mrg (mode, gen_rtx_LT (BImode, 4220 1.1 mrg gen_rtx_DIV (mode, op1, mod), 4221 1.1 mrg const0_rtx), 4222 1.1 mrg constm1_rtx, const0_rtx), 4223 1.1 mrg const0_rtx); 4224 1.1 mrg } 4225 1.1 mrg 4226 1.1 mrg /* Return the difference between the ceil and the truncated result of 4227 1.1 mrg a signed division by OP1 with remainder MOD. */ 4228 1.1 mrg static rtx 4229 1.1 mrg ceil_sdiv_adjust (machine_mode mode, rtx mod, rtx op1) 4230 1.1 mrg { 4231 1.1 mrg /* (mod != 0 ? (op1 / mod > 0 ? 1 : 0) : 0) */ 4232 1.1 mrg return gen_rtx_IF_THEN_ELSE 4233 1.1 mrg (mode, gen_rtx_NE (BImode, mod, const0_rtx), 4234 1.1 mrg gen_rtx_IF_THEN_ELSE 4235 1.1 mrg (mode, gen_rtx_GT (BImode, 4236 1.1 mrg gen_rtx_DIV (mode, op1, mod), 4237 1.1 mrg const0_rtx), 4238 1.1 mrg const1_rtx, const0_rtx), 4239 1.1 mrg const0_rtx); 4240 1.1 mrg } 4241 1.1 mrg 4242 1.1 mrg /* Return the difference between the ceil and the truncated result of 4243 1.1 mrg an unsigned division by OP1 with remainder MOD. */ 4244 1.1 mrg static rtx 4245 1.1 mrg ceil_udiv_adjust (machine_mode mode, rtx mod, rtx op1 ATTRIBUTE_UNUSED) 4246 1.1 mrg { 4247 1.1 mrg /* (mod != 0 ? 1 : 0) */ 4248 1.1 mrg return gen_rtx_IF_THEN_ELSE 4249 1.1 mrg (mode, gen_rtx_NE (BImode, mod, const0_rtx), 4250 1.1 mrg const1_rtx, const0_rtx); 4251 1.1 mrg } 4252 1.1 mrg 4253 1.1 mrg /* Return the difference between the rounded and the truncated result 4254 1.1 mrg of a signed division by OP1 with remainder MOD. Halfway cases are 4255 1.1 mrg rounded away from zero, rather than to the nearest even number. */ 4256 1.1 mrg static rtx 4257 1.1 mrg round_sdiv_adjust (machine_mode mode, rtx mod, rtx op1) 4258 1.1 mrg { 4259 1.1 mrg /* (abs (mod) >= abs (op1) - abs (mod) 4260 1.1 mrg ? (op1 / mod > 0 ? 1 : -1) 4261 1.1 mrg : 0) */ 4262 1.1 mrg return gen_rtx_IF_THEN_ELSE 4263 1.1 mrg (mode, gen_rtx_GE (BImode, gen_rtx_ABS (mode, mod), 4264 1.1 mrg gen_rtx_MINUS (mode, 4265 1.1 mrg gen_rtx_ABS (mode, op1), 4266 1.1 mrg gen_rtx_ABS (mode, mod))), 4267 1.1 mrg gen_rtx_IF_THEN_ELSE 4268 1.1 mrg (mode, gen_rtx_GT (BImode, 4269 1.1 mrg gen_rtx_DIV (mode, op1, mod), 4270 1.1 mrg const0_rtx), 4271 1.1 mrg const1_rtx, constm1_rtx), 4272 1.1 mrg const0_rtx); 4273 1.1 mrg } 4274 1.1 mrg 4275 1.1 mrg /* Return the difference between the rounded and the truncated result 4276 1.1 mrg of a unsigned division by OP1 with remainder MOD. Halfway cases 4277 1.1 mrg are rounded away from zero, rather than to the nearest even 4278 1.1 mrg number. */ 4279 1.1 mrg static rtx 4280 1.1 mrg round_udiv_adjust (machine_mode mode, rtx mod, rtx op1) 4281 1.1 mrg { 4282 1.1 mrg /* (mod >= op1 - mod ? 1 : 0) */ 4283 1.1 mrg return gen_rtx_IF_THEN_ELSE 4284 1.1 mrg (mode, gen_rtx_GE (BImode, mod, 4285 1.1 mrg gen_rtx_MINUS (mode, op1, mod)), 4286 1.1 mrg const1_rtx, const0_rtx); 4287 1.1 mrg } 4288 1.1 mrg 4289 1.1 mrg /* Convert X to MODE, that must be Pmode or ptr_mode, without emitting 4290 1.1 mrg any rtl. */ 4291 1.1 mrg 4292 1.1 mrg static rtx 4293 1.1 mrg convert_debug_memory_address (scalar_int_mode mode, rtx x, 4294 1.1 mrg addr_space_t as) 4295 1.1 mrg { 4296 1.1 mrg #ifndef POINTERS_EXTEND_UNSIGNED 4297 1.1 mrg gcc_assert (mode == Pmode 4298 1.1 mrg || mode == targetm.addr_space.address_mode (as)); 4299 1.1 mrg gcc_assert (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode); 4300 1.1 mrg #else 4301 1.1 mrg rtx temp; 4302 1.1 mrg 4303 1.1 mrg gcc_assert (targetm.addr_space.valid_pointer_mode (mode, as)); 4304 1.1 mrg 4305 1.1 mrg if (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode) 4306 1.1 mrg return x; 4307 1.1 mrg 4308 1.1 mrg /* X must have some form of address mode already. */ 4309 1.1 mrg scalar_int_mode xmode = as_a <scalar_int_mode> (GET_MODE (x)); 4310 1.1 mrg if (GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (xmode)) 4311 1.1 mrg x = lowpart_subreg (mode, x, xmode); 4312 1.1 mrg else if (POINTERS_EXTEND_UNSIGNED > 0) 4313 1.1 mrg x = gen_rtx_ZERO_EXTEND (mode, x); 4314 1.1 mrg else if (!POINTERS_EXTEND_UNSIGNED) 4315 1.1 mrg x = gen_rtx_SIGN_EXTEND (mode, x); 4316 1.1 mrg else 4317 1.1 mrg { 4318 1.1 mrg switch (GET_CODE (x)) 4319 1.1 mrg { 4320 1.1 mrg case SUBREG: 4321 1.1 mrg if ((SUBREG_PROMOTED_VAR_P (x) 4322 1.1 mrg || (REG_P (SUBREG_REG (x)) && REG_POINTER (SUBREG_REG (x))) 4323 1.1 mrg || (GET_CODE (SUBREG_REG (x)) == PLUS 4324 1.1 mrg && REG_P (XEXP (SUBREG_REG (x), 0)) 4325 1.1 mrg && REG_POINTER (XEXP (SUBREG_REG (x), 0)) 4326 1.1 mrg && CONST_INT_P (XEXP (SUBREG_REG (x), 1)))) 4327 1.1 mrg && GET_MODE (SUBREG_REG (x)) == mode) 4328 1.1 mrg return SUBREG_REG (x); 4329 1.1 mrg break; 4330 1.1 mrg case LABEL_REF: 4331 1.1 mrg temp = gen_rtx_LABEL_REF (mode, label_ref_label (x)); 4332 1.1 mrg LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x); 4333 1.1 mrg return temp; 4334 1.1 mrg case SYMBOL_REF: 4335 1.1 mrg temp = shallow_copy_rtx (x); 4336 1.1 mrg PUT_MODE (temp, mode); 4337 1.1 mrg return temp; 4338 1.1 mrg case CONST: 4339 1.1 mrg temp = convert_debug_memory_address (mode, XEXP (x, 0), as); 4340 1.1 mrg if (temp) 4341 1.1 mrg temp = gen_rtx_CONST (mode, temp); 4342 1.1 mrg return temp; 4343 1.1 mrg case PLUS: 4344 1.1 mrg case MINUS: 4345 1.1 mrg if (CONST_INT_P (XEXP (x, 1))) 4346 1.1 mrg { 4347 1.1 mrg temp = convert_debug_memory_address (mode, XEXP (x, 0), as); 4348 1.1 mrg if (temp) 4349 1.1 mrg return gen_rtx_fmt_ee (GET_CODE (x), mode, temp, XEXP (x, 1)); 4350 1.1 mrg } 4351 1.1 mrg break; 4352 1.1 mrg default: 4353 1.1 mrg break; 4354 1.1 mrg } 4355 1.1 mrg /* Don't know how to express ptr_extend as operation in debug info. */ 4356 1.1 mrg return NULL; 4357 1.1 mrg } 4358 1.1 mrg #endif /* POINTERS_EXTEND_UNSIGNED */ 4359 1.1 mrg 4360 1.1 mrg return x; 4361 1.1 mrg } 4362 1.1 mrg 4363 1.1 mrg /* Map from SSA_NAMEs to corresponding DEBUG_EXPR_DECLs created 4364 1.1 mrg by avoid_deep_ter_for_debug. */ 4365 1.1 mrg 4366 1.1 mrg static hash_map<tree, tree> *deep_ter_debug_map; 4367 1.1 mrg 4368 1.1 mrg /* Split too deep TER chains for debug stmts using debug temporaries. */ 4369 1.1 mrg 4370 1.1 mrg static void 4371 1.1 mrg avoid_deep_ter_for_debug (gimple *stmt, int depth) 4372 1.1 mrg { 4373 1.1 mrg use_operand_p use_p; 4374 1.1 mrg ssa_op_iter iter; 4375 1.1 mrg FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) 4376 1.1 mrg { 4377 1.1 mrg tree use = USE_FROM_PTR (use_p); 4378 1.1 mrg if (TREE_CODE (use) != SSA_NAME || SSA_NAME_IS_DEFAULT_DEF (use)) 4379 1.1 mrg continue; 4380 1.1 mrg gimple *g = get_gimple_for_ssa_name (use); 4381 1.1 mrg if (g == NULL) 4382 1.1 mrg continue; 4383 1.1 mrg if (depth > 6 && !stmt_ends_bb_p (g)) 4384 1.1 mrg { 4385 1.1 mrg if (deep_ter_debug_map == NULL) 4386 1.1 mrg deep_ter_debug_map = new hash_map<tree, tree>; 4387 1.1 mrg 4388 1.1 mrg tree &vexpr = deep_ter_debug_map->get_or_insert (use); 4389 1.1 mrg if (vexpr != NULL) 4390 1.1 mrg continue; 4391 1.1 mrg vexpr = build_debug_expr_decl (TREE_TYPE (use)); 4392 1.1 mrg gimple *def_temp = gimple_build_debug_bind (vexpr, use, g); 4393 1.1 mrg gimple_stmt_iterator gsi = gsi_for_stmt (g); 4394 1.1 mrg gsi_insert_after (&gsi, def_temp, GSI_NEW_STMT); 4395 1.1 mrg avoid_deep_ter_for_debug (def_temp, 0); 4396 1.1 mrg } 4397 1.1 mrg else 4398 1.1 mrg avoid_deep_ter_for_debug (g, depth + 1); 4399 1.1 mrg } 4400 1.1 mrg } 4401 1.1 mrg 4402 1.1 mrg /* Return an RTX equivalent to the value of the parameter DECL. */ 4403 1.1 mrg 4404 1.1 mrg static rtx 4405 1.1 mrg expand_debug_parm_decl (tree decl) 4406 1.1 mrg { 4407 1.1 mrg rtx incoming = DECL_INCOMING_RTL (decl); 4408 1.1 mrg 4409 1.1 mrg if (incoming 4410 1.1 mrg && GET_MODE (incoming) != BLKmode 4411 1.1 mrg && ((REG_P (incoming) && HARD_REGISTER_P (incoming)) 4412 1.1 mrg || (MEM_P (incoming) 4413 1.1 mrg && REG_P (XEXP (incoming, 0)) 4414 1.1 mrg && HARD_REGISTER_P (XEXP (incoming, 0))))) 4415 1.1 mrg { 4416 1.1 mrg rtx rtl = gen_rtx_ENTRY_VALUE (GET_MODE (incoming)); 4417 1.1 mrg 4418 1.1 mrg #ifdef HAVE_window_save 4419 1.1 mrg /* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers. 4420 1.1 mrg If the target machine has an explicit window save instruction, the 4421 1.1 mrg actual entry value is the corresponding OUTGOING_REGNO instead. */ 4422 1.1 mrg if (REG_P (incoming) 4423 1.1 mrg && OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming)) 4424 1.1 mrg incoming 4425 1.1 mrg = gen_rtx_REG_offset (incoming, GET_MODE (incoming), 4426 1.1 mrg OUTGOING_REGNO (REGNO (incoming)), 0); 4427 1.1 mrg else if (MEM_P (incoming)) 4428 1.1 mrg { 4429 1.1 mrg rtx reg = XEXP (incoming, 0); 4430 1.1 mrg if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg)) 4431 1.1 mrg { 4432 1.1 mrg reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg))); 4433 1.1 mrg incoming = replace_equiv_address_nv (incoming, reg); 4434 1.1 mrg } 4435 1.1 mrg else 4436 1.1 mrg incoming = copy_rtx (incoming); 4437 1.1 mrg } 4438 1.1 mrg #endif 4439 1.1 mrg 4440 1.1 mrg ENTRY_VALUE_EXP (rtl) = incoming; 4441 1.1 mrg return rtl; 4442 1.1 mrg } 4443 1.1 mrg 4444 1.1 mrg if (incoming 4445 1.1 mrg && GET_MODE (incoming) != BLKmode 4446 1.1 mrg && !TREE_ADDRESSABLE (decl) 4447 1.1 mrg && MEM_P (incoming) 4448 1.1 mrg && (XEXP (incoming, 0) == virtual_incoming_args_rtx 4449 1.1 mrg || (GET_CODE (XEXP (incoming, 0)) == PLUS 4450 1.1 mrg && XEXP (XEXP (incoming, 0), 0) == virtual_incoming_args_rtx 4451 1.1 mrg && CONST_INT_P (XEXP (XEXP (incoming, 0), 1))))) 4452 1.1 mrg return copy_rtx (incoming); 4453 1.1 mrg 4454 1.1 mrg return NULL_RTX; 4455 1.1 mrg } 4456 1.1 mrg 4457 1.1 mrg /* Return an RTX equivalent to the value of the tree expression EXP. */ 4458 1.1 mrg 4459 1.1 mrg static rtx 4460 1.1 mrg expand_debug_expr (tree exp) 4461 1.1 mrg { 4462 1.1 mrg rtx op0 = NULL_RTX, op1 = NULL_RTX, op2 = NULL_RTX; 4463 1.1 mrg machine_mode mode = TYPE_MODE (TREE_TYPE (exp)); 4464 1.1 mrg machine_mode inner_mode = VOIDmode; 4465 1.1 mrg int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); 4466 1.1 mrg addr_space_t as; 4467 1.1 mrg scalar_int_mode op0_mode, op1_mode, addr_mode; 4468 1.1 mrg 4469 1.1 mrg switch (TREE_CODE_CLASS (TREE_CODE (exp))) 4470 1.1 mrg { 4471 1.1 mrg case tcc_expression: 4472 1.1 mrg switch (TREE_CODE (exp)) 4473 1.1 mrg { 4474 1.1 mrg case COND_EXPR: 4475 1.1 mrg case DOT_PROD_EXPR: 4476 1.1 mrg case SAD_EXPR: 4477 1.1 mrg case WIDEN_MULT_PLUS_EXPR: 4478 1.1 mrg case WIDEN_MULT_MINUS_EXPR: 4479 1.1 mrg goto ternary; 4480 1.1 mrg 4481 1.1 mrg case TRUTH_ANDIF_EXPR: 4482 1.1 mrg case TRUTH_ORIF_EXPR: 4483 1.1 mrg case TRUTH_AND_EXPR: 4484 1.1 mrg case TRUTH_OR_EXPR: 4485 1.1 mrg case TRUTH_XOR_EXPR: 4486 1.1 mrg goto binary; 4487 1.1 mrg 4488 1.1 mrg case TRUTH_NOT_EXPR: 4489 1.1 mrg goto unary; 4490 1.1 mrg 4491 1.1 mrg default: 4492 1.1 mrg break; 4493 1.1 mrg } 4494 1.1 mrg break; 4495 1.1 mrg 4496 1.1 mrg ternary: 4497 1.1 mrg op2 = expand_debug_expr (TREE_OPERAND (exp, 2)); 4498 1.1 mrg if (!op2) 4499 1.1 mrg return NULL_RTX; 4500 1.1 mrg /* Fall through. */ 4501 1.1 mrg 4502 1.1 mrg binary: 4503 1.1 mrg case tcc_binary: 4504 1.1 mrg if (mode == BLKmode) 4505 1.1 mrg return NULL_RTX; 4506 1.1 mrg op1 = expand_debug_expr (TREE_OPERAND (exp, 1)); 4507 1.1 mrg if (!op1) 4508 1.1 mrg return NULL_RTX; 4509 1.1 mrg switch (TREE_CODE (exp)) 4510 1.1 mrg { 4511 1.1 mrg case LSHIFT_EXPR: 4512 1.1 mrg case RSHIFT_EXPR: 4513 1.1 mrg case LROTATE_EXPR: 4514 1.1 mrg case RROTATE_EXPR: 4515 1.1 mrg case WIDEN_LSHIFT_EXPR: 4516 1.1 mrg /* Ensure second operand isn't wider than the first one. */ 4517 1.1 mrg inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))); 4518 1.1 mrg if (is_a <scalar_int_mode> (inner_mode, &op1_mode) 4519 1.1 mrg && (GET_MODE_UNIT_PRECISION (mode) 4520 1.1 mrg < GET_MODE_PRECISION (op1_mode))) 4521 1.1 mrg op1 = lowpart_subreg (GET_MODE_INNER (mode), op1, op1_mode); 4522 1.1 mrg break; 4523 1.1 mrg default: 4524 1.1 mrg break; 4525 1.1 mrg } 4526 1.1 mrg /* Fall through. */ 4527 1.1 mrg 4528 1.1 mrg unary: 4529 1.1 mrg case tcc_unary: 4530 1.1 mrg if (mode == BLKmode) 4531 1.1 mrg return NULL_RTX; 4532 1.1 mrg inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); 4533 1.1 mrg op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); 4534 1.1 mrg if (!op0) 4535 1.1 mrg return NULL_RTX; 4536 1.1 mrg break; 4537 1.1 mrg 4538 1.1 mrg case tcc_comparison: 4539 1.1 mrg unsignedp = TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))); 4540 1.1 mrg goto binary; 4541 1.1 mrg 4542 1.1 mrg case tcc_type: 4543 1.1 mrg case tcc_statement: 4544 1.1 mrg gcc_unreachable (); 4545 1.1 mrg 4546 1.1 mrg case tcc_constant: 4547 1.1 mrg case tcc_exceptional: 4548 1.1 mrg case tcc_declaration: 4549 1.1 mrg case tcc_reference: 4550 1.1 mrg case tcc_vl_exp: 4551 1.1 mrg break; 4552 1.1 mrg } 4553 1.1 mrg 4554 1.1 mrg switch (TREE_CODE (exp)) 4555 1.1 mrg { 4556 1.1 mrg case STRING_CST: 4557 1.1 mrg if (!lookup_constant_def (exp)) 4558 1.1 mrg { 4559 1.1 mrg if (strlen (TREE_STRING_POINTER (exp)) + 1 4560 1.1 mrg != (size_t) TREE_STRING_LENGTH (exp)) 4561 1.1 mrg return NULL_RTX; 4562 1.1 mrg op0 = gen_rtx_CONST_STRING (Pmode, TREE_STRING_POINTER (exp)); 4563 1.1 mrg op0 = gen_rtx_MEM (BLKmode, op0); 4564 1.1 mrg set_mem_attributes (op0, exp, 0); 4565 1.1 mrg return op0; 4566 1.1 mrg } 4567 1.1 mrg /* Fall through. */ 4568 1.1 mrg 4569 1.1 mrg case INTEGER_CST: 4570 1.5 mrg if (TREE_CODE (TREE_TYPE (exp)) == BITINT_TYPE 4571 1.5 mrg && TYPE_MODE (TREE_TYPE (exp)) == BLKmode) 4572 1.5 mrg return NULL; 4573 1.5 mrg /* FALLTHRU */ 4574 1.1 mrg case REAL_CST: 4575 1.1 mrg case FIXED_CST: 4576 1.1 mrg op0 = expand_expr (exp, NULL_RTX, mode, EXPAND_INITIALIZER); 4577 1.1 mrg return op0; 4578 1.1 mrg 4579 1.1 mrg case POLY_INT_CST: 4580 1.1 mrg return immed_wide_int_const (poly_int_cst_value (exp), mode); 4581 1.1 mrg 4582 1.1 mrg case COMPLEX_CST: 4583 1.1 mrg gcc_assert (COMPLEX_MODE_P (mode)); 4584 1.1 mrg op0 = expand_debug_expr (TREE_REALPART (exp)); 4585 1.1 mrg op1 = expand_debug_expr (TREE_IMAGPART (exp)); 4586 1.1 mrg return gen_rtx_CONCAT (mode, op0, op1); 4587 1.1 mrg 4588 1.1 mrg case DEBUG_EXPR_DECL: 4589 1.1 mrg op0 = DECL_RTL_IF_SET (exp); 4590 1.1 mrg 4591 1.1 mrg if (op0) 4592 1.1 mrg { 4593 1.1 mrg if (GET_MODE (op0) != mode) 4594 1.1 mrg gcc_assert (VECTOR_TYPE_P (TREE_TYPE (exp))); 4595 1.1 mrg else 4596 1.1 mrg return op0; 4597 1.1 mrg } 4598 1.1 mrg 4599 1.1 mrg op0 = gen_rtx_DEBUG_EXPR (mode); 4600 1.1 mrg DEBUG_EXPR_TREE_DECL (op0) = exp; 4601 1.1 mrg SET_DECL_RTL (exp, op0); 4602 1.1 mrg 4603 1.1 mrg return op0; 4604 1.1 mrg 4605 1.1 mrg case VAR_DECL: 4606 1.1 mrg case PARM_DECL: 4607 1.1 mrg case FUNCTION_DECL: 4608 1.1 mrg case LABEL_DECL: 4609 1.1 mrg case CONST_DECL: 4610 1.1 mrg case RESULT_DECL: 4611 1.1 mrg op0 = DECL_RTL_IF_SET (exp); 4612 1.1 mrg 4613 1.1 mrg /* This decl was probably optimized away. */ 4614 1.1 mrg if (!op0 4615 1.1 mrg /* At least label RTXen are sometimes replaced by 4616 1.1 mrg NOTE_INSN_DELETED_LABEL. Any notes here are not 4617 1.1 mrg handled by copy_rtx. */ 4618 1.1 mrg || NOTE_P (op0)) 4619 1.1 mrg { 4620 1.1 mrg if (!VAR_P (exp) 4621 1.1 mrg || DECL_EXTERNAL (exp) 4622 1.1 mrg || !TREE_STATIC (exp) 4623 1.1 mrg || !DECL_NAME (exp) 4624 1.1 mrg || DECL_HARD_REGISTER (exp) 4625 1.1 mrg || DECL_IN_CONSTANT_POOL (exp) 4626 1.5 mrg || mode == VOIDmode 4627 1.5 mrg || symtab_node::get (exp) == NULL) 4628 1.1 mrg return NULL; 4629 1.1 mrg 4630 1.1 mrg op0 = make_decl_rtl_for_debug (exp); 4631 1.1 mrg if (!MEM_P (op0) 4632 1.1 mrg || GET_CODE (XEXP (op0, 0)) != SYMBOL_REF 4633 1.1 mrg || SYMBOL_REF_DECL (XEXP (op0, 0)) != exp) 4634 1.1 mrg return NULL; 4635 1.1 mrg } 4636 1.5 mrg else if (VAR_P (exp) 4637 1.5 mrg && is_global_var (exp) 4638 1.5 mrg && symtab_node::get (exp) == NULL) 4639 1.5 mrg return NULL; 4640 1.1 mrg else 4641 1.1 mrg op0 = copy_rtx (op0); 4642 1.1 mrg 4643 1.1 mrg if (GET_MODE (op0) == BLKmode 4644 1.1 mrg /* If op0 is not BLKmode, but mode is, adjust_mode 4645 1.1 mrg below would ICE. While it is likely a FE bug, 4646 1.1 mrg try to be robust here. See PR43166. */ 4647 1.1 mrg || mode == BLKmode 4648 1.1 mrg || (mode == VOIDmode && GET_MODE (op0) != VOIDmode)) 4649 1.1 mrg { 4650 1.1 mrg gcc_assert (MEM_P (op0)); 4651 1.1 mrg op0 = adjust_address_nv (op0, mode, 0); 4652 1.1 mrg return op0; 4653 1.1 mrg } 4654 1.1 mrg 4655 1.1 mrg /* Fall through. */ 4656 1.1 mrg 4657 1.1 mrg adjust_mode: 4658 1.1 mrg case PAREN_EXPR: 4659 1.1 mrg CASE_CONVERT: 4660 1.1 mrg { 4661 1.1 mrg inner_mode = GET_MODE (op0); 4662 1.1 mrg 4663 1.1 mrg if (mode == inner_mode) 4664 1.1 mrg return op0; 4665 1.1 mrg 4666 1.1 mrg if (inner_mode == VOIDmode) 4667 1.1 mrg { 4668 1.1 mrg if (TREE_CODE (exp) == SSA_NAME) 4669 1.1 mrg inner_mode = TYPE_MODE (TREE_TYPE (exp)); 4670 1.1 mrg else 4671 1.1 mrg inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); 4672 1.1 mrg if (mode == inner_mode) 4673 1.1 mrg return op0; 4674 1.1 mrg } 4675 1.1 mrg 4676 1.1 mrg if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode)) 4677 1.1 mrg { 4678 1.1 mrg if (GET_MODE_UNIT_BITSIZE (mode) 4679 1.1 mrg == GET_MODE_UNIT_BITSIZE (inner_mode)) 4680 1.1 mrg op0 = simplify_gen_subreg (mode, op0, inner_mode, 0); 4681 1.1 mrg else if (GET_MODE_UNIT_BITSIZE (mode) 4682 1.1 mrg < GET_MODE_UNIT_BITSIZE (inner_mode)) 4683 1.1 mrg op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode); 4684 1.1 mrg else 4685 1.1 mrg op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode); 4686 1.1 mrg } 4687 1.1 mrg else if (FLOAT_MODE_P (mode)) 4688 1.1 mrg { 4689 1.1 mrg gcc_assert (TREE_CODE (exp) != SSA_NAME); 4690 1.1 mrg if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) 4691 1.1 mrg op0 = simplify_gen_unary (UNSIGNED_FLOAT, mode, op0, inner_mode); 4692 1.1 mrg else 4693 1.1 mrg op0 = simplify_gen_unary (FLOAT, mode, op0, inner_mode); 4694 1.1 mrg } 4695 1.1 mrg else if (FLOAT_MODE_P (inner_mode)) 4696 1.1 mrg { 4697 1.1 mrg if (unsignedp) 4698 1.1 mrg op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode); 4699 1.1 mrg else 4700 1.1 mrg op0 = simplify_gen_unary (FIX, mode, op0, inner_mode); 4701 1.1 mrg } 4702 1.1 mrg else if (GET_MODE_UNIT_PRECISION (mode) 4703 1.1 mrg == GET_MODE_UNIT_PRECISION (inner_mode)) 4704 1.1 mrg op0 = lowpart_subreg (mode, op0, inner_mode); 4705 1.1 mrg else if (GET_MODE_UNIT_PRECISION (mode) 4706 1.1 mrg < GET_MODE_UNIT_PRECISION (inner_mode)) 4707 1.1 mrg op0 = simplify_gen_unary (TRUNCATE, mode, op0, inner_mode); 4708 1.1 mrg else if (UNARY_CLASS_P (exp) 4709 1.1 mrg ? TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) 4710 1.1 mrg : unsignedp) 4711 1.1 mrg op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); 4712 1.1 mrg else 4713 1.1 mrg op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); 4714 1.1 mrg 4715 1.1 mrg return op0; 4716 1.1 mrg } 4717 1.1 mrg 4718 1.1 mrg case MEM_REF: 4719 1.1 mrg if (!is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) 4720 1.1 mrg { 4721 1.1 mrg tree newexp = fold_binary (MEM_REF, TREE_TYPE (exp), 4722 1.1 mrg TREE_OPERAND (exp, 0), 4723 1.1 mrg TREE_OPERAND (exp, 1)); 4724 1.1 mrg if (newexp) 4725 1.1 mrg return expand_debug_expr (newexp); 4726 1.1 mrg } 4727 1.1 mrg /* FALLTHROUGH */ 4728 1.1 mrg case INDIRECT_REF: 4729 1.1 mrg inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); 4730 1.1 mrg op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); 4731 1.1 mrg if (!op0) 4732 1.1 mrg return NULL; 4733 1.1 mrg 4734 1.1 mrg if (TREE_CODE (exp) == MEM_REF) 4735 1.1 mrg { 4736 1.1 mrg if (GET_CODE (op0) == DEBUG_IMPLICIT_PTR 4737 1.1 mrg || (GET_CODE (op0) == PLUS 4738 1.1 mrg && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR)) 4739 1.1 mrg /* (mem (debug_implicit_ptr)) might confuse aliasing. 4740 1.1 mrg Instead just use get_inner_reference. */ 4741 1.1 mrg goto component_ref; 4742 1.1 mrg 4743 1.1 mrg op1 = expand_debug_expr (TREE_OPERAND (exp, 1)); 4744 1.1 mrg poly_int64 offset; 4745 1.1 mrg if (!op1 || !poly_int_rtx_p (op1, &offset)) 4746 1.1 mrg return NULL; 4747 1.1 mrg 4748 1.1 mrg op0 = plus_constant (inner_mode, op0, offset); 4749 1.1 mrg } 4750 1.1 mrg 4751 1.1 mrg as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))); 4752 1.1 mrg 4753 1.1 mrg op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as), 4754 1.1 mrg op0, as); 4755 1.1 mrg if (op0 == NULL_RTX) 4756 1.1 mrg return NULL; 4757 1.1 mrg 4758 1.1 mrg op0 = gen_rtx_MEM (mode, op0); 4759 1.1 mrg set_mem_attributes (op0, exp, 0); 4760 1.1 mrg if (TREE_CODE (exp) == MEM_REF 4761 1.1 mrg && !is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) 4762 1.1 mrg set_mem_expr (op0, NULL_TREE); 4763 1.1 mrg set_mem_addr_space (op0, as); 4764 1.1 mrg 4765 1.1 mrg return op0; 4766 1.1 mrg 4767 1.1 mrg case TARGET_MEM_REF: 4768 1.1 mrg if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR 4769 1.1 mrg && !DECL_RTL_SET_P (TREE_OPERAND (TMR_BASE (exp), 0))) 4770 1.1 mrg return NULL; 4771 1.1 mrg 4772 1.1 mrg op0 = expand_debug_expr 4773 1.1 mrg (tree_mem_ref_addr (build_pointer_type (TREE_TYPE (exp)), exp)); 4774 1.1 mrg if (!op0) 4775 1.1 mrg return NULL; 4776 1.1 mrg 4777 1.1 mrg as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))); 4778 1.1 mrg op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as), 4779 1.1 mrg op0, as); 4780 1.1 mrg if (op0 == NULL_RTX) 4781 1.1 mrg return NULL; 4782 1.1 mrg 4783 1.1 mrg op0 = gen_rtx_MEM (mode, op0); 4784 1.1 mrg 4785 1.1 mrg set_mem_attributes (op0, exp, 0); 4786 1.1 mrg set_mem_addr_space (op0, as); 4787 1.1 mrg 4788 1.1 mrg return op0; 4789 1.1 mrg 4790 1.1 mrg component_ref: 4791 1.1 mrg case ARRAY_REF: 4792 1.1 mrg case ARRAY_RANGE_REF: 4793 1.1 mrg case COMPONENT_REF: 4794 1.1 mrg case BIT_FIELD_REF: 4795 1.1 mrg case REALPART_EXPR: 4796 1.1 mrg case IMAGPART_EXPR: 4797 1.1 mrg case VIEW_CONVERT_EXPR: 4798 1.1 mrg { 4799 1.1 mrg machine_mode mode1; 4800 1.1 mrg poly_int64 bitsize, bitpos; 4801 1.1 mrg tree offset; 4802 1.1 mrg int reversep, volatilep = 0; 4803 1.1 mrg tree tem 4804 1.1 mrg = get_inner_reference (exp, &bitsize, &bitpos, &offset, &mode1, 4805 1.1 mrg &unsignedp, &reversep, &volatilep); 4806 1.1 mrg rtx orig_op0; 4807 1.1 mrg 4808 1.1 mrg if (known_eq (bitsize, 0)) 4809 1.1 mrg return NULL; 4810 1.1 mrg 4811 1.1 mrg orig_op0 = op0 = expand_debug_expr (tem); 4812 1.1 mrg 4813 1.1 mrg if (!op0) 4814 1.1 mrg return NULL; 4815 1.1 mrg 4816 1.1 mrg if (offset) 4817 1.1 mrg { 4818 1.1 mrg machine_mode addrmode, offmode; 4819 1.1 mrg 4820 1.1 mrg if (!MEM_P (op0)) 4821 1.1 mrg return NULL; 4822 1.1 mrg 4823 1.1 mrg op0 = XEXP (op0, 0); 4824 1.1 mrg addrmode = GET_MODE (op0); 4825 1.1 mrg if (addrmode == VOIDmode) 4826 1.1 mrg addrmode = Pmode; 4827 1.1 mrg 4828 1.1 mrg op1 = expand_debug_expr (offset); 4829 1.1 mrg if (!op1) 4830 1.1 mrg return NULL; 4831 1.1 mrg 4832 1.1 mrg offmode = GET_MODE (op1); 4833 1.1 mrg if (offmode == VOIDmode) 4834 1.1 mrg offmode = TYPE_MODE (TREE_TYPE (offset)); 4835 1.1 mrg 4836 1.1 mrg if (addrmode != offmode) 4837 1.1 mrg op1 = lowpart_subreg (addrmode, op1, offmode); 4838 1.1 mrg 4839 1.1 mrg /* Don't use offset_address here, we don't need a 4840 1.1 mrg recognizable address, and we don't want to generate 4841 1.1 mrg code. */ 4842 1.1 mrg op0 = gen_rtx_MEM (mode, simplify_gen_binary (PLUS, addrmode, 4843 1.1 mrg op0, op1)); 4844 1.1 mrg } 4845 1.1 mrg 4846 1.1 mrg if (MEM_P (op0)) 4847 1.1 mrg { 4848 1.1 mrg if (mode1 == VOIDmode) 4849 1.1 mrg { 4850 1.1 mrg if (maybe_gt (bitsize, MAX_BITSIZE_MODE_ANY_INT)) 4851 1.1 mrg return NULL; 4852 1.1 mrg /* Bitfield. */ 4853 1.1 mrg mode1 = smallest_int_mode_for_size (bitsize); 4854 1.1 mrg } 4855 1.1 mrg poly_int64 bytepos = bits_to_bytes_round_down (bitpos); 4856 1.1 mrg if (maybe_ne (bytepos, 0)) 4857 1.1 mrg { 4858 1.1 mrg op0 = adjust_address_nv (op0, mode1, bytepos); 4859 1.1 mrg bitpos = num_trailing_bits (bitpos); 4860 1.1 mrg } 4861 1.1 mrg else if (known_eq (bitpos, 0) 4862 1.1 mrg && known_eq (bitsize, GET_MODE_BITSIZE (mode))) 4863 1.1 mrg op0 = adjust_address_nv (op0, mode, 0); 4864 1.1 mrg else if (GET_MODE (op0) != mode1) 4865 1.1 mrg op0 = adjust_address_nv (op0, mode1, 0); 4866 1.1 mrg else 4867 1.1 mrg op0 = copy_rtx (op0); 4868 1.1 mrg if (op0 == orig_op0) 4869 1.1 mrg op0 = shallow_copy_rtx (op0); 4870 1.1 mrg if (TREE_CODE (tem) != SSA_NAME) 4871 1.1 mrg set_mem_attributes (op0, exp, 0); 4872 1.1 mrg } 4873 1.1 mrg 4874 1.1 mrg if (known_eq (bitpos, 0) && mode == GET_MODE (op0)) 4875 1.1 mrg return op0; 4876 1.1 mrg 4877 1.1 mrg if (maybe_lt (bitpos, 0)) 4878 1.1 mrg return NULL; 4879 1.1 mrg 4880 1.1 mrg if (GET_MODE (op0) == BLKmode || mode == BLKmode) 4881 1.1 mrg return NULL; 4882 1.1 mrg 4883 1.1 mrg poly_int64 bytepos; 4884 1.1 mrg if (multiple_p (bitpos, BITS_PER_UNIT, &bytepos) 4885 1.1 mrg && known_eq (bitsize, GET_MODE_BITSIZE (mode1))) 4886 1.1 mrg { 4887 1.1 mrg machine_mode opmode = GET_MODE (op0); 4888 1.1 mrg 4889 1.1 mrg if (opmode == VOIDmode) 4890 1.1 mrg opmode = TYPE_MODE (TREE_TYPE (tem)); 4891 1.1 mrg 4892 1.1 mrg /* This condition may hold if we're expanding the address 4893 1.1 mrg right past the end of an array that turned out not to 4894 1.1 mrg be addressable (i.e., the address was only computed in 4895 1.1 mrg debug stmts). The gen_subreg below would rightfully 4896 1.1 mrg crash, and the address doesn't really exist, so just 4897 1.1 mrg drop it. */ 4898 1.1 mrg if (known_ge (bitpos, GET_MODE_BITSIZE (opmode))) 4899 1.1 mrg return NULL; 4900 1.1 mrg 4901 1.1 mrg if (multiple_p (bitpos, GET_MODE_BITSIZE (mode))) 4902 1.1 mrg return simplify_gen_subreg (mode, op0, opmode, bytepos); 4903 1.1 mrg } 4904 1.1 mrg 4905 1.1 mrg return simplify_gen_ternary (SCALAR_INT_MODE_P (GET_MODE (op0)) 4906 1.1 mrg && TYPE_UNSIGNED (TREE_TYPE (exp)) 4907 1.1 mrg ? SIGN_EXTRACT 4908 1.1 mrg : ZERO_EXTRACT, mode, 4909 1.1 mrg GET_MODE (op0) != VOIDmode 4910 1.1 mrg ? GET_MODE (op0) 4911 1.1 mrg : TYPE_MODE (TREE_TYPE (tem)), 4912 1.1 mrg op0, gen_int_mode (bitsize, word_mode), 4913 1.1 mrg gen_int_mode (bitpos, word_mode)); 4914 1.1 mrg } 4915 1.1 mrg 4916 1.1 mrg case ABS_EXPR: 4917 1.1 mrg case ABSU_EXPR: 4918 1.1 mrg return simplify_gen_unary (ABS, mode, op0, mode); 4919 1.1 mrg 4920 1.1 mrg case NEGATE_EXPR: 4921 1.1 mrg return simplify_gen_unary (NEG, mode, op0, mode); 4922 1.1 mrg 4923 1.1 mrg case BIT_NOT_EXPR: 4924 1.1 mrg return simplify_gen_unary (NOT, mode, op0, mode); 4925 1.1 mrg 4926 1.1 mrg case FLOAT_EXPR: 4927 1.1 mrg return simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 4928 1.1 mrg 0))) 4929 1.1 mrg ? UNSIGNED_FLOAT : FLOAT, mode, op0, 4930 1.1 mrg inner_mode); 4931 1.1 mrg 4932 1.1 mrg case FIX_TRUNC_EXPR: 4933 1.1 mrg return simplify_gen_unary (unsignedp ? UNSIGNED_FIX : FIX, mode, op0, 4934 1.1 mrg inner_mode); 4935 1.1 mrg 4936 1.1 mrg case POINTER_PLUS_EXPR: 4937 1.1 mrg /* For the rare target where pointers are not the same size as 4938 1.1 mrg size_t, we need to check for mis-matched modes and correct 4939 1.1 mrg the addend. */ 4940 1.1 mrg if (op0 && op1 4941 1.1 mrg && is_a <scalar_int_mode> (GET_MODE (op0), &op0_mode) 4942 1.1 mrg && is_a <scalar_int_mode> (GET_MODE (op1), &op1_mode) 4943 1.1 mrg && op0_mode != op1_mode) 4944 1.1 mrg { 4945 1.1 mrg if (GET_MODE_BITSIZE (op0_mode) < GET_MODE_BITSIZE (op1_mode) 4946 1.1 mrg /* If OP0 is a partial mode, then we must truncate, even 4947 1.1 mrg if it has the same bitsize as OP1 as GCC's 4948 1.1 mrg representation of partial modes is opaque. */ 4949 1.1 mrg || (GET_MODE_CLASS (op0_mode) == MODE_PARTIAL_INT 4950 1.1 mrg && (GET_MODE_BITSIZE (op0_mode) 4951 1.1 mrg == GET_MODE_BITSIZE (op1_mode)))) 4952 1.1 mrg op1 = simplify_gen_unary (TRUNCATE, op0_mode, op1, op1_mode); 4953 1.1 mrg else 4954 1.1 mrg /* We always sign-extend, regardless of the signedness of 4955 1.1 mrg the operand, because the operand is always unsigned 4956 1.1 mrg here even if the original C expression is signed. */ 4957 1.1 mrg op1 = simplify_gen_unary (SIGN_EXTEND, op0_mode, op1, op1_mode); 4958 1.1 mrg } 4959 1.1 mrg /* Fall through. */ 4960 1.1 mrg case PLUS_EXPR: 4961 1.1 mrg return simplify_gen_binary (PLUS, mode, op0, op1); 4962 1.1 mrg 4963 1.1 mrg case MINUS_EXPR: 4964 1.1 mrg case POINTER_DIFF_EXPR: 4965 1.1 mrg return simplify_gen_binary (MINUS, mode, op0, op1); 4966 1.1 mrg 4967 1.1 mrg case MULT_EXPR: 4968 1.1 mrg return simplify_gen_binary (MULT, mode, op0, op1); 4969 1.1 mrg 4970 1.1 mrg case RDIV_EXPR: 4971 1.1 mrg case TRUNC_DIV_EXPR: 4972 1.1 mrg case EXACT_DIV_EXPR: 4973 1.1 mrg if (unsignedp) 4974 1.1 mrg return simplify_gen_binary (UDIV, mode, op0, op1); 4975 1.1 mrg else 4976 1.1 mrg return simplify_gen_binary (DIV, mode, op0, op1); 4977 1.1 mrg 4978 1.1 mrg case TRUNC_MOD_EXPR: 4979 1.1 mrg return simplify_gen_binary (unsignedp ? UMOD : MOD, mode, op0, op1); 4980 1.1 mrg 4981 1.1 mrg case FLOOR_DIV_EXPR: 4982 1.1 mrg if (unsignedp) 4983 1.1 mrg return simplify_gen_binary (UDIV, mode, op0, op1); 4984 1.1 mrg else 4985 1.1 mrg { 4986 1.1 mrg rtx div = simplify_gen_binary (DIV, mode, op0, op1); 4987 1.1 mrg rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 4988 1.1 mrg rtx adj = floor_sdiv_adjust (mode, mod, op1); 4989 1.1 mrg return simplify_gen_binary (PLUS, mode, div, adj); 4990 1.1 mrg } 4991 1.1 mrg 4992 1.1 mrg case FLOOR_MOD_EXPR: 4993 1.1 mrg if (unsignedp) 4994 1.1 mrg return simplify_gen_binary (UMOD, mode, op0, op1); 4995 1.1 mrg else 4996 1.1 mrg { 4997 1.1 mrg rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 4998 1.1 mrg rtx adj = floor_sdiv_adjust (mode, mod, op1); 4999 1.1 mrg adj = simplify_gen_unary (NEG, mode, 5000 1.1 mrg simplify_gen_binary (MULT, mode, adj, op1), 5001 1.1 mrg mode); 5002 1.1 mrg return simplify_gen_binary (PLUS, mode, mod, adj); 5003 1.1 mrg } 5004 1.1 mrg 5005 1.1 mrg case CEIL_DIV_EXPR: 5006 1.1 mrg if (unsignedp) 5007 1.1 mrg { 5008 1.1 mrg rtx div = simplify_gen_binary (UDIV, mode, op0, op1); 5009 1.1 mrg rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 5010 1.1 mrg rtx adj = ceil_udiv_adjust (mode, mod, op1); 5011 1.1 mrg return simplify_gen_binary (PLUS, mode, div, adj); 5012 1.1 mrg } 5013 1.1 mrg else 5014 1.1 mrg { 5015 1.1 mrg rtx div = simplify_gen_binary (DIV, mode, op0, op1); 5016 1.1 mrg rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 5017 1.1 mrg rtx adj = ceil_sdiv_adjust (mode, mod, op1); 5018 1.1 mrg return simplify_gen_binary (PLUS, mode, div, adj); 5019 1.1 mrg } 5020 1.1 mrg 5021 1.1 mrg case CEIL_MOD_EXPR: 5022 1.1 mrg if (unsignedp) 5023 1.1 mrg { 5024 1.1 mrg rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 5025 1.1 mrg rtx adj = ceil_udiv_adjust (mode, mod, op1); 5026 1.1 mrg adj = simplify_gen_unary (NEG, mode, 5027 1.1 mrg simplify_gen_binary (MULT, mode, adj, op1), 5028 1.1 mrg mode); 5029 1.1 mrg return simplify_gen_binary (PLUS, mode, mod, adj); 5030 1.1 mrg } 5031 1.1 mrg else 5032 1.1 mrg { 5033 1.1 mrg rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 5034 1.1 mrg rtx adj = ceil_sdiv_adjust (mode, mod, op1); 5035 1.1 mrg adj = simplify_gen_unary (NEG, mode, 5036 1.1 mrg simplify_gen_binary (MULT, mode, adj, op1), 5037 1.1 mrg mode); 5038 1.1 mrg return simplify_gen_binary (PLUS, mode, mod, adj); 5039 1.1 mrg } 5040 1.1 mrg 5041 1.1 mrg case ROUND_DIV_EXPR: 5042 1.1 mrg if (unsignedp) 5043 1.1 mrg { 5044 1.1 mrg rtx div = simplify_gen_binary (UDIV, mode, op0, op1); 5045 1.1 mrg rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 5046 1.1 mrg rtx adj = round_udiv_adjust (mode, mod, op1); 5047 1.1 mrg return simplify_gen_binary (PLUS, mode, div, adj); 5048 1.1 mrg } 5049 1.1 mrg else 5050 1.1 mrg { 5051 1.1 mrg rtx div = simplify_gen_binary (DIV, mode, op0, op1); 5052 1.1 mrg rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 5053 1.1 mrg rtx adj = round_sdiv_adjust (mode, mod, op1); 5054 1.1 mrg return simplify_gen_binary (PLUS, mode, div, adj); 5055 1.1 mrg } 5056 1.1 mrg 5057 1.1 mrg case ROUND_MOD_EXPR: 5058 1.1 mrg if (unsignedp) 5059 1.1 mrg { 5060 1.1 mrg rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); 5061 1.1 mrg rtx adj = round_udiv_adjust (mode, mod, op1); 5062 1.1 mrg adj = simplify_gen_unary (NEG, mode, 5063 1.1 mrg simplify_gen_binary (MULT, mode, adj, op1), 5064 1.1 mrg mode); 5065 1.1 mrg return simplify_gen_binary (PLUS, mode, mod, adj); 5066 1.1 mrg } 5067 1.1 mrg else 5068 1.1 mrg { 5069 1.1 mrg rtx mod = simplify_gen_binary (MOD, mode, op0, op1); 5070 1.1 mrg rtx adj = round_sdiv_adjust (mode, mod, op1); 5071 1.1 mrg adj = simplify_gen_unary (NEG, mode, 5072 1.1 mrg simplify_gen_binary (MULT, mode, adj, op1), 5073 1.1 mrg mode); 5074 1.1 mrg return simplify_gen_binary (PLUS, mode, mod, adj); 5075 1.1 mrg } 5076 1.1 mrg 5077 1.1 mrg case LSHIFT_EXPR: 5078 1.1 mrg return simplify_gen_binary (ASHIFT, mode, op0, op1); 5079 1.1 mrg 5080 1.1 mrg case RSHIFT_EXPR: 5081 1.1 mrg if (unsignedp) 5082 1.1 mrg return simplify_gen_binary (LSHIFTRT, mode, op0, op1); 5083 1.1 mrg else 5084 1.1 mrg return simplify_gen_binary (ASHIFTRT, mode, op0, op1); 5085 1.1 mrg 5086 1.1 mrg case LROTATE_EXPR: 5087 1.1 mrg return simplify_gen_binary (ROTATE, mode, op0, op1); 5088 1.1 mrg 5089 1.1 mrg case RROTATE_EXPR: 5090 1.1 mrg return simplify_gen_binary (ROTATERT, mode, op0, op1); 5091 1.1 mrg 5092 1.1 mrg case MIN_EXPR: 5093 1.1 mrg return simplify_gen_binary (unsignedp ? UMIN : SMIN, mode, op0, op1); 5094 1.1 mrg 5095 1.1 mrg case MAX_EXPR: 5096 1.1 mrg return simplify_gen_binary (unsignedp ? UMAX : SMAX, mode, op0, op1); 5097 1.1 mrg 5098 1.1 mrg case BIT_AND_EXPR: 5099 1.1 mrg case TRUTH_AND_EXPR: 5100 1.1 mrg return simplify_gen_binary (AND, mode, op0, op1); 5101 1.1 mrg 5102 1.1 mrg case BIT_IOR_EXPR: 5103 1.1 mrg case TRUTH_OR_EXPR: 5104 1.1 mrg return simplify_gen_binary (IOR, mode, op0, op1); 5105 1.1 mrg 5106 1.1 mrg case BIT_XOR_EXPR: 5107 1.1 mrg case TRUTH_XOR_EXPR: 5108 1.1 mrg return simplify_gen_binary (XOR, mode, op0, op1); 5109 1.1 mrg 5110 1.1 mrg case TRUTH_ANDIF_EXPR: 5111 1.1 mrg return gen_rtx_IF_THEN_ELSE (mode, op0, op1, const0_rtx); 5112 1.1 mrg 5113 1.1 mrg case TRUTH_ORIF_EXPR: 5114 1.1 mrg return gen_rtx_IF_THEN_ELSE (mode, op0, const_true_rtx, op1); 5115 1.1 mrg 5116 1.1 mrg case TRUTH_NOT_EXPR: 5117 1.1 mrg return simplify_gen_relational (EQ, mode, inner_mode, op0, const0_rtx); 5118 1.1 mrg 5119 1.1 mrg case LT_EXPR: 5120 1.1 mrg return simplify_gen_relational (unsignedp ? LTU : LT, mode, inner_mode, 5121 1.1 mrg op0, op1); 5122 1.1 mrg 5123 1.1 mrg case LE_EXPR: 5124 1.1 mrg return simplify_gen_relational (unsignedp ? LEU : LE, mode, inner_mode, 5125 1.1 mrg op0, op1); 5126 1.1 mrg 5127 1.1 mrg case GT_EXPR: 5128 1.1 mrg return simplify_gen_relational (unsignedp ? GTU : GT, mode, inner_mode, 5129 1.1 mrg op0, op1); 5130 1.1 mrg 5131 1.1 mrg case GE_EXPR: 5132 1.1 mrg return simplify_gen_relational (unsignedp ? GEU : GE, mode, inner_mode, 5133 1.1 mrg op0, op1); 5134 1.1 mrg 5135 1.1 mrg case EQ_EXPR: 5136 1.1 mrg return simplify_gen_relational (EQ, mode, inner_mode, op0, op1); 5137 1.1 mrg 5138 1.1 mrg case NE_EXPR: 5139 1.1 mrg return simplify_gen_relational (NE, mode, inner_mode, op0, op1); 5140 1.1 mrg 5141 1.1 mrg case UNORDERED_EXPR: 5142 1.1 mrg return simplify_gen_relational (UNORDERED, mode, inner_mode, op0, op1); 5143 1.1 mrg 5144 1.1 mrg case ORDERED_EXPR: 5145 1.1 mrg return simplify_gen_relational (ORDERED, mode, inner_mode, op0, op1); 5146 1.1 mrg 5147 1.1 mrg case UNLT_EXPR: 5148 1.1 mrg return simplify_gen_relational (UNLT, mode, inner_mode, op0, op1); 5149 1.1 mrg 5150 1.1 mrg case UNLE_EXPR: 5151 1.1 mrg return simplify_gen_relational (UNLE, mode, inner_mode, op0, op1); 5152 1.1 mrg 5153 1.1 mrg case UNGT_EXPR: 5154 1.1 mrg return simplify_gen_relational (UNGT, mode, inner_mode, op0, op1); 5155 1.1 mrg 5156 1.1 mrg case UNGE_EXPR: 5157 1.1 mrg return simplify_gen_relational (UNGE, mode, inner_mode, op0, op1); 5158 1.1 mrg 5159 1.1 mrg case UNEQ_EXPR: 5160 1.1 mrg return simplify_gen_relational (UNEQ, mode, inner_mode, op0, op1); 5161 1.1 mrg 5162 1.1 mrg case LTGT_EXPR: 5163 1.1 mrg return simplify_gen_relational (LTGT, mode, inner_mode, op0, op1); 5164 1.1 mrg 5165 1.1 mrg case COND_EXPR: 5166 1.1 mrg return gen_rtx_IF_THEN_ELSE (mode, op0, op1, op2); 5167 1.1 mrg 5168 1.1 mrg case COMPLEX_EXPR: 5169 1.1 mrg gcc_assert (COMPLEX_MODE_P (mode)); 5170 1.1 mrg if (GET_MODE (op0) == VOIDmode) 5171 1.1 mrg op0 = gen_rtx_CONST (GET_MODE_INNER (mode), op0); 5172 1.1 mrg if (GET_MODE (op1) == VOIDmode) 5173 1.1 mrg op1 = gen_rtx_CONST (GET_MODE_INNER (mode), op1); 5174 1.1 mrg return gen_rtx_CONCAT (mode, op0, op1); 5175 1.1 mrg 5176 1.1 mrg case CONJ_EXPR: 5177 1.1 mrg if (GET_CODE (op0) == CONCAT) 5178 1.1 mrg return gen_rtx_CONCAT (mode, XEXP (op0, 0), 5179 1.1 mrg simplify_gen_unary (NEG, GET_MODE_INNER (mode), 5180 1.1 mrg XEXP (op0, 1), 5181 1.1 mrg GET_MODE_INNER (mode))); 5182 1.1 mrg else 5183 1.1 mrg { 5184 1.1 mrg scalar_mode imode = GET_MODE_INNER (mode); 5185 1.1 mrg rtx re, im; 5186 1.1 mrg 5187 1.1 mrg if (MEM_P (op0)) 5188 1.1 mrg { 5189 1.1 mrg re = adjust_address_nv (op0, imode, 0); 5190 1.1 mrg im = adjust_address_nv (op0, imode, GET_MODE_SIZE (imode)); 5191 1.1 mrg } 5192 1.1 mrg else 5193 1.1 mrg { 5194 1.1 mrg scalar_int_mode ifmode; 5195 1.1 mrg scalar_int_mode ihmode; 5196 1.1 mrg rtx halfsize; 5197 1.1 mrg if (!int_mode_for_mode (mode).exists (&ifmode) 5198 1.1 mrg || !int_mode_for_mode (imode).exists (&ihmode)) 5199 1.1 mrg return NULL; 5200 1.1 mrg halfsize = GEN_INT (GET_MODE_BITSIZE (ihmode)); 5201 1.1 mrg re = op0; 5202 1.1 mrg if (mode != ifmode) 5203 1.1 mrg re = gen_rtx_SUBREG (ifmode, re, 0); 5204 1.1 mrg re = gen_rtx_ZERO_EXTRACT (ihmode, re, halfsize, const0_rtx); 5205 1.1 mrg if (imode != ihmode) 5206 1.1 mrg re = gen_rtx_SUBREG (imode, re, 0); 5207 1.1 mrg im = copy_rtx (op0); 5208 1.1 mrg if (mode != ifmode) 5209 1.1 mrg im = gen_rtx_SUBREG (ifmode, im, 0); 5210 1.1 mrg im = gen_rtx_ZERO_EXTRACT (ihmode, im, halfsize, halfsize); 5211 1.1 mrg if (imode != ihmode) 5212 1.1 mrg im = gen_rtx_SUBREG (imode, im, 0); 5213 1.1 mrg } 5214 1.1 mrg im = gen_rtx_NEG (imode, im); 5215 1.1 mrg return gen_rtx_CONCAT (mode, re, im); 5216 1.1 mrg } 5217 1.1 mrg 5218 1.1 mrg case ADDR_EXPR: 5219 1.1 mrg op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); 5220 1.1 mrg if (!op0 || !MEM_P (op0)) 5221 1.1 mrg { 5222 1.1 mrg if ((TREE_CODE (TREE_OPERAND (exp, 0)) == VAR_DECL 5223 1.1 mrg || TREE_CODE (TREE_OPERAND (exp, 0)) == PARM_DECL 5224 1.1 mrg || TREE_CODE (TREE_OPERAND (exp, 0)) == RESULT_DECL) 5225 1.1 mrg && (!TREE_ADDRESSABLE (TREE_OPERAND (exp, 0)) 5226 1.1 mrg || target_for_debug_bind (TREE_OPERAND (exp, 0)))) 5227 1.1 mrg return gen_rtx_DEBUG_IMPLICIT_PTR (mode, TREE_OPERAND (exp, 0)); 5228 1.1 mrg 5229 1.1 mrg if (handled_component_p (TREE_OPERAND (exp, 0))) 5230 1.1 mrg { 5231 1.1 mrg poly_int64 bitoffset, bitsize, maxsize, byteoffset; 5232 1.1 mrg bool reverse; 5233 1.1 mrg tree decl 5234 1.1 mrg = get_ref_base_and_extent (TREE_OPERAND (exp, 0), &bitoffset, 5235 1.1 mrg &bitsize, &maxsize, &reverse); 5236 1.1 mrg if ((VAR_P (decl) 5237 1.1 mrg || TREE_CODE (decl) == PARM_DECL 5238 1.1 mrg || TREE_CODE (decl) == RESULT_DECL) 5239 1.1 mrg && (!TREE_ADDRESSABLE (decl) 5240 1.1 mrg || target_for_debug_bind (decl)) 5241 1.1 mrg && multiple_p (bitoffset, BITS_PER_UNIT, &byteoffset) 5242 1.1 mrg && known_gt (bitsize, 0) 5243 1.1 mrg && known_eq (bitsize, maxsize)) 5244 1.1 mrg { 5245 1.1 mrg rtx base = gen_rtx_DEBUG_IMPLICIT_PTR (mode, decl); 5246 1.1 mrg return plus_constant (mode, base, byteoffset); 5247 1.1 mrg } 5248 1.1 mrg } 5249 1.1 mrg 5250 1.1 mrg if (TREE_CODE (TREE_OPERAND (exp, 0)) == MEM_REF 5251 1.1 mrg && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) 5252 1.1 mrg == ADDR_EXPR) 5253 1.1 mrg { 5254 1.1 mrg op0 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 5255 1.1 mrg 0)); 5256 1.1 mrg if (op0 != NULL 5257 1.1 mrg && (GET_CODE (op0) == DEBUG_IMPLICIT_PTR 5258 1.1 mrg || (GET_CODE (op0) == PLUS 5259 1.1 mrg && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR 5260 1.1 mrg && CONST_INT_P (XEXP (op0, 1))))) 5261 1.1 mrg { 5262 1.1 mrg op1 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 5263 1.1 mrg 1)); 5264 1.1 mrg poly_int64 offset; 5265 1.1 mrg if (!op1 || !poly_int_rtx_p (op1, &offset)) 5266 1.1 mrg return NULL; 5267 1.1 mrg 5268 1.1 mrg return plus_constant (mode, op0, offset); 5269 1.1 mrg } 5270 1.1 mrg } 5271 1.1 mrg 5272 1.1 mrg return NULL; 5273 1.1 mrg } 5274 1.1 mrg 5275 1.1 mrg as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp))); 5276 1.1 mrg addr_mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (exp)); 5277 1.1 mrg op0 = convert_debug_memory_address (addr_mode, XEXP (op0, 0), as); 5278 1.1 mrg 5279 1.1 mrg return op0; 5280 1.1 mrg 5281 1.1 mrg case VECTOR_CST: 5282 1.1 mrg { 5283 1.1 mrg unsigned HOST_WIDE_INT i, nelts; 5284 1.1 mrg 5285 1.1 mrg if (!VECTOR_CST_NELTS (exp).is_constant (&nelts)) 5286 1.1 mrg return NULL; 5287 1.1 mrg 5288 1.1 mrg op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts)); 5289 1.1 mrg 5290 1.1 mrg for (i = 0; i < nelts; ++i) 5291 1.1 mrg { 5292 1.1 mrg op1 = expand_debug_expr (VECTOR_CST_ELT (exp, i)); 5293 1.1 mrg if (!op1) 5294 1.1 mrg return NULL; 5295 1.1 mrg XVECEXP (op0, 0, i) = op1; 5296 1.1 mrg } 5297 1.1 mrg 5298 1.1 mrg return op0; 5299 1.1 mrg } 5300 1.1 mrg 5301 1.1 mrg case CONSTRUCTOR: 5302 1.1 mrg if (TREE_CLOBBER_P (exp)) 5303 1.1 mrg return NULL; 5304 1.1 mrg else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE) 5305 1.1 mrg { 5306 1.1 mrg unsigned i; 5307 1.1 mrg unsigned HOST_WIDE_INT nelts; 5308 1.1 mrg tree val; 5309 1.1 mrg 5310 1.1 mrg if (!TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)).is_constant (&nelts)) 5311 1.1 mrg goto flag_unsupported; 5312 1.1 mrg 5313 1.1 mrg op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts)); 5314 1.1 mrg 5315 1.1 mrg FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val) 5316 1.1 mrg { 5317 1.1 mrg op1 = expand_debug_expr (val); 5318 1.1 mrg if (!op1) 5319 1.1 mrg return NULL; 5320 1.1 mrg XVECEXP (op0, 0, i) = op1; 5321 1.1 mrg } 5322 1.1 mrg 5323 1.1 mrg if (i < nelts) 5324 1.1 mrg { 5325 1.1 mrg op1 = expand_debug_expr 5326 1.1 mrg (build_zero_cst (TREE_TYPE (TREE_TYPE (exp)))); 5327 1.1 mrg 5328 1.1 mrg if (!op1) 5329 1.1 mrg return NULL; 5330 1.1 mrg 5331 1.1 mrg for (; i < nelts; i++) 5332 1.1 mrg XVECEXP (op0, 0, i) = op1; 5333 1.1 mrg } 5334 1.1 mrg 5335 1.1 mrg return op0; 5336 1.1 mrg } 5337 1.1 mrg else 5338 1.1 mrg goto flag_unsupported; 5339 1.1 mrg 5340 1.1 mrg case CALL_EXPR: 5341 1.1 mrg /* ??? Maybe handle some builtins? */ 5342 1.1 mrg return NULL; 5343 1.1 mrg 5344 1.1 mrg case SSA_NAME: 5345 1.1 mrg { 5346 1.1 mrg gimple *g = get_gimple_for_ssa_name (exp); 5347 1.1 mrg if (g) 5348 1.1 mrg { 5349 1.1 mrg tree t = NULL_TREE; 5350 1.1 mrg if (deep_ter_debug_map) 5351 1.1 mrg { 5352 1.1 mrg tree *slot = deep_ter_debug_map->get (exp); 5353 1.1 mrg if (slot) 5354 1.1 mrg t = *slot; 5355 1.1 mrg } 5356 1.1 mrg if (t == NULL_TREE) 5357 1.1 mrg t = gimple_assign_rhs_to_tree (g); 5358 1.1 mrg op0 = expand_debug_expr (t); 5359 1.1 mrg if (!op0) 5360 1.1 mrg return NULL; 5361 1.1 mrg } 5362 1.1 mrg else 5363 1.1 mrg { 5364 1.1 mrg /* If this is a reference to an incoming value of 5365 1.1 mrg parameter that is never used in the code or where the 5366 1.1 mrg incoming value is never used in the code, use 5367 1.1 mrg PARM_DECL's DECL_RTL if set. */ 5368 1.1 mrg if (SSA_NAME_IS_DEFAULT_DEF (exp) 5369 1.1 mrg && SSA_NAME_VAR (exp) 5370 1.1 mrg && TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL 5371 1.1 mrg && has_zero_uses (exp)) 5372 1.1 mrg { 5373 1.1 mrg op0 = expand_debug_parm_decl (SSA_NAME_VAR (exp)); 5374 1.1 mrg if (op0) 5375 1.1 mrg goto adjust_mode; 5376 1.1 mrg op0 = expand_debug_expr (SSA_NAME_VAR (exp)); 5377 1.1 mrg if (op0) 5378 1.1 mrg goto adjust_mode; 5379 1.1 mrg } 5380 1.1 mrg 5381 1.1 mrg int part = var_to_partition (SA.map, exp); 5382 1.1 mrg 5383 1.1 mrg if (part == NO_PARTITION) 5384 1.1 mrg return NULL; 5385 1.1 mrg 5386 1.1 mrg gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions); 5387 1.1 mrg 5388 1.1 mrg op0 = copy_rtx (SA.partition_to_pseudo[part]); 5389 1.1 mrg } 5390 1.1 mrg goto adjust_mode; 5391 1.1 mrg } 5392 1.1 mrg 5393 1.1 mrg case ERROR_MARK: 5394 1.1 mrg return NULL; 5395 1.1 mrg 5396 1.1 mrg /* Vector stuff. For most of the codes we don't have rtl codes. */ 5397 1.1 mrg case REALIGN_LOAD_EXPR: 5398 1.1 mrg case VEC_COND_EXPR: 5399 1.1 mrg case VEC_PACK_FIX_TRUNC_EXPR: 5400 1.1 mrg case VEC_PACK_FLOAT_EXPR: 5401 1.1 mrg case VEC_PACK_SAT_EXPR: 5402 1.1 mrg case VEC_PACK_TRUNC_EXPR: 5403 1.1 mrg case VEC_UNPACK_FIX_TRUNC_HI_EXPR: 5404 1.1 mrg case VEC_UNPACK_FIX_TRUNC_LO_EXPR: 5405 1.1 mrg case VEC_UNPACK_FLOAT_HI_EXPR: 5406 1.1 mrg case VEC_UNPACK_FLOAT_LO_EXPR: 5407 1.1 mrg case VEC_UNPACK_HI_EXPR: 5408 1.1 mrg case VEC_UNPACK_LO_EXPR: 5409 1.1 mrg case VEC_WIDEN_MULT_HI_EXPR: 5410 1.1 mrg case VEC_WIDEN_MULT_LO_EXPR: 5411 1.1 mrg case VEC_WIDEN_MULT_EVEN_EXPR: 5412 1.1 mrg case VEC_WIDEN_MULT_ODD_EXPR: 5413 1.1 mrg case VEC_WIDEN_LSHIFT_HI_EXPR: 5414 1.1 mrg case VEC_WIDEN_LSHIFT_LO_EXPR: 5415 1.1 mrg case VEC_PERM_EXPR: 5416 1.1 mrg case VEC_DUPLICATE_EXPR: 5417 1.1 mrg case VEC_SERIES_EXPR: 5418 1.1 mrg case SAD_EXPR: 5419 1.1 mrg return NULL; 5420 1.1 mrg 5421 1.1 mrg /* Misc codes. */ 5422 1.1 mrg case ADDR_SPACE_CONVERT_EXPR: 5423 1.1 mrg case FIXED_CONVERT_EXPR: 5424 1.1 mrg case OBJ_TYPE_REF: 5425 1.1 mrg case WITH_SIZE_EXPR: 5426 1.1 mrg case BIT_INSERT_EXPR: 5427 1.1 mrg return NULL; 5428 1.1 mrg 5429 1.1 mrg case DOT_PROD_EXPR: 5430 1.1 mrg if (SCALAR_INT_MODE_P (GET_MODE (op0)) 5431 1.1 mrg && SCALAR_INT_MODE_P (mode)) 5432 1.1 mrg { 5433 1.1 mrg op0 5434 1.1 mrg = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 5435 1.1 mrg 0))) 5436 1.1 mrg ? ZERO_EXTEND : SIGN_EXTEND, mode, op0, 5437 1.1 mrg inner_mode); 5438 1.1 mrg op1 5439 1.1 mrg = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 5440 1.1 mrg 1))) 5441 1.1 mrg ? ZERO_EXTEND : SIGN_EXTEND, mode, op1, 5442 1.1 mrg inner_mode); 5443 1.1 mrg op0 = simplify_gen_binary (MULT, mode, op0, op1); 5444 1.1 mrg return simplify_gen_binary (PLUS, mode, op0, op2); 5445 1.1 mrg } 5446 1.1 mrg return NULL; 5447 1.1 mrg 5448 1.1 mrg case WIDEN_MULT_EXPR: 5449 1.1 mrg case WIDEN_MULT_PLUS_EXPR: 5450 1.1 mrg case WIDEN_MULT_MINUS_EXPR: 5451 1.1 mrg if (SCALAR_INT_MODE_P (GET_MODE (op0)) 5452 1.1 mrg && SCALAR_INT_MODE_P (mode)) 5453 1.1 mrg { 5454 1.1 mrg inner_mode = GET_MODE (op0); 5455 1.1 mrg if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) 5456 1.1 mrg op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); 5457 1.1 mrg else 5458 1.1 mrg op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); 5459 1.1 mrg if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)))) 5460 1.1 mrg op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); 5461 1.1 mrg else 5462 1.1 mrg op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); 5463 1.1 mrg op0 = simplify_gen_binary (MULT, mode, op0, op1); 5464 1.1 mrg if (TREE_CODE (exp) == WIDEN_MULT_EXPR) 5465 1.1 mrg return op0; 5466 1.1 mrg else if (TREE_CODE (exp) == WIDEN_MULT_PLUS_EXPR) 5467 1.1 mrg return simplify_gen_binary (PLUS, mode, op0, op2); 5468 1.1 mrg else 5469 1.1 mrg return simplify_gen_binary (MINUS, mode, op2, op0); 5470 1.1 mrg } 5471 1.1 mrg return NULL; 5472 1.1 mrg 5473 1.1 mrg case MULT_HIGHPART_EXPR: 5474 1.1 mrg /* ??? Similar to the above. */ 5475 1.1 mrg return NULL; 5476 1.1 mrg 5477 1.1 mrg case WIDEN_SUM_EXPR: 5478 1.1 mrg case WIDEN_LSHIFT_EXPR: 5479 1.1 mrg if (SCALAR_INT_MODE_P (GET_MODE (op0)) 5480 1.1 mrg && SCALAR_INT_MODE_P (mode)) 5481 1.1 mrg { 5482 1.1 mrg op0 5483 1.1 mrg = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 5484 1.1 mrg 0))) 5485 1.1 mrg ? ZERO_EXTEND : SIGN_EXTEND, mode, op0, 5486 1.1 mrg inner_mode); 5487 1.1 mrg return simplify_gen_binary (TREE_CODE (exp) == WIDEN_LSHIFT_EXPR 5488 1.1 mrg ? ASHIFT : PLUS, mode, op0, op1); 5489 1.1 mrg } 5490 1.1 mrg return NULL; 5491 1.1 mrg 5492 1.1 mrg default: 5493 1.1 mrg flag_unsupported: 5494 1.1 mrg if (flag_checking) 5495 1.1 mrg { 5496 1.1 mrg debug_tree (exp); 5497 1.1 mrg gcc_unreachable (); 5498 1.1 mrg } 5499 1.1 mrg return NULL; 5500 1.1 mrg } 5501 1.1 mrg } 5502 1.1 mrg 5503 1.1 mrg /* Return an RTX equivalent to the source bind value of the tree expression 5504 1.1 mrg EXP. */ 5505 1.1 mrg 5506 1.1 mrg static rtx 5507 1.1 mrg expand_debug_source_expr (tree exp) 5508 1.1 mrg { 5509 1.1 mrg rtx op0 = NULL_RTX; 5510 1.1 mrg machine_mode mode = VOIDmode, inner_mode; 5511 1.1 mrg 5512 1.1 mrg switch (TREE_CODE (exp)) 5513 1.1 mrg { 5514 1.1 mrg case VAR_DECL: 5515 1.1 mrg if (DECL_ABSTRACT_ORIGIN (exp)) 5516 1.1 mrg return expand_debug_source_expr (DECL_ABSTRACT_ORIGIN (exp)); 5517 1.1 mrg break; 5518 1.1 mrg case PARM_DECL: 5519 1.1 mrg { 5520 1.1 mrg mode = DECL_MODE (exp); 5521 1.1 mrg op0 = expand_debug_parm_decl (exp); 5522 1.1 mrg if (op0) 5523 1.1 mrg break; 5524 1.1 mrg /* See if this isn't an argument that has been completely 5525 1.1 mrg optimized out. */ 5526 1.1 mrg if (!DECL_RTL_SET_P (exp) 5527 1.1 mrg && !DECL_INCOMING_RTL (exp) 5528 1.1 mrg && DECL_ABSTRACT_ORIGIN (current_function_decl)) 5529 1.1 mrg { 5530 1.1 mrg tree aexp = DECL_ORIGIN (exp); 5531 1.1 mrg if (DECL_CONTEXT (aexp) 5532 1.1 mrg == DECL_ABSTRACT_ORIGIN (current_function_decl)) 5533 1.1 mrg { 5534 1.1 mrg vec<tree, va_gc> **debug_args; 5535 1.1 mrg unsigned int ix; 5536 1.1 mrg tree ddecl; 5537 1.1 mrg debug_args = decl_debug_args_lookup (current_function_decl); 5538 1.1 mrg if (debug_args != NULL) 5539 1.1 mrg { 5540 1.1 mrg for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl); 5541 1.1 mrg ix += 2) 5542 1.1 mrg if (ddecl == aexp) 5543 1.1 mrg return gen_rtx_DEBUG_PARAMETER_REF (mode, aexp); 5544 1.1 mrg } 5545 1.1 mrg } 5546 1.1 mrg } 5547 1.1 mrg break; 5548 1.1 mrg } 5549 1.1 mrg default: 5550 1.1 mrg break; 5551 1.1 mrg } 5552 1.1 mrg 5553 1.1 mrg if (op0 == NULL_RTX) 5554 1.1 mrg return NULL_RTX; 5555 1.1 mrg 5556 1.1 mrg inner_mode = GET_MODE (op0); 5557 1.1 mrg if (mode == inner_mode) 5558 1.1 mrg return op0; 5559 1.1 mrg 5560 1.1 mrg if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode)) 5561 1.1 mrg { 5562 1.1 mrg if (GET_MODE_UNIT_BITSIZE (mode) 5563 1.1 mrg == GET_MODE_UNIT_BITSIZE (inner_mode)) 5564 1.1 mrg op0 = simplify_gen_subreg (mode, op0, inner_mode, 0); 5565 1.1 mrg else if (GET_MODE_UNIT_BITSIZE (mode) 5566 1.1 mrg < GET_MODE_UNIT_BITSIZE (inner_mode)) 5567 1.1 mrg op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode); 5568 1.1 mrg else 5569 1.1 mrg op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode); 5570 1.1 mrg } 5571 1.1 mrg else if (FLOAT_MODE_P (mode)) 5572 1.1 mrg gcc_unreachable (); 5573 1.1 mrg else if (FLOAT_MODE_P (inner_mode)) 5574 1.1 mrg { 5575 1.1 mrg if (TYPE_UNSIGNED (TREE_TYPE (exp))) 5576 1.1 mrg op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode); 5577 1.1 mrg else 5578 1.1 mrg op0 = simplify_gen_unary (FIX, mode, op0, inner_mode); 5579 1.1 mrg } 5580 1.1 mrg else if (GET_MODE_UNIT_PRECISION (mode) 5581 1.1 mrg == GET_MODE_UNIT_PRECISION (inner_mode)) 5582 1.1 mrg op0 = lowpart_subreg (mode, op0, inner_mode); 5583 1.1 mrg else if (GET_MODE_UNIT_PRECISION (mode) 5584 1.1 mrg < GET_MODE_UNIT_PRECISION (inner_mode)) 5585 1.1 mrg op0 = simplify_gen_unary (TRUNCATE, mode, op0, inner_mode); 5586 1.1 mrg else if (TYPE_UNSIGNED (TREE_TYPE (exp))) 5587 1.1 mrg op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); 5588 1.1 mrg else 5589 1.1 mrg op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); 5590 1.1 mrg 5591 1.1 mrg return op0; 5592 1.1 mrg } 5593 1.1 mrg 5594 1.1 mrg /* Ensure INSN_VAR_LOCATION_LOC (insn) doesn't have unbound complexity. 5595 1.1 mrg Allow 4 levels of rtl nesting for most rtl codes, and if we see anything 5596 1.1 mrg deeper than that, create DEBUG_EXPRs and emit DEBUG_INSNs before INSN. */ 5597 1.1 mrg 5598 1.1 mrg static void 5599 1.1 mrg avoid_complex_debug_insns (rtx_insn *insn, rtx *exp_p, int depth) 5600 1.1 mrg { 5601 1.1 mrg rtx exp = *exp_p; 5602 1.1 mrg 5603 1.1 mrg if (exp == NULL_RTX) 5604 1.1 mrg return; 5605 1.1 mrg 5606 1.1 mrg if ((OBJECT_P (exp) && !MEM_P (exp)) || GET_CODE (exp) == CLOBBER) 5607 1.1 mrg return; 5608 1.1 mrg 5609 1.1 mrg if (depth == 4) 5610 1.1 mrg { 5611 1.1 mrg /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */ 5612 1.1 mrg rtx dval = make_debug_expr_from_rtl (exp); 5613 1.1 mrg 5614 1.1 mrg /* Emit a debug bind insn before INSN. */ 5615 1.1 mrg rtx bind = gen_rtx_VAR_LOCATION (GET_MODE (exp), 5616 1.1 mrg DEBUG_EXPR_TREE_DECL (dval), exp, 5617 1.1 mrg VAR_INIT_STATUS_INITIALIZED); 5618 1.1 mrg 5619 1.1 mrg emit_debug_insn_before (bind, insn); 5620 1.1 mrg *exp_p = dval; 5621 1.1 mrg return; 5622 1.1 mrg } 5623 1.1 mrg 5624 1.1 mrg const char *format_ptr = GET_RTX_FORMAT (GET_CODE (exp)); 5625 1.1 mrg int i, j; 5626 1.1 mrg for (i = 0; i < GET_RTX_LENGTH (GET_CODE (exp)); i++) 5627 1.1 mrg switch (*format_ptr++) 5628 1.1 mrg { 5629 1.1 mrg case 'e': 5630 1.1 mrg avoid_complex_debug_insns (insn, &XEXP (exp, i), depth + 1); 5631 1.1 mrg break; 5632 1.1 mrg 5633 1.1 mrg case 'E': 5634 1.1 mrg case 'V': 5635 1.1 mrg for (j = 0; j < XVECLEN (exp, i); j++) 5636 1.1 mrg avoid_complex_debug_insns (insn, &XVECEXP (exp, i, j), depth + 1); 5637 1.1 mrg break; 5638 1.1 mrg 5639 1.1 mrg default: 5640 1.1 mrg break; 5641 1.1 mrg } 5642 1.1 mrg } 5643 1.1 mrg 5644 1.1 mrg /* Expand the _LOCs in debug insns. We run this after expanding all 5645 1.1 mrg regular insns, so that any variables referenced in the function 5646 1.1 mrg will have their DECL_RTLs set. */ 5647 1.1 mrg 5648 1.1 mrg static void 5649 1.1 mrg expand_debug_locations (void) 5650 1.1 mrg { 5651 1.1 mrg rtx_insn *insn; 5652 1.1 mrg rtx_insn *last = get_last_insn (); 5653 1.1 mrg int save_strict_alias = flag_strict_aliasing; 5654 1.1 mrg 5655 1.1 mrg /* New alias sets while setting up memory attributes cause 5656 1.1 mrg -fcompare-debug failures, even though it doesn't bring about any 5657 1.1 mrg codegen changes. */ 5658 1.1 mrg flag_strict_aliasing = 0; 5659 1.1 mrg 5660 1.1 mrg for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) 5661 1.1 mrg if (DEBUG_BIND_INSN_P (insn)) 5662 1.1 mrg { 5663 1.1 mrg tree value = (tree)INSN_VAR_LOCATION_LOC (insn); 5664 1.1 mrg rtx val; 5665 1.1 mrg rtx_insn *prev_insn, *insn2; 5666 1.1 mrg machine_mode mode; 5667 1.1 mrg 5668 1.1 mrg if (value == NULL_TREE) 5669 1.1 mrg val = NULL_RTX; 5670 1.1 mrg else 5671 1.1 mrg { 5672 1.1 mrg if (INSN_VAR_LOCATION_STATUS (insn) 5673 1.1 mrg == VAR_INIT_STATUS_UNINITIALIZED) 5674 1.1 mrg val = expand_debug_source_expr (value); 5675 1.1 mrg /* The avoid_deep_ter_for_debug function inserts 5676 1.1 mrg debug bind stmts after SSA_NAME definition, with the 5677 1.1 mrg SSA_NAME as the whole bind location. Disable temporarily 5678 1.1 mrg expansion of that SSA_NAME into the DEBUG_EXPR_DECL 5679 1.1 mrg being defined in this DEBUG_INSN. */ 5680 1.1 mrg else if (deep_ter_debug_map && TREE_CODE (value) == SSA_NAME) 5681 1.1 mrg { 5682 1.1 mrg tree *slot = deep_ter_debug_map->get (value); 5683 1.1 mrg if (slot) 5684 1.1 mrg { 5685 1.1 mrg if (*slot == INSN_VAR_LOCATION_DECL (insn)) 5686 1.1 mrg *slot = NULL_TREE; 5687 1.1 mrg else 5688 1.1 mrg slot = NULL; 5689 1.1 mrg } 5690 1.1 mrg val = expand_debug_expr (value); 5691 1.1 mrg if (slot) 5692 1.1 mrg *slot = INSN_VAR_LOCATION_DECL (insn); 5693 1.1 mrg } 5694 1.1 mrg else 5695 1.1 mrg val = expand_debug_expr (value); 5696 1.1 mrg gcc_assert (last == get_last_insn ()); 5697 1.1 mrg } 5698 1.1 mrg 5699 1.1 mrg if (!val) 5700 1.1 mrg val = gen_rtx_UNKNOWN_VAR_LOC (); 5701 1.1 mrg else 5702 1.1 mrg { 5703 1.1 mrg mode = GET_MODE (INSN_VAR_LOCATION (insn)); 5704 1.1 mrg 5705 1.1 mrg gcc_assert (mode == GET_MODE (val) 5706 1.1 mrg || (GET_MODE (val) == VOIDmode 5707 1.1 mrg && (CONST_SCALAR_INT_P (val) 5708 1.1 mrg || GET_CODE (val) == CONST_FIXED 5709 1.1 mrg || GET_CODE (val) == LABEL_REF))); 5710 1.1 mrg } 5711 1.1 mrg 5712 1.1 mrg INSN_VAR_LOCATION_LOC (insn) = val; 5713 1.1 mrg prev_insn = PREV_INSN (insn); 5714 1.1 mrg for (insn2 = insn; insn2 != prev_insn; insn2 = PREV_INSN (insn2)) 5715 1.1 mrg avoid_complex_debug_insns (insn2, &INSN_VAR_LOCATION_LOC (insn2), 0); 5716 1.1 mrg } 5717 1.1 mrg 5718 1.1 mrg flag_strict_aliasing = save_strict_alias; 5719 1.1 mrg } 5720 1.1 mrg 5721 1.1 mrg /* Performs swapping operands of commutative operations to expand 5722 1.1 mrg the expensive one first. */ 5723 1.1 mrg 5724 1.1 mrg static void 5725 1.1 mrg reorder_operands (basic_block bb) 5726 1.1 mrg { 5727 1.1 mrg unsigned int *lattice; /* Hold cost of each statement. */ 5728 1.1 mrg unsigned int i = 0, n = 0; 5729 1.1 mrg gimple_stmt_iterator gsi; 5730 1.1 mrg gimple_seq stmts; 5731 1.1 mrg gimple *stmt; 5732 1.1 mrg bool swap; 5733 1.1 mrg tree op0, op1; 5734 1.1 mrg ssa_op_iter iter; 5735 1.1 mrg use_operand_p use_p; 5736 1.1 mrg gimple *def0, *def1; 5737 1.1 mrg 5738 1.1 mrg /* Compute cost of each statement using estimate_num_insns. */ 5739 1.1 mrg stmts = bb_seq (bb); 5740 1.1 mrg for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi)) 5741 1.1 mrg { 5742 1.1 mrg stmt = gsi_stmt (gsi); 5743 1.1 mrg if (!is_gimple_debug (stmt)) 5744 1.1 mrg gimple_set_uid (stmt, n++); 5745 1.1 mrg } 5746 1.1 mrg lattice = XNEWVEC (unsigned int, n); 5747 1.1 mrg for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi)) 5748 1.1 mrg { 5749 1.1 mrg unsigned cost; 5750 1.1 mrg stmt = gsi_stmt (gsi); 5751 1.1 mrg if (is_gimple_debug (stmt)) 5752 1.1 mrg continue; 5753 1.1 mrg cost = estimate_num_insns (stmt, &eni_size_weights); 5754 1.1 mrg lattice[i] = cost; 5755 1.1 mrg FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) 5756 1.1 mrg { 5757 1.1 mrg tree use = USE_FROM_PTR (use_p); 5758 1.1 mrg gimple *def_stmt; 5759 1.1 mrg if (TREE_CODE (use) != SSA_NAME) 5760 1.1 mrg continue; 5761 1.1 mrg def_stmt = get_gimple_for_ssa_name (use); 5762 1.1 mrg if (!def_stmt) 5763 1.1 mrg continue; 5764 1.1 mrg lattice[i] += lattice[gimple_uid (def_stmt)]; 5765 1.1 mrg } 5766 1.1 mrg i++; 5767 1.1 mrg if (!is_gimple_assign (stmt) 5768 1.1 mrg || !commutative_tree_code (gimple_assign_rhs_code (stmt))) 5769 1.1 mrg continue; 5770 1.1 mrg op0 = gimple_op (stmt, 1); 5771 1.1 mrg op1 = gimple_op (stmt, 2); 5772 1.1 mrg if (TREE_CODE (op0) != SSA_NAME 5773 1.1 mrg || TREE_CODE (op1) != SSA_NAME) 5774 1.1 mrg continue; 5775 1.1 mrg /* Swap operands if the second one is more expensive. */ 5776 1.1 mrg def0 = get_gimple_for_ssa_name (op0); 5777 1.1 mrg def1 = get_gimple_for_ssa_name (op1); 5778 1.1 mrg if (!def1) 5779 1.1 mrg continue; 5780 1.1 mrg swap = false; 5781 1.1 mrg if (!def0 || lattice[gimple_uid (def1)] > lattice[gimple_uid (def0)]) 5782 1.1 mrg swap = true; 5783 1.1 mrg if (swap) 5784 1.1 mrg { 5785 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 5786 1.1 mrg { 5787 1.1 mrg fprintf (dump_file, "Swap operands in stmt:\n"); 5788 1.1 mrg print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 5789 1.1 mrg fprintf (dump_file, "Cost left opnd=%d, right opnd=%d\n", 5790 1.1 mrg def0 ? lattice[gimple_uid (def0)] : 0, 5791 1.1 mrg lattice[gimple_uid (def1)]); 5792 1.1 mrg } 5793 1.1 mrg swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt), 5794 1.1 mrg gimple_assign_rhs2_ptr (stmt)); 5795 1.1 mrg } 5796 1.1 mrg } 5797 1.1 mrg XDELETE (lattice); 5798 1.1 mrg } 5799 1.1 mrg 5800 1.1 mrg /* Expand basic block BB from GIMPLE trees to RTL. */ 5801 1.1 mrg 5802 1.1 mrg static basic_block 5803 1.1 mrg expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) 5804 1.1 mrg { 5805 1.1 mrg gimple_stmt_iterator gsi; 5806 1.1 mrg gimple_seq stmts; 5807 1.1 mrg gimple *stmt = NULL; 5808 1.1 mrg rtx_note *note = NULL; 5809 1.1 mrg rtx_insn *last; 5810 1.1 mrg edge e; 5811 1.1 mrg edge_iterator ei; 5812 1.1 mrg bool nondebug_stmt_seen = false; 5813 1.1 mrg 5814 1.1 mrg if (dump_file) 5815 1.1 mrg fprintf (dump_file, "\n;; Generating RTL for gimple basic block %d\n", 5816 1.1 mrg bb->index); 5817 1.1 mrg 5818 1.1 mrg /* Note that since we are now transitioning from GIMPLE to RTL, we 5819 1.1 mrg cannot use the gsi_*_bb() routines because they expect the basic 5820 1.1 mrg block to be in GIMPLE, instead of RTL. Therefore, we need to 5821 1.1 mrg access the BB sequence directly. */ 5822 1.1 mrg if (optimize) 5823 1.1 mrg reorder_operands (bb); 5824 1.1 mrg stmts = bb_seq (bb); 5825 1.1 mrg bb->il.gimple.seq = NULL; 5826 1.1 mrg bb->il.gimple.phi_nodes = NULL; 5827 1.1 mrg rtl_profile_for_bb (bb); 5828 1.1 mrg init_rtl_bb_info (bb); 5829 1.1 mrg bb->flags |= BB_RTL; 5830 1.1 mrg 5831 1.1 mrg /* Remove the RETURN_EXPR if we may fall though to the exit 5832 1.1 mrg instead. */ 5833 1.1 mrg gsi = gsi_last (stmts); 5834 1.1 mrg if (!gsi_end_p (gsi) 5835 1.1 mrg && gimple_code (gsi_stmt (gsi)) == GIMPLE_RETURN) 5836 1.1 mrg { 5837 1.1 mrg greturn *ret_stmt = as_a <greturn *> (gsi_stmt (gsi)); 5838 1.1 mrg 5839 1.1 mrg gcc_assert (single_succ_p (bb)); 5840 1.1 mrg gcc_assert (single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun)); 5841 1.1 mrg 5842 1.1 mrg if (bb->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun) 5843 1.1 mrg && !gimple_return_retval (ret_stmt)) 5844 1.1 mrg { 5845 1.1 mrg gsi_remove (&gsi, false); 5846 1.1 mrg single_succ_edge (bb)->flags |= EDGE_FALLTHRU; 5847 1.1 mrg } 5848 1.1 mrg } 5849 1.1 mrg 5850 1.1 mrg gsi = gsi_start (stmts); 5851 1.1 mrg if (!gsi_end_p (gsi)) 5852 1.1 mrg { 5853 1.1 mrg stmt = gsi_stmt (gsi); 5854 1.1 mrg if (gimple_code (stmt) != GIMPLE_LABEL) 5855 1.1 mrg stmt = NULL; 5856 1.1 mrg } 5857 1.1 mrg 5858 1.1 mrg rtx_code_label **elt = lab_rtx_for_bb->get (bb); 5859 1.1 mrg 5860 1.1 mrg if (stmt || elt) 5861 1.1 mrg { 5862 1.1 mrg gcc_checking_assert (!note); 5863 1.1 mrg last = get_last_insn (); 5864 1.1 mrg 5865 1.1 mrg if (stmt) 5866 1.1 mrg { 5867 1.1 mrg expand_gimple_stmt (stmt); 5868 1.1 mrg gsi_next (&gsi); 5869 1.1 mrg } 5870 1.1 mrg 5871 1.1 mrg if (elt) 5872 1.1 mrg emit_label (*elt); 5873 1.1 mrg 5874 1.1 mrg BB_HEAD (bb) = NEXT_INSN (last); 5875 1.1 mrg if (NOTE_P (BB_HEAD (bb))) 5876 1.1 mrg BB_HEAD (bb) = NEXT_INSN (BB_HEAD (bb)); 5877 1.1 mrg gcc_assert (LABEL_P (BB_HEAD (bb))); 5878 1.1 mrg note = emit_note_after (NOTE_INSN_BASIC_BLOCK, BB_HEAD (bb)); 5879 1.1 mrg 5880 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last); 5881 1.1 mrg } 5882 1.1 mrg else 5883 1.1 mrg BB_HEAD (bb) = note = emit_note (NOTE_INSN_BASIC_BLOCK); 5884 1.1 mrg 5885 1.1 mrg if (note) 5886 1.1 mrg NOTE_BASIC_BLOCK (note) = bb; 5887 1.1 mrg 5888 1.1 mrg for (; !gsi_end_p (gsi); gsi_next (&gsi)) 5889 1.1 mrg { 5890 1.1 mrg basic_block new_bb; 5891 1.1 mrg 5892 1.1 mrg stmt = gsi_stmt (gsi); 5893 1.1 mrg if (!is_gimple_debug (stmt)) 5894 1.1 mrg nondebug_stmt_seen = true; 5895 1.1 mrg 5896 1.1 mrg /* If this statement is a non-debug one, and we generate debug 5897 1.1 mrg insns, then this one might be the last real use of a TERed 5898 1.1 mrg SSA_NAME, but where there are still some debug uses further 5899 1.1 mrg down. Expanding the current SSA name in such further debug 5900 1.1 mrg uses by their RHS might lead to wrong debug info, as coalescing 5901 1.1 mrg might make the operands of such RHS be placed into the same 5902 1.1 mrg pseudo as something else. Like so: 5903 1.1 mrg a_1 = a_0 + 1; // Assume a_1 is TERed and a_0 is dead 5904 1.1 mrg use(a_1); 5905 1.1 mrg a_2 = ... 5906 1.1 mrg #DEBUG ... => a_1 5907 1.1 mrg As a_0 and a_2 don't overlap in lifetime, assume they are coalesced. 5908 1.1 mrg If we now would expand a_1 by it's RHS (a_0 + 1) in the debug use, 5909 1.1 mrg the write to a_2 would actually have clobbered the place which 5910 1.1 mrg formerly held a_0. 5911 1.1 mrg 5912 1.1 mrg So, instead of that, we recognize the situation, and generate 5913 1.1 mrg debug temporaries at the last real use of TERed SSA names: 5914 1.1 mrg a_1 = a_0 + 1; 5915 1.1 mrg #DEBUG #D1 => a_1 5916 1.1 mrg use(a_1); 5917 1.1 mrg a_2 = ... 5918 1.1 mrg #DEBUG ... => #D1 5919 1.1 mrg */ 5920 1.1 mrg if (MAY_HAVE_DEBUG_BIND_INSNS 5921 1.1 mrg && SA.values 5922 1.1 mrg && !is_gimple_debug (stmt)) 5923 1.1 mrg { 5924 1.1 mrg ssa_op_iter iter; 5925 1.1 mrg tree op; 5926 1.1 mrg gimple *def; 5927 1.1 mrg 5928 1.1 mrg location_t sloc = curr_insn_location (); 5929 1.1 mrg 5930 1.1 mrg /* Look for SSA names that have their last use here (TERed 5931 1.1 mrg names always have only one real use). */ 5932 1.1 mrg FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE) 5933 1.1 mrg if ((def = get_gimple_for_ssa_name (op))) 5934 1.1 mrg { 5935 1.1 mrg imm_use_iterator imm_iter; 5936 1.1 mrg use_operand_p use_p; 5937 1.1 mrg bool have_debug_uses = false; 5938 1.1 mrg 5939 1.1 mrg FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op) 5940 1.1 mrg { 5941 1.1 mrg if (gimple_debug_bind_p (USE_STMT (use_p))) 5942 1.1 mrg { 5943 1.1 mrg have_debug_uses = true; 5944 1.1 mrg break; 5945 1.1 mrg } 5946 1.1 mrg } 5947 1.1 mrg 5948 1.1 mrg if (have_debug_uses) 5949 1.1 mrg { 5950 1.1 mrg /* OP is a TERed SSA name, with DEF its defining 5951 1.1 mrg statement, and where OP is used in further debug 5952 1.1 mrg instructions. Generate a debug temporary, and 5953 1.1 mrg replace all uses of OP in debug insns with that 5954 1.1 mrg temporary. */ 5955 1.1 mrg gimple *debugstmt; 5956 1.1 mrg tree value = gimple_assign_rhs_to_tree (def); 5957 1.1 mrg tree vexpr = build_debug_expr_decl (TREE_TYPE (value)); 5958 1.1 mrg rtx val; 5959 1.1 mrg machine_mode mode; 5960 1.1 mrg 5961 1.1 mrg set_curr_insn_location (gimple_location (def)); 5962 1.1 mrg 5963 1.1 mrg if (DECL_P (value)) 5964 1.1 mrg mode = DECL_MODE (value); 5965 1.1 mrg else 5966 1.1 mrg mode = TYPE_MODE (TREE_TYPE (value)); 5967 1.1 mrg /* FIXME: Is setting the mode really necessary? */ 5968 1.1 mrg SET_DECL_MODE (vexpr, mode); 5969 1.1 mrg 5970 1.1 mrg val = gen_rtx_VAR_LOCATION 5971 1.1 mrg (mode, vexpr, (rtx)value, VAR_INIT_STATUS_INITIALIZED); 5972 1.1 mrg 5973 1.1 mrg emit_debug_insn (val); 5974 1.1 mrg 5975 1.1 mrg FOR_EACH_IMM_USE_STMT (debugstmt, imm_iter, op) 5976 1.1 mrg { 5977 1.1 mrg if (!gimple_debug_bind_p (debugstmt)) 5978 1.1 mrg continue; 5979 1.1 mrg 5980 1.1 mrg FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) 5981 1.1 mrg SET_USE (use_p, vexpr); 5982 1.1 mrg 5983 1.1 mrg update_stmt (debugstmt); 5984 1.1 mrg } 5985 1.1 mrg } 5986 1.1 mrg } 5987 1.1 mrg set_curr_insn_location (sloc); 5988 1.1 mrg } 5989 1.1 mrg 5990 1.1 mrg currently_expanding_gimple_stmt = stmt; 5991 1.1 mrg 5992 1.1 mrg /* Expand this statement, then evaluate the resulting RTL and 5993 1.1 mrg fixup the CFG accordingly. */ 5994 1.1 mrg if (gimple_code (stmt) == GIMPLE_COND) 5995 1.1 mrg { 5996 1.1 mrg new_bb = expand_gimple_cond (bb, as_a <gcond *> (stmt)); 5997 1.1 mrg if (new_bb) 5998 1.1 mrg { 5999 1.1 mrg currently_expanding_gimple_stmt = NULL; 6000 1.1 mrg return new_bb; 6001 1.1 mrg } 6002 1.1 mrg } 6003 1.1 mrg else if (is_gimple_debug (stmt)) 6004 1.1 mrg { 6005 1.1 mrg location_t sloc = curr_insn_location (); 6006 1.1 mrg gimple_stmt_iterator nsi = gsi; 6007 1.1 mrg 6008 1.1 mrg for (;;) 6009 1.1 mrg { 6010 1.1 mrg tree var; 6011 1.1 mrg tree value = NULL_TREE; 6012 1.1 mrg rtx val = NULL_RTX; 6013 1.1 mrg machine_mode mode; 6014 1.1 mrg 6015 1.1 mrg if (!gimple_debug_nonbind_marker_p (stmt)) 6016 1.1 mrg { 6017 1.1 mrg if (gimple_debug_bind_p (stmt)) 6018 1.1 mrg { 6019 1.1 mrg var = gimple_debug_bind_get_var (stmt); 6020 1.1 mrg 6021 1.1 mrg if (TREE_CODE (var) != DEBUG_EXPR_DECL 6022 1.1 mrg && TREE_CODE (var) != LABEL_DECL 6023 1.1 mrg && !target_for_debug_bind (var)) 6024 1.1 mrg goto delink_debug_stmt; 6025 1.1 mrg 6026 1.1 mrg if (DECL_P (var) && !VECTOR_TYPE_P (TREE_TYPE (var))) 6027 1.1 mrg mode = DECL_MODE (var); 6028 1.1 mrg else 6029 1.1 mrg mode = TYPE_MODE (TREE_TYPE (var)); 6030 1.1 mrg 6031 1.1 mrg if (gimple_debug_bind_has_value_p (stmt)) 6032 1.1 mrg value = gimple_debug_bind_get_value (stmt); 6033 1.1 mrg 6034 1.1 mrg val = gen_rtx_VAR_LOCATION 6035 1.1 mrg (mode, var, (rtx)value, VAR_INIT_STATUS_INITIALIZED); 6036 1.1 mrg } 6037 1.1 mrg else if (gimple_debug_source_bind_p (stmt)) 6038 1.1 mrg { 6039 1.1 mrg var = gimple_debug_source_bind_get_var (stmt); 6040 1.1 mrg 6041 1.1 mrg value = gimple_debug_source_bind_get_value (stmt); 6042 1.1 mrg 6043 1.1 mrg if (!VECTOR_TYPE_P (TREE_TYPE (var))) 6044 1.1 mrg mode = DECL_MODE (var); 6045 1.1 mrg else 6046 1.1 mrg mode = TYPE_MODE (TREE_TYPE (var)); 6047 1.1 mrg 6048 1.1 mrg val = gen_rtx_VAR_LOCATION (mode, var, (rtx)value, 6049 1.1 mrg VAR_INIT_STATUS_UNINITIALIZED); 6050 1.1 mrg } 6051 1.1 mrg else 6052 1.1 mrg gcc_unreachable (); 6053 1.1 mrg } 6054 1.1 mrg /* If this function was first compiled with markers 6055 1.1 mrg enabled, but they're now disable (e.g. LTO), drop 6056 1.1 mrg them on the floor. */ 6057 1.1 mrg else if (gimple_debug_nonbind_marker_p (stmt) 6058 1.1 mrg && !MAY_HAVE_DEBUG_MARKER_INSNS) 6059 1.1 mrg goto delink_debug_stmt; 6060 1.1 mrg else if (gimple_debug_begin_stmt_p (stmt)) 6061 1.1 mrg val = GEN_RTX_DEBUG_MARKER_BEGIN_STMT_PAT (); 6062 1.1 mrg else if (gimple_debug_inline_entry_p (stmt)) 6063 1.1 mrg val = GEN_RTX_DEBUG_MARKER_INLINE_ENTRY_PAT (); 6064 1.1 mrg else 6065 1.1 mrg gcc_unreachable (); 6066 1.1 mrg 6067 1.1 mrg last = get_last_insn (); 6068 1.1 mrg 6069 1.1 mrg set_curr_insn_location (gimple_location (stmt)); 6070 1.1 mrg 6071 1.1 mrg emit_debug_insn (val); 6072 1.1 mrg 6073 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 6074 1.1 mrg { 6075 1.1 mrg /* We can't dump the insn with a TREE where an RTX 6076 1.1 mrg is expected. */ 6077 1.1 mrg if (GET_CODE (val) == VAR_LOCATION) 6078 1.1 mrg { 6079 1.1 mrg gcc_checking_assert (PAT_VAR_LOCATION_LOC (val) == (rtx)value); 6080 1.1 mrg PAT_VAR_LOCATION_LOC (val) = const0_rtx; 6081 1.1 mrg } 6082 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last); 6083 1.1 mrg if (GET_CODE (val) == VAR_LOCATION) 6084 1.1 mrg PAT_VAR_LOCATION_LOC (val) = (rtx)value; 6085 1.1 mrg } 6086 1.1 mrg 6087 1.1 mrg delink_debug_stmt: 6088 1.1 mrg /* In order not to generate too many debug temporaries, 6089 1.1 mrg we delink all uses of debug statements we already expanded. 6090 1.1 mrg Therefore debug statements between definition and real 6091 1.1 mrg use of TERed SSA names will continue to use the SSA name, 6092 1.1 mrg and not be replaced with debug temps. */ 6093 1.1 mrg delink_stmt_imm_use (stmt); 6094 1.1 mrg 6095 1.1 mrg gsi = nsi; 6096 1.1 mrg gsi_next (&nsi); 6097 1.1 mrg if (gsi_end_p (nsi)) 6098 1.1 mrg break; 6099 1.1 mrg stmt = gsi_stmt (nsi); 6100 1.1 mrg if (!is_gimple_debug (stmt)) 6101 1.1 mrg break; 6102 1.1 mrg } 6103 1.1 mrg 6104 1.1 mrg set_curr_insn_location (sloc); 6105 1.1 mrg } 6106 1.1 mrg else 6107 1.1 mrg { 6108 1.1 mrg gcall *call_stmt = dyn_cast <gcall *> (stmt); 6109 1.1 mrg if (call_stmt 6110 1.1 mrg && gimple_call_tail_p (call_stmt) 6111 1.1 mrg && disable_tail_calls) 6112 1.1 mrg gimple_call_set_tail (call_stmt, false); 6113 1.1 mrg 6114 1.1 mrg if (call_stmt && gimple_call_tail_p (call_stmt)) 6115 1.1 mrg { 6116 1.1 mrg bool can_fallthru; 6117 1.1 mrg new_bb = expand_gimple_tailcall (bb, call_stmt, &can_fallthru); 6118 1.1 mrg if (new_bb) 6119 1.1 mrg { 6120 1.1 mrg if (can_fallthru) 6121 1.1 mrg bb = new_bb; 6122 1.1 mrg else 6123 1.1 mrg { 6124 1.1 mrg currently_expanding_gimple_stmt = NULL; 6125 1.1 mrg return new_bb; 6126 1.1 mrg } 6127 1.1 mrg } 6128 1.1 mrg } 6129 1.1 mrg else 6130 1.1 mrg { 6131 1.1 mrg def_operand_p def_p; 6132 1.1 mrg def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF); 6133 1.1 mrg 6134 1.1 mrg if (def_p != NULL) 6135 1.1 mrg { 6136 1.1 mrg /* Ignore this stmt if it is in the list of 6137 1.1 mrg replaceable expressions. */ 6138 1.1 mrg if (SA.values 6139 1.1 mrg && bitmap_bit_p (SA.values, 6140 1.1 mrg SSA_NAME_VERSION (DEF_FROM_PTR (def_p)))) 6141 1.1 mrg continue; 6142 1.1 mrg } 6143 1.1 mrg last = expand_gimple_stmt (stmt); 6144 1.1 mrg maybe_dump_rtl_for_gimple_stmt (stmt, last); 6145 1.1 mrg } 6146 1.1 mrg } 6147 1.1 mrg } 6148 1.1 mrg 6149 1.1 mrg currently_expanding_gimple_stmt = NULL; 6150 1.1 mrg 6151 1.1 mrg /* Expand implicit goto and convert goto_locus. */ 6152 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs) 6153 1.1 mrg { 6154 1.1 mrg if (e->goto_locus != UNKNOWN_LOCATION || !nondebug_stmt_seen) 6155 1.1 mrg set_curr_insn_location (e->goto_locus); 6156 1.1 mrg if ((e->flags & EDGE_FALLTHRU) && e->dest != bb->next_bb) 6157 1.1 mrg { 6158 1.1 mrg emit_jump (label_rtx_for_bb (e->dest)); 6159 1.1 mrg e->flags &= ~EDGE_FALLTHRU; 6160 1.1 mrg } 6161 1.1 mrg } 6162 1.1 mrg 6163 1.1 mrg /* Expanded RTL can create a jump in the last instruction of block. 6164 1.1 mrg This later might be assumed to be a jump to successor and break edge insertion. 6165 1.1 mrg We need to insert dummy move to prevent this. PR41440. */ 6166 1.1 mrg if (single_succ_p (bb) 6167 1.1 mrg && (single_succ_edge (bb)->flags & EDGE_FALLTHRU) 6168 1.1 mrg && (last = get_last_insn ()) 6169 1.1 mrg && (JUMP_P (last) 6170 1.1 mrg || (DEBUG_INSN_P (last) 6171 1.1 mrg && JUMP_P (prev_nondebug_insn (last))))) 6172 1.1 mrg { 6173 1.1 mrg rtx dummy = gen_reg_rtx (SImode); 6174 1.1 mrg emit_insn_after_noloc (gen_move_insn (dummy, dummy), last, NULL); 6175 1.1 mrg } 6176 1.1 mrg 6177 1.1 mrg do_pending_stack_adjust (); 6178 1.1 mrg 6179 1.1 mrg /* Find the block tail. The last insn in the block is the insn 6180 1.1 mrg before a barrier and/or table jump insn. */ 6181 1.1 mrg last = get_last_insn (); 6182 1.1 mrg if (BARRIER_P (last)) 6183 1.1 mrg last = PREV_INSN (last); 6184 1.1 mrg if (JUMP_TABLE_DATA_P (last)) 6185 1.1 mrg last = PREV_INSN (PREV_INSN (last)); 6186 1.1 mrg if (BARRIER_P (last)) 6187 1.1 mrg last = PREV_INSN (last); 6188 1.1 mrg BB_END (bb) = last; 6189 1.1 mrg 6190 1.1 mrg update_bb_for_insn (bb); 6191 1.1 mrg 6192 1.1 mrg return bb; 6193 1.1 mrg } 6194 1.1 mrg 6195 1.1 mrg 6196 1.1 mrg /* Create a basic block for initialization code. */ 6197 1.1 mrg 6198 1.1 mrg static basic_block 6199 1.1 mrg construct_init_block (void) 6200 1.1 mrg { 6201 1.1 mrg basic_block init_block, first_block; 6202 1.1 mrg edge e = NULL; 6203 1.1 mrg int flags; 6204 1.1 mrg 6205 1.1 mrg /* Multiple entry points not supported yet. */ 6206 1.1 mrg gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs) == 1); 6207 1.1 mrg init_rtl_bb_info (ENTRY_BLOCK_PTR_FOR_FN (cfun)); 6208 1.1 mrg init_rtl_bb_info (EXIT_BLOCK_PTR_FOR_FN (cfun)); 6209 1.1 mrg ENTRY_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_RTL; 6210 1.1 mrg EXIT_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_RTL; 6211 1.1 mrg 6212 1.1 mrg e = EDGE_SUCC (ENTRY_BLOCK_PTR_FOR_FN (cfun), 0); 6213 1.1 mrg 6214 1.1 mrg /* When entry edge points to first basic block, we don't need jump, 6215 1.1 mrg otherwise we have to jump into proper target. */ 6216 1.1 mrg if (e && e->dest != ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb) 6217 1.1 mrg { 6218 1.1 mrg tree label = gimple_block_label (e->dest); 6219 1.1 mrg 6220 1.1 mrg emit_jump (jump_target_rtx (label)); 6221 1.1 mrg flags = 0; 6222 1.1 mrg } 6223 1.1 mrg else 6224 1.1 mrg flags = EDGE_FALLTHRU; 6225 1.1 mrg 6226 1.1 mrg init_block = create_basic_block (NEXT_INSN (get_insns ()), 6227 1.1 mrg get_last_insn (), 6228 1.1 mrg ENTRY_BLOCK_PTR_FOR_FN (cfun)); 6229 1.1 mrg init_block->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; 6230 1.1 mrg add_bb_to_loop (init_block, ENTRY_BLOCK_PTR_FOR_FN (cfun)->loop_father); 6231 1.1 mrg if (e) 6232 1.1 mrg { 6233 1.1 mrg first_block = e->dest; 6234 1.1 mrg redirect_edge_succ (e, init_block); 6235 1.1 mrg make_single_succ_edge (init_block, first_block, flags); 6236 1.1 mrg } 6237 1.1 mrg else 6238 1.1 mrg make_single_succ_edge (init_block, EXIT_BLOCK_PTR_FOR_FN (cfun), 6239 1.1 mrg EDGE_FALLTHRU); 6240 1.1 mrg 6241 1.1 mrg update_bb_for_insn (init_block); 6242 1.1 mrg return init_block; 6243 1.1 mrg } 6244 1.1 mrg 6245 1.1 mrg /* For each lexical block, set BLOCK_NUMBER to the depth at which it is 6246 1.1 mrg found in the block tree. */ 6247 1.1 mrg 6248 1.1 mrg static void 6249 1.1 mrg set_block_levels (tree block, int level) 6250 1.1 mrg { 6251 1.1 mrg while (block) 6252 1.1 mrg { 6253 1.1 mrg BLOCK_NUMBER (block) = level; 6254 1.1 mrg set_block_levels (BLOCK_SUBBLOCKS (block), level + 1); 6255 1.1 mrg block = BLOCK_CHAIN (block); 6256 1.1 mrg } 6257 1.1 mrg } 6258 1.1 mrg 6259 1.1 mrg /* Create a block containing landing pads and similar stuff. */ 6260 1.1 mrg 6261 1.1 mrg static void 6262 1.1 mrg construct_exit_block (void) 6263 1.1 mrg { 6264 1.1 mrg rtx_insn *head = get_last_insn (); 6265 1.1 mrg rtx_insn *end; 6266 1.1 mrg basic_block exit_block; 6267 1.1 mrg edge e, e2; 6268 1.1 mrg unsigned ix; 6269 1.1 mrg edge_iterator ei; 6270 1.1 mrg basic_block prev_bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb; 6271 1.1 mrg rtx_insn *orig_end = BB_END (prev_bb); 6272 1.1 mrg 6273 1.1 mrg rtl_profile_for_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)); 6274 1.1 mrg 6275 1.1 mrg /* Make sure the locus is set to the end of the function, so that 6276 1.1 mrg epilogue line numbers and warnings are set properly. */ 6277 1.1 mrg if (LOCATION_LOCUS (cfun->function_end_locus) != UNKNOWN_LOCATION) 6278 1.1 mrg input_location = cfun->function_end_locus; 6279 1.1 mrg 6280 1.1 mrg /* Generate rtl for function exit. */ 6281 1.1 mrg expand_function_end (); 6282 1.1 mrg 6283 1.1 mrg end = get_last_insn (); 6284 1.1 mrg if (head == end) 6285 1.1 mrg return; 6286 1.1 mrg /* While emitting the function end we could move end of the last basic 6287 1.1 mrg block. */ 6288 1.1 mrg BB_END (prev_bb) = orig_end; 6289 1.1 mrg while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head))) 6290 1.1 mrg head = NEXT_INSN (head); 6291 1.1 mrg /* But make sure exit_block starts with RETURN_LABEL, otherwise the 6292 1.1 mrg bb count counting will be confused. Any instructions before that 6293 1.1 mrg label are emitted for the case where PREV_BB falls through into the 6294 1.1 mrg exit block, so append those instructions to prev_bb in that case. */ 6295 1.1 mrg if (NEXT_INSN (head) != return_label) 6296 1.1 mrg { 6297 1.1 mrg while (NEXT_INSN (head) != return_label) 6298 1.1 mrg { 6299 1.1 mrg if (!NOTE_P (NEXT_INSN (head))) 6300 1.1 mrg BB_END (prev_bb) = NEXT_INSN (head); 6301 1.1 mrg head = NEXT_INSN (head); 6302 1.1 mrg } 6303 1.1 mrg } 6304 1.1 mrg exit_block = create_basic_block (NEXT_INSN (head), end, prev_bb); 6305 1.1 mrg exit_block->count = EXIT_BLOCK_PTR_FOR_FN (cfun)->count; 6306 1.1 mrg add_bb_to_loop (exit_block, EXIT_BLOCK_PTR_FOR_FN (cfun)->loop_father); 6307 1.1 mrg 6308 1.1 mrg ix = 0; 6309 1.1 mrg while (ix < EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)) 6310 1.1 mrg { 6311 1.1 mrg e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), ix); 6312 1.1 mrg if (!(e->flags & EDGE_ABNORMAL)) 6313 1.1 mrg redirect_edge_succ (e, exit_block); 6314 1.1 mrg else 6315 1.1 mrg ix++; 6316 1.1 mrg } 6317 1.1 mrg 6318 1.1 mrg e = make_single_succ_edge (exit_block, EXIT_BLOCK_PTR_FOR_FN (cfun), 6319 1.1 mrg EDGE_FALLTHRU); 6320 1.1 mrg FOR_EACH_EDGE (e2, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) 6321 1.1 mrg if (e2 != e) 6322 1.1 mrg { 6323 1.1 mrg exit_block->count -= e2->count (); 6324 1.1 mrg } 6325 1.1 mrg update_bb_for_insn (exit_block); 6326 1.1 mrg } 6327 1.1 mrg 6328 1.1 mrg /* Helper function for discover_nonconstant_array_refs. 6329 1.1 mrg Look for ARRAY_REF nodes with non-constant indexes and mark them 6330 1.1 mrg addressable. */ 6331 1.1 mrg 6332 1.1 mrg static tree 6333 1.1 mrg discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees, 6334 1.1 mrg void *data) 6335 1.1 mrg { 6336 1.1 mrg tree t = *tp; 6337 1.1 mrg bitmap forced_stack_vars = (bitmap)((walk_stmt_info *)data)->info; 6338 1.1 mrg 6339 1.1 mrg if (IS_TYPE_OR_DECL_P (t)) 6340 1.1 mrg *walk_subtrees = 0; 6341 1.4 mrg else if (REFERENCE_CLASS_P (t) && TREE_THIS_VOLATILE (t)) 6342 1.4 mrg { 6343 1.4 mrg t = get_base_address (t); 6344 1.4 mrg if (t && DECL_P (t) 6345 1.4 mrg && DECL_MODE (t) != BLKmode 6346 1.4 mrg && !TREE_ADDRESSABLE (t)) 6347 1.4 mrg bitmap_set_bit (forced_stack_vars, DECL_UID (t)); 6348 1.4 mrg *walk_subtrees = 0; 6349 1.4 mrg } 6350 1.1 mrg else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) 6351 1.1 mrg { 6352 1.1 mrg while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) 6353 1.1 mrg && is_gimple_min_invariant (TREE_OPERAND (t, 1)) 6354 1.1 mrg && (!TREE_OPERAND (t, 2) 6355 1.1 mrg || is_gimple_min_invariant (TREE_OPERAND (t, 2)))) 6356 1.1 mrg || (TREE_CODE (t) == COMPONENT_REF 6357 1.1 mrg && (!TREE_OPERAND (t,2) 6358 1.1 mrg || is_gimple_min_invariant (TREE_OPERAND (t, 2)))) 6359 1.1 mrg || TREE_CODE (t) == BIT_FIELD_REF 6360 1.1 mrg || TREE_CODE (t) == REALPART_EXPR 6361 1.1 mrg || TREE_CODE (t) == IMAGPART_EXPR 6362 1.1 mrg || TREE_CODE (t) == VIEW_CONVERT_EXPR 6363 1.1 mrg || CONVERT_EXPR_P (t)) 6364 1.1 mrg t = TREE_OPERAND (t, 0); 6365 1.1 mrg 6366 1.1 mrg if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF) 6367 1.1 mrg { 6368 1.1 mrg t = get_base_address (t); 6369 1.1 mrg if (t && DECL_P (t) 6370 1.1 mrg && DECL_MODE (t) != BLKmode 6371 1.1 mrg && !TREE_ADDRESSABLE (t)) 6372 1.1 mrg bitmap_set_bit (forced_stack_vars, DECL_UID (t)); 6373 1.1 mrg } 6374 1.1 mrg 6375 1.1 mrg *walk_subtrees = 0; 6376 1.1 mrg } 6377 1.1 mrg /* References of size POLY_INT_CST to a fixed-size object must go 6378 1.1 mrg through memory. It's more efficient to force that here than 6379 1.1 mrg to create temporary slots on the fly. 6380 1.5 mrg RTL expansion expectes TARGET_MEM_REF to always address actual memory. 6381 1.5 mrg Also, force to stack non-BLKmode vars accessed through VIEW_CONVERT_EXPR 6382 1.5 mrg to BLKmode type. */ 6383 1.1 mrg else if (TREE_CODE (t) == TARGET_MEM_REF 6384 1.1 mrg || (TREE_CODE (t) == MEM_REF 6385 1.1 mrg && TYPE_SIZE (TREE_TYPE (t)) 6386 1.5 mrg && POLY_INT_CST_P (TYPE_SIZE (TREE_TYPE (t)))) 6387 1.5 mrg || (TREE_CODE (t) == VIEW_CONVERT_EXPR 6388 1.5 mrg && TYPE_MODE (TREE_TYPE (t)) == BLKmode)) 6389 1.1 mrg { 6390 1.1 mrg tree base = get_base_address (t); 6391 1.1 mrg if (base 6392 1.1 mrg && DECL_P (base) 6393 1.1 mrg && !TREE_ADDRESSABLE (base) 6394 1.1 mrg && DECL_MODE (base) != BLKmode 6395 1.1 mrg && GET_MODE_SIZE (DECL_MODE (base)).is_constant ()) 6396 1.1 mrg bitmap_set_bit (forced_stack_vars, DECL_UID (base)); 6397 1.1 mrg *walk_subtrees = 0; 6398 1.1 mrg } 6399 1.1 mrg 6400 1.1 mrg return NULL_TREE; 6401 1.1 mrg } 6402 1.1 mrg 6403 1.1 mrg /* If there's a chance to get a pseudo for t then if it would be of float mode 6404 1.1 mrg and the actual access is via an integer mode (lowered memcpy or similar 6405 1.1 mrg access) then avoid the register expansion if the mode likely is not storage 6406 1.1 mrg suitable for raw bits processing (like XFmode on i?86). */ 6407 1.1 mrg 6408 1.1 mrg static void 6409 1.1 mrg avoid_type_punning_on_regs (tree t, bitmap forced_stack_vars) 6410 1.1 mrg { 6411 1.1 mrg machine_mode access_mode = TYPE_MODE (TREE_TYPE (t)); 6412 1.1 mrg if (access_mode != BLKmode 6413 1.1 mrg && !SCALAR_INT_MODE_P (access_mode)) 6414 1.1 mrg return; 6415 1.1 mrg tree base = get_base_address (t); 6416 1.1 mrg if (DECL_P (base) 6417 1.1 mrg && !TREE_ADDRESSABLE (base) 6418 1.1 mrg && FLOAT_MODE_P (DECL_MODE (base)) 6419 1.1 mrg && maybe_lt (GET_MODE_PRECISION (DECL_MODE (base)), 6420 1.1 mrg GET_MODE_BITSIZE (GET_MODE_INNER (DECL_MODE (base)))) 6421 1.1 mrg /* Double check in the expensive way we really would get a pseudo. */ 6422 1.1 mrg && use_register_for_decl (base)) 6423 1.1 mrg bitmap_set_bit (forced_stack_vars, DECL_UID (base)); 6424 1.1 mrg } 6425 1.1 mrg 6426 1.1 mrg /* RTL expansion is not able to compile array references with variable 6427 1.1 mrg offsets for arrays stored in single register. Discover such 6428 1.1 mrg expressions and mark variables as addressable to avoid this 6429 1.1 mrg scenario. */ 6430 1.1 mrg 6431 1.1 mrg static void 6432 1.1 mrg discover_nonconstant_array_refs (bitmap forced_stack_vars) 6433 1.1 mrg { 6434 1.1 mrg basic_block bb; 6435 1.1 mrg gimple_stmt_iterator gsi; 6436 1.1 mrg 6437 1.1 mrg walk_stmt_info wi = {}; 6438 1.1 mrg wi.info = forced_stack_vars; 6439 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 6440 1.1 mrg for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 6441 1.1 mrg { 6442 1.1 mrg gimple *stmt = gsi_stmt (gsi); 6443 1.1 mrg if (!is_gimple_debug (stmt)) 6444 1.1 mrg { 6445 1.1 mrg walk_gimple_op (stmt, discover_nonconstant_array_refs_r, &wi); 6446 1.1 mrg gcall *call = dyn_cast <gcall *> (stmt); 6447 1.1 mrg if (call && gimple_call_internal_p (call)) 6448 1.1 mrg { 6449 1.1 mrg tree cand = NULL_TREE; 6450 1.1 mrg switch (gimple_call_internal_fn (call)) 6451 1.1 mrg { 6452 1.1 mrg case IFN_LOAD_LANES: 6453 1.1 mrg /* The source must be a MEM. */ 6454 1.1 mrg cand = gimple_call_arg (call, 0); 6455 1.1 mrg break; 6456 1.1 mrg case IFN_STORE_LANES: 6457 1.1 mrg /* The destination must be a MEM. */ 6458 1.1 mrg cand = gimple_call_lhs (call); 6459 1.1 mrg break; 6460 1.1 mrg default: 6461 1.1 mrg break; 6462 1.1 mrg } 6463 1.1 mrg if (cand) 6464 1.1 mrg cand = get_base_address (cand); 6465 1.1 mrg if (cand 6466 1.1 mrg && DECL_P (cand) 6467 1.1 mrg && use_register_for_decl (cand)) 6468 1.1 mrg bitmap_set_bit (forced_stack_vars, DECL_UID (cand)); 6469 1.1 mrg } 6470 1.1 mrg if (gimple_vdef (stmt)) 6471 1.1 mrg { 6472 1.1 mrg tree t = gimple_get_lhs (stmt); 6473 1.1 mrg if (t && REFERENCE_CLASS_P (t)) 6474 1.1 mrg avoid_type_punning_on_regs (t, forced_stack_vars); 6475 1.1 mrg } 6476 1.1 mrg } 6477 1.1 mrg } 6478 1.1 mrg } 6479 1.1 mrg 6480 1.1 mrg /* This function sets crtl->args.internal_arg_pointer to a virtual 6481 1.1 mrg register if DRAP is needed. Local register allocator will replace 6482 1.1 mrg virtual_incoming_args_rtx with the virtual register. */ 6483 1.1 mrg 6484 1.1 mrg static void 6485 1.1 mrg expand_stack_alignment (void) 6486 1.1 mrg { 6487 1.1 mrg rtx drap_rtx; 6488 1.1 mrg unsigned int preferred_stack_boundary; 6489 1.1 mrg 6490 1.1 mrg if (! SUPPORTS_STACK_ALIGNMENT) 6491 1.1 mrg return; 6492 1.1 mrg 6493 1.1 mrg if (cfun->calls_alloca 6494 1.1 mrg || cfun->has_nonlocal_label 6495 1.1 mrg || crtl->has_nonlocal_goto) 6496 1.1 mrg crtl->need_drap = true; 6497 1.1 mrg 6498 1.1 mrg /* Call update_stack_boundary here again to update incoming stack 6499 1.1 mrg boundary. It may set incoming stack alignment to a different 6500 1.1 mrg value after RTL expansion. TARGET_FUNCTION_OK_FOR_SIBCALL may 6501 1.1 mrg use the minimum incoming stack alignment to check if it is OK 6502 1.1 mrg to perform sibcall optimization since sibcall optimization will 6503 1.1 mrg only align the outgoing stack to incoming stack boundary. */ 6504 1.1 mrg if (targetm.calls.update_stack_boundary) 6505 1.1 mrg targetm.calls.update_stack_boundary (); 6506 1.1 mrg 6507 1.1 mrg /* The incoming stack frame has to be aligned at least at 6508 1.1 mrg parm_stack_boundary. */ 6509 1.1 mrg gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY); 6510 1.1 mrg 6511 1.1 mrg /* Update crtl->stack_alignment_estimated and use it later to align 6512 1.1 mrg stack. We check PREFERRED_STACK_BOUNDARY if there may be non-call 6513 1.1 mrg exceptions since callgraph doesn't collect incoming stack alignment 6514 1.1 mrg in this case. */ 6515 1.1 mrg if (cfun->can_throw_non_call_exceptions 6516 1.1 mrg && PREFERRED_STACK_BOUNDARY > crtl->preferred_stack_boundary) 6517 1.1 mrg preferred_stack_boundary = PREFERRED_STACK_BOUNDARY; 6518 1.1 mrg else 6519 1.1 mrg preferred_stack_boundary = crtl->preferred_stack_boundary; 6520 1.1 mrg if (preferred_stack_boundary > crtl->stack_alignment_estimated) 6521 1.1 mrg crtl->stack_alignment_estimated = preferred_stack_boundary; 6522 1.1 mrg if (preferred_stack_boundary > crtl->stack_alignment_needed) 6523 1.1 mrg crtl->stack_alignment_needed = preferred_stack_boundary; 6524 1.1 mrg 6525 1.1 mrg gcc_assert (crtl->stack_alignment_needed 6526 1.1 mrg <= crtl->stack_alignment_estimated); 6527 1.1 mrg 6528 1.1 mrg crtl->stack_realign_needed 6529 1.1 mrg = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated; 6530 1.1 mrg crtl->stack_realign_tried = crtl->stack_realign_needed; 6531 1.1 mrg 6532 1.1 mrg crtl->stack_realign_processed = true; 6533 1.1 mrg 6534 1.1 mrg /* Target has to redefine TARGET_GET_DRAP_RTX to support stack 6535 1.1 mrg alignment. */ 6536 1.1 mrg gcc_assert (targetm.calls.get_drap_rtx != NULL); 6537 1.1 mrg drap_rtx = targetm.calls.get_drap_rtx (); 6538 1.1 mrg 6539 1.1 mrg /* stack_realign_drap and drap_rtx must match. */ 6540 1.1 mrg gcc_assert ((stack_realign_drap != 0) == (drap_rtx != NULL)); 6541 1.1 mrg 6542 1.1 mrg /* Do nothing if NULL is returned, which means DRAP is not needed. */ 6543 1.1 mrg if (drap_rtx != NULL) 6544 1.1 mrg { 6545 1.1 mrg crtl->args.internal_arg_pointer = drap_rtx; 6546 1.1 mrg 6547 1.1 mrg /* Call fixup_tail_calls to clean up REG_EQUIV note if DRAP is 6548 1.1 mrg needed. */ 6549 1.1 mrg fixup_tail_calls (); 6550 1.1 mrg } 6551 1.1 mrg } 6552 1.1 mrg 6553 1.1 mrg 6555 1.1 mrg static void 6556 1.1 mrg expand_main_function (void) 6557 1.1 mrg { 6558 1.1 mrg #if (defined(INVOKE__main) \ 6559 1.1 mrg || (!defined(HAS_INIT_SECTION) \ 6560 1.1 mrg && !defined(INIT_SECTION_ASM_OP) \ 6561 1.1 mrg && !defined(INIT_ARRAY_SECTION_ASM_OP))) 6562 1.1 mrg emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode); 6563 1.1 mrg #endif 6564 1.1 mrg } 6565 1.1 mrg 6566 1.1 mrg 6568 1.1 mrg /* Expand code to initialize the stack_protect_guard. This is invoked at 6569 1.1 mrg the beginning of a function to be protected. */ 6570 1.1 mrg 6571 1.1 mrg static void 6572 1.1 mrg stack_protect_prologue (void) 6573 1.1 mrg { 6574 1.1 mrg tree guard_decl = targetm.stack_protect_guard (); 6575 1.1 mrg rtx x, y; 6576 1.6 kalvisd 6577 1.1 mrg crtl->stack_protect_guard_decl = guard_decl; 6578 1.1 mrg x = NULL_RTX; 6579 1.1 mrg 6580 1.1 mrg if (targetm.have_stack_protect_combined_set () && guard_decl) 6581 1.6 kalvisd { 6582 1.6 kalvisd gcc_assert (DECL_P (guard_decl)); 6583 1.1 mrg if (x == NULL_RTX) 6584 1.1 mrg x = expand_normal (crtl->stack_protect_guard); 6585 1.1 mrg y = DECL_RTL (guard_decl); 6586 1.1 mrg 6587 1.1 mrg /* Allow the target to compute address of Y and copy it to X without 6588 1.1 mrg leaking Y into a register. This combined address + copy pattern 6589 1.1 mrg allows the target to prevent spilling of any intermediate results by 6590 1.1 mrg splitting it after register allocator. */ 6591 1.1 mrg if (rtx_insn *insn = targetm.gen_stack_protect_combined_set (x, y)) 6592 1.1 mrg { 6593 1.1 mrg emit_insn (insn); 6594 1.1 mrg return; 6595 1.1 mrg } 6596 1.1 mrg } 6597 1.1 mrg 6598 1.1 mrg /* Allow the target to copy from Y to X without leaking Y into a 6599 1.6 kalvisd register. */ 6600 1.6 kalvisd if (targetm.have_stack_protect_set ()) 6601 1.6 kalvisd { 6602 1.6 kalvisd if (x == NULL_RTX) 6603 1.6 kalvisd x = expand_normal (crtl->stack_protect_guard); 6604 1.6 kalvisd if (guard_decl) 6605 1.6 kalvisd y = expand_normal (guard_decl); 6606 1.6 kalvisd else 6607 1.6 kalvisd y = const0_rtx; 6608 1.6 kalvisd 6609 1.6 kalvisd if (rtx_insn *insn = targetm.gen_stack_protect_set (x, y)) 6610 1.6 kalvisd { 6611 1.6 kalvisd emit_insn (insn); 6612 1.6 kalvisd return; 6613 1.1 mrg } 6614 1.6 kalvisd } 6615 1.6 kalvisd 6616 1.6 kalvisd /* Otherwise generate and expand an assignment expression. This 6617 1.6 kalvisd generates code that works in the case where the stack is aligned 6618 1.6 kalvisd differently to the guard variable (e.g. on m68k). */ 6619 1.1 mrg expand_assignment(crtl->stack_protect_guard, 6620 1.1 mrg crtl->stack_protect_guard_decl, false); 6621 1.1 mrg } 6622 1.1 mrg 6623 1.1 mrg /* Translate the intermediate representation contained in the CFG 6624 1.1 mrg from GIMPLE trees to RTL. 6625 1.1 mrg 6626 1.1 mrg We do conversion per basic block and preserve/update the tree CFG. 6627 1.1 mrg This implies we have to do some magic as the CFG can simultaneously 6628 1.1 mrg consist of basic blocks containing RTL and GIMPLE trees. This can 6629 1.1 mrg confuse the CFG hooks, so be careful to not manipulate CFG during 6630 1.1 mrg the expansion. */ 6631 1.1 mrg 6632 1.1 mrg namespace { 6633 1.1 mrg 6634 1.1 mrg const pass_data pass_data_expand = 6635 1.1 mrg { 6636 1.1 mrg RTL_PASS, /* type */ 6637 1.1 mrg "expand", /* name */ 6638 1.1 mrg OPTGROUP_NONE, /* optinfo_flags */ 6639 1.1 mrg TV_EXPAND, /* tv_id */ 6640 1.1 mrg ( PROP_ssa | PROP_gimple_leh | PROP_cfg 6641 1.1 mrg | PROP_gimple_lcx 6642 1.1 mrg | PROP_gimple_lvec 6643 1.1 mrg | PROP_gimple_lva), /* properties_required */ 6644 1.1 mrg PROP_rtl, /* properties_provided */ 6645 1.1 mrg ( PROP_ssa | PROP_gimple ), /* properties_destroyed */ 6646 1.1 mrg 0, /* todo_flags_start */ 6647 1.1 mrg 0, /* todo_flags_finish */ 6648 1.1 mrg }; 6649 1.1 mrg 6650 1.1 mrg class pass_expand : public rtl_opt_pass 6651 1.1 mrg { 6652 1.1 mrg public: 6653 1.1 mrg pass_expand (gcc::context *ctxt) 6654 1.1 mrg : rtl_opt_pass (pass_data_expand, ctxt) 6655 1.1 mrg {} 6656 1.5 mrg 6657 1.1 mrg /* opt_pass methods: */ 6658 1.1 mrg unsigned int execute (function *) final override; 6659 1.1 mrg 6660 1.1 mrg }; // class pass_expand 6661 1.1 mrg 6662 1.1 mrg unsigned int 6663 1.1 mrg pass_expand::execute (function *fun) 6664 1.1 mrg { 6665 1.1 mrg basic_block bb, init_block; 6666 1.1 mrg edge_iterator ei; 6667 1.1 mrg edge e; 6668 1.1 mrg rtx_insn *var_seq, *var_ret_seq; 6669 1.1 mrg unsigned i; 6670 1.1 mrg 6671 1.1 mrg timevar_push (TV_OUT_OF_SSA); 6672 1.1 mrg rewrite_out_of_ssa (&SA); 6673 1.1 mrg timevar_pop (TV_OUT_OF_SSA); 6674 1.1 mrg SA.partition_to_pseudo = XCNEWVEC (rtx, SA.map->num_partitions); 6675 1.1 mrg 6676 1.1 mrg if (MAY_HAVE_DEBUG_BIND_STMTS && flag_tree_ter) 6677 1.1 mrg { 6678 1.1 mrg gimple_stmt_iterator gsi; 6679 1.1 mrg FOR_EACH_BB_FN (bb, cfun) 6680 1.1 mrg for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 6681 1.1 mrg if (gimple_debug_bind_p (gsi_stmt (gsi))) 6682 1.1 mrg avoid_deep_ter_for_debug (gsi_stmt (gsi), 0); 6683 1.1 mrg } 6684 1.1 mrg 6685 1.1 mrg /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */ 6686 1.1 mrg auto_bitmap forced_stack_vars; 6687 1.1 mrg discover_nonconstant_array_refs (forced_stack_vars); 6688 1.1 mrg 6689 1.1 mrg /* Make sure all values used by the optimization passes have sane 6690 1.1 mrg defaults. */ 6691 1.1 mrg reg_renumber = 0; 6692 1.1 mrg 6693 1.1 mrg /* Some backends want to know that we are expanding to RTL. */ 6694 1.1 mrg currently_expanding_to_rtl = 1; 6695 1.1 mrg /* Dominators are not kept up-to-date as we may create new basic-blocks. */ 6696 1.1 mrg free_dominance_info (CDI_DOMINATORS); 6697 1.1 mrg 6698 1.1 mrg rtl_profile_for_bb (ENTRY_BLOCK_PTR_FOR_FN (fun)); 6699 1.1 mrg 6700 1.1 mrg insn_locations_init (); 6701 1.1 mrg if (!DECL_IS_UNDECLARED_BUILTIN (current_function_decl)) 6702 1.1 mrg { 6703 1.1 mrg /* Eventually, all FEs should explicitly set function_start_locus. */ 6704 1.1 mrg if (LOCATION_LOCUS (fun->function_start_locus) == UNKNOWN_LOCATION) 6705 1.1 mrg set_curr_insn_location 6706 1.1 mrg (DECL_SOURCE_LOCATION (current_function_decl)); 6707 1.1 mrg else 6708 1.1 mrg set_curr_insn_location (fun->function_start_locus); 6709 1.1 mrg } 6710 1.1 mrg else 6711 1.1 mrg set_curr_insn_location (UNKNOWN_LOCATION); 6712 1.1 mrg prologue_location = curr_insn_location (); 6713 1.1 mrg 6714 1.1 mrg #ifdef INSN_SCHEDULING 6715 1.1 mrg init_sched_attrs (); 6716 1.1 mrg #endif 6717 1.1 mrg 6718 1.1 mrg /* Make sure first insn is a note even if we don't want linenums. 6719 1.1 mrg This makes sure the first insn will never be deleted. 6720 1.1 mrg Also, final expects a note to appear there. */ 6721 1.1 mrg emit_note (NOTE_INSN_DELETED); 6722 1.1 mrg 6723 1.1 mrg targetm.expand_to_rtl_hook (); 6724 1.1 mrg crtl->init_stack_alignment (); 6725 1.1 mrg fun->cfg->max_jumptable_ents = 0; 6726 1.1 mrg 6727 1.1 mrg /* Resovle the function section. Some targets, like ARM EABI rely on knowledge 6728 1.1 mrg of the function section at exapnsion time to predict distance of calls. */ 6729 1.1 mrg resolve_unique_section (current_function_decl, 0, flag_function_sections); 6730 1.1 mrg 6731 1.1 mrg /* Expand the variables recorded during gimple lowering. */ 6732 1.1 mrg timevar_push (TV_VAR_EXPAND); 6733 1.1 mrg start_sequence (); 6734 1.1 mrg 6735 1.1 mrg var_ret_seq = expand_used_vars (forced_stack_vars); 6736 1.1 mrg 6737 1.1 mrg var_seq = get_insns (); 6738 1.1 mrg end_sequence (); 6739 1.1 mrg timevar_pop (TV_VAR_EXPAND); 6740 1.1 mrg 6741 1.1 mrg /* Honor stack protection warnings. */ 6742 1.1 mrg if (warn_stack_protect) 6743 1.1 mrg { 6744 1.1 mrg if (fun->calls_alloca) 6745 1.1 mrg warning (OPT_Wstack_protector, 6746 1.1 mrg "stack protector not protecting local variables: " 6747 1.1 mrg "variable length buffer"); 6748 1.1 mrg if (has_short_buffer && !crtl->stack_protect_guard) 6749 1.1 mrg warning (OPT_Wstack_protector, 6750 1.1 mrg "stack protector not protecting function: " 6751 1.1 mrg "all local arrays are less than %d bytes long", 6752 1.1 mrg (int) param_ssp_buffer_size); 6753 1.1 mrg } 6754 1.1 mrg 6755 1.1 mrg /* Temporarily mark PARM_DECLs and RESULT_DECLs we need to expand to 6756 1.1 mrg memory addressable so expand_function_start can emit the required 6757 1.1 mrg copies. */ 6758 1.1 mrg auto_vec<tree, 16> marked_parms; 6759 1.1 mrg for (tree parm = DECL_ARGUMENTS (current_function_decl); parm; 6760 1.1 mrg parm = DECL_CHAIN (parm)) 6761 1.1 mrg if (!TREE_ADDRESSABLE (parm) 6762 1.1 mrg && bitmap_bit_p (forced_stack_vars, DECL_UID (parm))) 6763 1.1 mrg { 6764 1.1 mrg TREE_ADDRESSABLE (parm) = 1; 6765 1.1 mrg marked_parms.safe_push (parm); 6766 1.1 mrg } 6767 1.1 mrg if (DECL_RESULT (current_function_decl) 6768 1.1 mrg && !TREE_ADDRESSABLE (DECL_RESULT (current_function_decl)) 6769 1.1 mrg && bitmap_bit_p (forced_stack_vars, 6770 1.1 mrg DECL_UID (DECL_RESULT (current_function_decl)))) 6771 1.1 mrg { 6772 1.1 mrg TREE_ADDRESSABLE (DECL_RESULT (current_function_decl)) = 1; 6773 1.1 mrg marked_parms.safe_push (DECL_RESULT (current_function_decl)); 6774 1.1 mrg } 6775 1.1 mrg 6776 1.1 mrg /* Set up parameters and prepare for return, for the function. */ 6777 1.1 mrg expand_function_start (current_function_decl); 6778 1.1 mrg 6779 1.1 mrg /* Clear TREE_ADDRESSABLE again. */ 6780 1.1 mrg while (!marked_parms.is_empty ()) 6781 1.1 mrg TREE_ADDRESSABLE (marked_parms.pop ()) = 0; 6782 1.1 mrg 6783 1.1 mrg /* If we emitted any instructions for setting up the variables, 6784 1.1 mrg emit them before the FUNCTION_START note. */ 6785 1.1 mrg if (var_seq) 6786 1.1 mrg { 6787 1.1 mrg emit_insn_before (var_seq, parm_birth_insn); 6788 1.1 mrg 6789 1.1 mrg /* In expand_function_end we'll insert the alloca save/restore 6790 1.1 mrg before parm_birth_insn. We've just insertted an alloca call. 6791 1.1 mrg Adjust the pointer to match. */ 6792 1.1 mrg parm_birth_insn = var_seq; 6793 1.1 mrg } 6794 1.1 mrg 6795 1.1 mrg /* Now propagate the RTL assignment of each partition to the 6796 1.1 mrg underlying var of each SSA_NAME. */ 6797 1.1 mrg tree name; 6798 1.1 mrg 6799 1.1 mrg FOR_EACH_SSA_NAME (i, name, cfun) 6800 1.1 mrg { 6801 1.1 mrg /* We might have generated new SSA names in 6802 1.1 mrg update_alias_info_with_stack_vars. They will have a NULL 6803 1.1 mrg defining statements, and won't be part of the partitioning, 6804 1.1 mrg so ignore those. */ 6805 1.1 mrg if (!SSA_NAME_DEF_STMT (name)) 6806 1.1 mrg continue; 6807 1.1 mrg 6808 1.1 mrg adjust_one_expanded_partition_var (name); 6809 1.1 mrg } 6810 1.1 mrg 6811 1.1 mrg /* Clean up RTL of variables that straddle across multiple 6812 1.1 mrg partitions, and check that the rtl of any PARM_DECLs that are not 6813 1.1 mrg cleaned up is that of their default defs. */ 6814 1.1 mrg FOR_EACH_SSA_NAME (i, name, cfun) 6815 1.1 mrg { 6816 1.1 mrg int part; 6817 1.1 mrg 6818 1.1 mrg /* We might have generated new SSA names in 6819 1.1 mrg update_alias_info_with_stack_vars. They will have a NULL 6820 1.1 mrg defining statements, and won't be part of the partitioning, 6821 1.1 mrg so ignore those. */ 6822 1.1 mrg if (!SSA_NAME_DEF_STMT (name)) 6823 1.1 mrg continue; 6824 1.1 mrg part = var_to_partition (SA.map, name); 6825 1.1 mrg if (part == NO_PARTITION) 6826 1.1 mrg continue; 6827 1.1 mrg 6828 1.1 mrg /* If this decl was marked as living in multiple places, reset 6829 1.1 mrg this now to NULL. */ 6830 1.1 mrg tree var = SSA_NAME_VAR (name); 6831 1.1 mrg if (var && DECL_RTL_IF_SET (var) == pc_rtx) 6832 1.1 mrg SET_DECL_RTL (var, NULL); 6833 1.1 mrg /* Check that the pseudos chosen by assign_parms are those of 6834 1.1 mrg the corresponding default defs. */ 6835 1.1 mrg else if (SSA_NAME_IS_DEFAULT_DEF (name) 6836 1.1 mrg && (TREE_CODE (var) == PARM_DECL 6837 1.1 mrg || TREE_CODE (var) == RESULT_DECL)) 6838 1.1 mrg { 6839 1.1 mrg rtx in = DECL_RTL_IF_SET (var); 6840 1.1 mrg gcc_assert (in); 6841 1.1 mrg rtx out = SA.partition_to_pseudo[part]; 6842 1.1 mrg gcc_assert (in == out); 6843 1.1 mrg 6844 1.1 mrg /* Now reset VAR's RTL to IN, so that the _EXPR attrs match 6845 1.1 mrg those expected by debug backends for each parm and for 6846 1.1 mrg the result. This is particularly important for stabs, 6847 1.1 mrg whose register elimination from parm's DECL_RTL may cause 6848 1.1 mrg -fcompare-debug differences as SET_DECL_RTL changes reg's 6849 1.1 mrg attrs. So, make sure the RTL already has the parm as the 6850 1.1 mrg EXPR, so that it won't change. */ 6851 1.1 mrg SET_DECL_RTL (var, NULL_RTX); 6852 1.1 mrg if (MEM_P (in)) 6853 1.1 mrg set_mem_attributes (in, var, true); 6854 1.1 mrg SET_DECL_RTL (var, in); 6855 1.1 mrg } 6856 1.1 mrg } 6857 1.1 mrg 6858 1.1 mrg /* If this function is `main', emit a call to `__main' 6859 1.1 mrg to run global initializers, etc. */ 6860 1.1 mrg if (DECL_NAME (current_function_decl) 6861 1.1 mrg && MAIN_NAME_P (DECL_NAME (current_function_decl)) 6862 1.1 mrg && DECL_FILE_SCOPE_P (current_function_decl)) 6863 1.1 mrg expand_main_function (); 6864 1.1 mrg 6865 1.1 mrg /* Initialize the stack_protect_guard field. This must happen after the 6866 1.1 mrg call to __main (if any) so that the external decl is initialized. */ 6867 1.1 mrg if (crtl->stack_protect_guard && targetm.stack_protect_runtime_enabled_p ()) 6868 1.1 mrg stack_protect_prologue (); 6869 1.1 mrg 6870 1.1 mrg expand_phi_nodes (&SA); 6871 1.1 mrg 6872 1.1 mrg /* Release any stale SSA redirection data. */ 6873 1.1 mrg redirect_edge_var_map_empty (); 6874 1.1 mrg 6875 1.1 mrg /* Register rtl specific functions for cfg. */ 6876 1.1 mrg rtl_register_cfg_hooks (); 6877 1.1 mrg 6878 1.1 mrg init_block = construct_init_block (); 6879 1.1 mrg 6880 1.1 mrg /* Clear EDGE_EXECUTABLE on the entry edge(s). It is cleaned from the 6881 1.1 mrg remaining edges later. */ 6882 1.1 mrg FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs) 6883 1.1 mrg e->flags &= ~EDGE_EXECUTABLE; 6884 1.1 mrg 6885 1.1 mrg /* If the function has too many markers, drop them while expanding. */ 6886 1.1 mrg if (cfun->debug_marker_count 6887 1.1 mrg >= param_max_debug_marker_count) 6888 1.1 mrg cfun->debug_nonbind_markers = false; 6889 1.1 mrg 6890 1.1 mrg lab_rtx_for_bb = new hash_map<basic_block, rtx_code_label *>; 6891 1.1 mrg FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun), 6892 1.1 mrg next_bb) 6893 1.1 mrg bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX); 6894 1.1 mrg 6895 1.1 mrg if (MAY_HAVE_DEBUG_BIND_INSNS) 6896 1.1 mrg expand_debug_locations (); 6897 1.1 mrg 6898 1.1 mrg if (deep_ter_debug_map) 6899 1.1 mrg { 6900 1.1 mrg delete deep_ter_debug_map; 6901 1.1 mrg deep_ter_debug_map = NULL; 6902 1.1 mrg } 6903 1.1 mrg 6904 1.1 mrg /* Free stuff we no longer need after GIMPLE optimizations. */ 6905 1.1 mrg free_dominance_info (CDI_DOMINATORS); 6906 1.1 mrg free_dominance_info (CDI_POST_DOMINATORS); 6907 1.1 mrg delete_tree_cfg_annotations (fun); 6908 1.1 mrg 6909 1.1 mrg timevar_push (TV_OUT_OF_SSA); 6910 1.1 mrg finish_out_of_ssa (&SA); 6911 1.1 mrg timevar_pop (TV_OUT_OF_SSA); 6912 1.1 mrg 6913 1.1 mrg timevar_push (TV_POST_EXPAND); 6914 1.1 mrg /* We are no longer in SSA form. */ 6915 1.1 mrg fun->gimple_df->in_ssa_p = false; 6916 1.1 mrg loops_state_clear (LOOP_CLOSED_SSA); 6917 1.1 mrg 6918 1.1 mrg /* Expansion is used by optimization passes too, set maybe_hot_insn_p 6919 1.1 mrg conservatively to true until they are all profile aware. */ 6920 1.1 mrg delete lab_rtx_for_bb; 6921 1.1 mrg free_histograms (fun); 6922 1.1 mrg 6923 1.1 mrg construct_exit_block (); 6924 1.1 mrg insn_locations_finalize (); 6925 1.1 mrg 6926 1.1 mrg if (var_ret_seq) 6927 1.1 mrg { 6928 1.1 mrg rtx_insn *after = return_label; 6929 1.1 mrg rtx_insn *next = NEXT_INSN (after); 6930 1.1 mrg if (next && NOTE_INSN_BASIC_BLOCK_P (next)) 6931 1.1 mrg after = next; 6932 1.1 mrg emit_insn_after (var_ret_seq, after); 6933 1.1 mrg } 6934 1.1 mrg 6935 1.1 mrg if (hwasan_sanitize_stack_p ()) 6936 1.1 mrg hwasan_maybe_emit_frame_base_init (); 6937 1.1 mrg 6938 1.1 mrg /* Zap the tree EH table. */ 6939 1.1 mrg set_eh_throw_stmt_table (fun, NULL); 6940 1.1 mrg 6941 1.1 mrg /* We need JUMP_LABEL be set in order to redirect jumps, and hence 6942 1.1 mrg split edges which edge insertions might do. */ 6943 1.1 mrg rebuild_jump_labels (get_insns ()); 6944 1.1 mrg 6945 1.1 mrg /* If we have a single successor to the entry block, put the pending insns 6946 1.1 mrg after parm birth, but before NOTE_INSNS_FUNCTION_BEG. */ 6947 1.1 mrg if (single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (fun))) 6948 1.1 mrg { 6949 1.1 mrg edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (fun)); 6950 1.1 mrg if (e->insns.r) 6951 1.1 mrg { 6952 1.1 mrg rtx_insn *insns = e->insns.r; 6953 1.1 mrg e->insns.r = NULL; 6954 1.1 mrg rebuild_jump_labels_chain (insns); 6955 1.1 mrg if (NOTE_P (parm_birth_insn) 6956 1.1 mrg && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG) 6957 1.1 mrg emit_insn_before_noloc (insns, parm_birth_insn, e->dest); 6958 1.1 mrg else 6959 1.1 mrg emit_insn_after_noloc (insns, parm_birth_insn, e->dest); 6960 1.1 mrg } 6961 1.1 mrg } 6962 1.1 mrg 6963 1.1 mrg /* Otherwise, as well as for other edges, take the usual way. */ 6964 1.1 mrg commit_edge_insertions (); 6965 1.1 mrg 6966 1.1 mrg /* We're done expanding trees to RTL. */ 6967 1.1 mrg currently_expanding_to_rtl = 0; 6968 1.1 mrg 6969 1.1 mrg flush_mark_addressable_queue (); 6970 1.1 mrg 6971 1.1 mrg FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun)->next_bb, 6972 1.1 mrg EXIT_BLOCK_PTR_FOR_FN (fun), next_bb) 6973 1.1 mrg { 6974 1.1 mrg edge e; 6975 1.1 mrg edge_iterator ei; 6976 1.1 mrg for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 6977 1.1 mrg { 6978 1.1 mrg /* Clear EDGE_EXECUTABLE. This flag is never used in the backend. */ 6979 1.1 mrg e->flags &= ~EDGE_EXECUTABLE; 6980 1.1 mrg 6981 1.1 mrg /* At the moment not all abnormal edges match the RTL 6982 1.1 mrg representation. It is safe to remove them here as 6983 1.1 mrg find_many_sub_basic_blocks will rediscover them. 6984 1.1 mrg In the future we should get this fixed properly. */ 6985 1.1 mrg if ((e->flags & EDGE_ABNORMAL) 6986 1.1 mrg && !(e->flags & EDGE_SIBCALL)) 6987 1.1 mrg remove_edge (e); 6988 1.1 mrg else 6989 1.1 mrg ei_next (&ei); 6990 1.1 mrg } 6991 1.1 mrg } 6992 1.1 mrg 6993 1.1 mrg auto_sbitmap blocks (last_basic_block_for_fn (fun)); 6994 1.1 mrg bitmap_ones (blocks); 6995 1.1 mrg find_many_sub_basic_blocks (blocks); 6996 1.1 mrg purge_all_dead_edges (); 6997 1.1 mrg 6998 1.1 mrg /* After initial rtl generation, call back to finish generating 6999 1.1 mrg exception support code. We need to do this before cleaning up 7000 1.1 mrg the CFG as the code does not expect dead landing pads. */ 7001 1.1 mrg if (fun->eh->region_tree != NULL) 7002 1.1 mrg finish_eh_generation (); 7003 1.1 mrg 7004 1.1 mrg /* Call expand_stack_alignment after finishing all 7005 1.1 mrg updates to crtl->preferred_stack_boundary. */ 7006 1.1 mrg expand_stack_alignment (); 7007 1.1 mrg 7008 1.1 mrg /* Fixup REG_EQUIV notes in the prologue if there are tailcalls in this 7009 1.1 mrg function. */ 7010 1.1 mrg if (crtl->tail_call_emit) 7011 1.1 mrg fixup_tail_calls (); 7012 1.1 mrg 7013 1.1 mrg HOST_WIDE_INT patch_area_size, patch_area_entry; 7014 1.1 mrg parse_and_check_patch_area (flag_patchable_function_entry, false, 7015 1.1 mrg &patch_area_size, &patch_area_entry); 7016 1.1 mrg 7017 1.1 mrg tree patchable_function_entry_attr 7018 1.1 mrg = lookup_attribute ("patchable_function_entry", 7019 1.1 mrg DECL_ATTRIBUTES (cfun->decl)); 7020 1.1 mrg if (patchable_function_entry_attr) 7021 1.1 mrg { 7022 1.1 mrg tree pp_val = TREE_VALUE (patchable_function_entry_attr); 7023 1.1 mrg tree patchable_function_entry_value1 = TREE_VALUE (pp_val); 7024 1.1 mrg 7025 1.1 mrg patch_area_size = tree_to_uhwi (patchable_function_entry_value1); 7026 1.1 mrg patch_area_entry = 0; 7027 1.1 mrg if (TREE_CHAIN (pp_val) != NULL_TREE) 7028 1.1 mrg { 7029 1.1 mrg tree patchable_function_entry_value2 7030 1.1 mrg = TREE_VALUE (TREE_CHAIN (pp_val)); 7031 1.1 mrg patch_area_entry = tree_to_uhwi (patchable_function_entry_value2); 7032 1.1 mrg } 7033 1.1 mrg } 7034 1.1 mrg 7035 1.1 mrg if (patch_area_entry > patch_area_size) 7036 1.1 mrg { 7037 1.1 mrg if (patch_area_size > 0) 7038 1.1 mrg warning (OPT_Wattributes, 7039 1.1 mrg "patchable function entry %wu exceeds size %wu", 7040 1.1 mrg patch_area_entry, patch_area_size); 7041 1.1 mrg patch_area_entry = 0; 7042 1.1 mrg } 7043 1.1 mrg 7044 1.1 mrg crtl->patch_area_size = patch_area_size; 7045 1.1 mrg crtl->patch_area_entry = patch_area_entry; 7046 1.1 mrg 7047 1.1 mrg /* BB subdivision may have created basic blocks that are only reachable 7048 1.1 mrg from unlikely bbs but not marked as such in the profile. */ 7049 1.1 mrg if (optimize) 7050 1.1 mrg propagate_unlikely_bbs_forward (); 7051 1.1 mrg 7052 1.1 mrg /* Remove unreachable blocks, otherwise we cannot compute dominators 7053 1.1 mrg which are needed for loop state verification. As a side-effect 7054 1.1 mrg this also compacts blocks. 7055 1.1 mrg ??? We cannot remove trivially dead insns here as for example 7056 1.1 mrg the DRAP reg on i?86 is not magically live at this point. 7057 1.1 mrg gcc.c-torture/execute/ipa-sra-2.c execution, -Os -m32 fails otherwise. */ 7058 1.1 mrg cleanup_cfg (CLEANUP_NO_INSN_DEL); 7059 1.1 mrg 7060 1.1 mrg checking_verify_flow_info (); 7061 1.1 mrg 7062 1.1 mrg /* Initialize pseudos allocated for hard registers. */ 7063 1.1 mrg emit_initial_value_sets (); 7064 1.1 mrg 7065 1.1 mrg /* And finally unshare all RTL. */ 7066 1.1 mrg unshare_all_rtl (); 7067 1.1 mrg 7068 1.1 mrg /* There's no need to defer outputting this function any more; we 7069 1.1 mrg know we want to output it. */ 7070 1.1 mrg DECL_DEFER_OUTPUT (current_function_decl) = 0; 7071 1.1 mrg 7072 1.1 mrg /* Now that we're done expanding trees to RTL, we shouldn't have any 7073 1.1 mrg more CONCATs anywhere. */ 7074 1.1 mrg generating_concat_p = 0; 7075 1.1 mrg 7076 1.1 mrg if (dump_file) 7077 1.1 mrg { 7078 1.1 mrg fprintf (dump_file, 7079 1.1 mrg "\n\n;;\n;; Full RTL generated for this function:\n;;\n"); 7080 1.1 mrg /* And the pass manager will dump RTL for us. */ 7081 1.1 mrg } 7082 1.1 mrg 7083 1.1 mrg /* If we're emitting a nested function, make sure its parent gets 7084 1.1 mrg emitted as well. Doing otherwise confuses debug info. */ 7085 1.1 mrg { 7086 1.1 mrg tree parent; 7087 1.1 mrg for (parent = DECL_CONTEXT (current_function_decl); 7088 1.1 mrg parent != NULL_TREE; 7089 1.1 mrg parent = get_containing_scope (parent)) 7090 1.1 mrg if (TREE_CODE (parent) == FUNCTION_DECL) 7091 1.1 mrg TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1; 7092 1.1 mrg } 7093 1.1 mrg 7094 1.1 mrg TREE_ASM_WRITTEN (current_function_decl) = 1; 7095 1.1 mrg 7096 1.1 mrg /* After expanding, the return labels are no longer needed. */ 7097 1.1 mrg return_label = NULL; 7098 1.1 mrg naked_return_label = NULL; 7099 1.1 mrg 7100 1.1 mrg /* After expanding, the tm_restart map is no longer needed. */ 7101 1.1 mrg if (fun->gimple_df->tm_restart) 7102 1.1 mrg fun->gimple_df->tm_restart = NULL; 7103 1.1 mrg 7104 1.1 mrg /* Tag the blocks with a depth number so that change_scope can find 7105 1.1 mrg the common parent easily. */ 7106 1.1 mrg set_block_levels (DECL_INITIAL (fun->decl), 0); 7107 1.1 mrg default_rtl_profile (); 7108 1.1 mrg 7109 1.1 mrg /* For -dx discard loops now, otherwise IL verify in clean_state will 7110 1.1 mrg ICE. */ 7111 1.1 mrg if (rtl_dump_and_exit) 7112 1.1 mrg { 7113 1.1 mrg cfun->curr_properties &= ~PROP_loops; 7114 1.1 mrg loop_optimizer_finalize (); 7115 1.1 mrg } 7116 1.1 mrg 7117 1.1 mrg timevar_pop (TV_POST_EXPAND); 7118 1.1 mrg 7119 1.1 mrg return 0; 7120 1.1 mrg } 7121 1.1 mrg 7122 1.1 mrg } // anon namespace 7123 1.1 mrg 7124 1.1 mrg rtl_opt_pass * 7125 1.1 mrg make_pass_expand (gcc::context *ctxt) 7126 1.1 mrg { 7127 return new pass_expand (ctxt); 7128 } 7129