Mercurial > hg > CbC > CbC_gcc
comparison gcc/var-tracking.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
comparison
equal
deleted
inserted
replaced
131:84e7813d76e9 | 145:1830386684a0 |
---|---|
1 /* Variable tracking routines for the GNU compiler. | 1 /* Variable tracking routines for the GNU compiler. |
2 Copyright (C) 2002-2018 Free Software Foundation, Inc. | 2 Copyright (C) 2002-2020 Free Software Foundation, Inc. |
3 | 3 |
4 This file is part of GCC. | 4 This file is part of GCC. |
5 | 5 |
6 GCC is free software; you can redistribute it and/or modify it | 6 GCC is free software; you can redistribute it and/or modify it |
7 under the terms of the GNU General Public License as published by | 7 under the terms of the GNU General Public License as published by |
109 #include "reload.h" | 109 #include "reload.h" |
110 #include "calls.h" | 110 #include "calls.h" |
111 #include "tree-dfa.h" | 111 #include "tree-dfa.h" |
112 #include "tree-ssa.h" | 112 #include "tree-ssa.h" |
113 #include "cselib.h" | 113 #include "cselib.h" |
114 #include "params.h" | |
115 #include "tree-pretty-print.h" | 114 #include "tree-pretty-print.h" |
116 #include "rtl-iter.h" | 115 #include "rtl-iter.h" |
117 #include "fibonacci_heap.h" | 116 #include "fibonacci_heap.h" |
118 #include "print-rtl.h" | 117 #include "print-rtl.h" |
118 #include "function-abi.h" | |
119 | 119 |
120 typedef fibonacci_heap <long, basic_block_def> bb_heap_t; | 120 typedef fibonacci_heap <long, basic_block_def> bb_heap_t; |
121 typedef fibonacci_node <long, basic_block_def> bb_heap_node_t; | 121 typedef fibonacci_node <long, basic_block_def> bb_heap_node_t; |
122 | 122 |
123 /* var-tracking.c assumes that tree code with the same value as VALUE rtx code | 123 /* var-tracking.c assumes that tree code with the same value as VALUE rtx code |
927 or -1 if the replacement shouldn't be done. */ | 927 or -1 if the replacement shouldn't be done. */ |
928 static poly_int64 hard_frame_pointer_adjustment = -1; | 928 static poly_int64 hard_frame_pointer_adjustment = -1; |
929 | 929 |
930 /* Data for adjust_mems callback. */ | 930 /* Data for adjust_mems callback. */ |
931 | 931 |
932 struct adjust_mem_data | 932 class adjust_mem_data |
933 { | 933 { |
934 public: | |
934 bool store; | 935 bool store; |
935 machine_mode mem_mode; | 936 machine_mode mem_mode; |
936 HOST_WIDE_INT stack_adjust; | 937 HOST_WIDE_INT stack_adjust; |
937 auto_vec<rtx> side_effects; | 938 auto_vec<rtx> side_effects; |
938 }; | 939 }; |
1028 /* Helper function for adjusting used MEMs. */ | 1029 /* Helper function for adjusting used MEMs. */ |
1029 | 1030 |
1030 static rtx | 1031 static rtx |
1031 adjust_mems (rtx loc, const_rtx old_rtx, void *data) | 1032 adjust_mems (rtx loc, const_rtx old_rtx, void *data) |
1032 { | 1033 { |
1033 struct adjust_mem_data *amd = (struct adjust_mem_data *) data; | 1034 class adjust_mem_data *amd = (class adjust_mem_data *) data; |
1034 rtx mem, addr = loc, tem; | 1035 rtx mem, addr = loc, tem; |
1035 machine_mode mem_mode_save; | 1036 machine_mode mem_mode_save; |
1036 bool store_save; | 1037 bool store_save; |
1037 scalar_int_mode tem_mode, tem_subreg_mode; | 1038 scalar_int_mode tem_mode, tem_subreg_mode; |
1038 poly_int64 size; | 1039 poly_int64 size; |
1236 adjust_mem_data amd; | 1237 adjust_mem_data amd; |
1237 amd.mem_mode = VOIDmode; | 1238 amd.mem_mode = VOIDmode; |
1238 amd.stack_adjust = -VTI (bb)->out.stack_adjust; | 1239 amd.stack_adjust = -VTI (bb)->out.stack_adjust; |
1239 | 1240 |
1240 amd.store = true; | 1241 amd.store = true; |
1241 note_stores (PATTERN (insn), adjust_mem_stores, &amd); | 1242 note_stores (insn, adjust_mem_stores, &amd); |
1242 | 1243 |
1243 amd.store = false; | 1244 amd.store = false; |
1244 if (GET_CODE (PATTERN (insn)) == PARALLEL | 1245 if (GET_CODE (PATTERN (insn)) == PARALLEL |
1245 && asm_noperands (PATTERN (insn)) > 0 | 1246 && asm_noperands (PATTERN (insn)) > 0 |
1246 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET) | 1247 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET) |
4897 static void | 4898 static void |
4898 dataflow_set_clear_at_call (dataflow_set *set, rtx_insn *call_insn) | 4899 dataflow_set_clear_at_call (dataflow_set *set, rtx_insn *call_insn) |
4899 { | 4900 { |
4900 unsigned int r; | 4901 unsigned int r; |
4901 hard_reg_set_iterator hrsi; | 4902 hard_reg_set_iterator hrsi; |
4902 HARD_REG_SET invalidated_regs; | 4903 |
4903 | 4904 HARD_REG_SET callee_clobbers |
4904 get_call_reg_set_usage (call_insn, &invalidated_regs, | 4905 = insn_callee_abi (call_insn).full_reg_clobbers (); |
4905 regs_invalidated_by_call); | 4906 |
4906 | 4907 EXECUTE_IF_SET_IN_HARD_REG_SET (callee_clobbers, 0, r, hrsi) |
4907 EXECUTE_IF_SET_IN_HARD_REG_SET (invalidated_regs, 0, r, hrsi) | |
4908 var_regno_delete (set, r); | 4908 var_regno_delete (set, r); |
4909 | 4909 |
4910 if (MAY_HAVE_DEBUG_BIND_INSNS) | 4910 if (MAY_HAVE_DEBUG_BIND_INSNS) |
4911 { | 4911 { |
4912 set->traversed_vars = set->vars; | 4912 set->traversed_vars = set->vars; |
5841 /* We use this to keep too-complex expressions from being emitted as | 5841 /* We use this to keep too-complex expressions from being emitted as |
5842 location notes, and then to debug information. Users can trade | 5842 location notes, and then to debug information. Users can trade |
5843 compile time for ridiculously complex expressions, although they're | 5843 compile time for ridiculously complex expressions, although they're |
5844 seldom useful, and they may often have to be discarded as not | 5844 seldom useful, and they may often have to be discarded as not |
5845 representable anyway. */ | 5845 representable anyway. */ |
5846 #define EXPR_USE_DEPTH (PARAM_VALUE (PARAM_MAX_VARTRACK_EXPR_DEPTH)) | 5846 #define EXPR_USE_DEPTH (param_max_vartrack_expr_depth) |
5847 | 5847 |
5848 /* Attempt to reverse the EXPR operation in the debug info and record | 5848 /* Attempt to reverse the EXPR operation in the debug info and record |
5849 it in the cselib table. Say for reg1 = reg2 + 6 even when reg2 is | 5849 it in the cselib table. Say for reg1 = reg2 + 6 even when reg2 is |
5850 no longer live we can express its value as VAL - 6. */ | 5850 no longer live we can express its value as VAL - 6. */ |
5851 | 5851 |
5901 for (l = v->locs, count = 0; l; l = l->next, count++) | 5901 for (l = v->locs, count = 0; l; l = l->next, count++) |
5902 if (CONSTANT_P (l->loc) | 5902 if (CONSTANT_P (l->loc) |
5903 && (GET_CODE (l->loc) != CONST || !references_value_p (l->loc, 0))) | 5903 && (GET_CODE (l->loc) != CONST || !references_value_p (l->loc, 0))) |
5904 return; | 5904 return; |
5905 /* Avoid creating too large locs lists. */ | 5905 /* Avoid creating too large locs lists. */ |
5906 else if (count == PARAM_VALUE (PARAM_MAX_VARTRACK_REVERSE_OP_SIZE)) | 5906 else if (count == param_max_vartrack_reverse_op_size) |
5907 return; | 5907 return; |
5908 | 5908 |
5909 switch (GET_CODE (src)) | 5909 switch (GET_CODE (src)) |
5910 { | 5910 { |
5911 case NOT: | 5911 case NOT: |
6290 #ifndef PCC_STATIC_STRUCT_RETURN | 6290 #ifndef PCC_STATIC_STRUCT_RETURN |
6291 if (aggregate_value_p (TREE_TYPE (type), type) | 6291 if (aggregate_value_p (TREE_TYPE (type), type) |
6292 && targetm.calls.struct_value_rtx (type, 0) == 0) | 6292 && targetm.calls.struct_value_rtx (type, 0) == 0) |
6293 { | 6293 { |
6294 tree struct_addr = build_pointer_type (TREE_TYPE (type)); | 6294 tree struct_addr = build_pointer_type (TREE_TYPE (type)); |
6295 machine_mode mode = TYPE_MODE (struct_addr); | 6295 function_arg_info arg (struct_addr, /*named=*/true); |
6296 rtx reg; | 6296 rtx reg; |
6297 INIT_CUMULATIVE_ARGS (args_so_far_v, type, NULL_RTX, fndecl, | 6297 INIT_CUMULATIVE_ARGS (args_so_far_v, type, NULL_RTX, fndecl, |
6298 nargs + 1); | 6298 nargs + 1); |
6299 reg = targetm.calls.function_arg (args_so_far, mode, | 6299 reg = targetm.calls.function_arg (args_so_far, arg); |
6300 struct_addr, true); | 6300 targetm.calls.function_arg_advance (args_so_far, arg); |
6301 targetm.calls.function_arg_advance (args_so_far, mode, | |
6302 struct_addr, true); | |
6303 if (reg == NULL_RTX) | 6301 if (reg == NULL_RTX) |
6304 { | 6302 { |
6305 for (; link; link = XEXP (link, 1)) | 6303 for (; link; link = XEXP (link, 1)) |
6306 if (GET_CODE (XEXP (link, 0)) == USE | 6304 if (GET_CODE (XEXP (link, 0)) == USE |
6307 && MEM_P (XEXP (XEXP (link, 0), 0))) | 6305 && MEM_P (XEXP (XEXP (link, 0), 0))) |
6315 #endif | 6313 #endif |
6316 INIT_CUMULATIVE_ARGS (args_so_far_v, type, NULL_RTX, fndecl, | 6314 INIT_CUMULATIVE_ARGS (args_so_far_v, type, NULL_RTX, fndecl, |
6317 nargs); | 6315 nargs); |
6318 if (obj_type_ref && TYPE_ARG_TYPES (type) != void_list_node) | 6316 if (obj_type_ref && TYPE_ARG_TYPES (type) != void_list_node) |
6319 { | 6317 { |
6320 machine_mode mode; | |
6321 t = TYPE_ARG_TYPES (type); | 6318 t = TYPE_ARG_TYPES (type); |
6322 mode = TYPE_MODE (TREE_VALUE (t)); | 6319 function_arg_info arg (TREE_VALUE (t), /*named=*/true); |
6323 this_arg = targetm.calls.function_arg (args_so_far, mode, | 6320 this_arg = targetm.calls.function_arg (args_so_far, arg); |
6324 TREE_VALUE (t), true); | |
6325 if (this_arg && !REG_P (this_arg)) | 6321 if (this_arg && !REG_P (this_arg)) |
6326 this_arg = NULL_RTX; | 6322 this_arg = NULL_RTX; |
6327 else if (this_arg == NULL_RTX) | 6323 else if (this_arg == NULL_RTX) |
6328 { | 6324 { |
6329 for (; link; link = XEXP (link, 1)) | 6325 for (; link; link = XEXP (link, 1)) |
6386 rtx mem = x; | 6382 rtx mem = x; |
6387 cselib_val *val; | 6383 cselib_val *val; |
6388 | 6384 |
6389 if (!frame_pointer_needed) | 6385 if (!frame_pointer_needed) |
6390 { | 6386 { |
6391 struct adjust_mem_data amd; | 6387 class adjust_mem_data amd; |
6392 amd.mem_mode = VOIDmode; | 6388 amd.mem_mode = VOIDmode; |
6393 amd.stack_adjust = -VTI (bb)->out.stack_adjust; | 6389 amd.stack_adjust = -VTI (bb)->out.stack_adjust; |
6394 amd.store = true; | 6390 amd.store = true; |
6395 mem = simplify_replace_fn_rtx (mem, NULL_RTX, adjust_mems, | 6391 mem = simplify_replace_fn_rtx (mem, NULL_RTX, adjust_mems, |
6396 &amd); | 6392 &amd); |
6427 call_arguments | 6423 call_arguments |
6428 = gen_rtx_EXPR_LIST (VOIDmode, item, call_arguments); | 6424 = gen_rtx_EXPR_LIST (VOIDmode, item, call_arguments); |
6429 } | 6425 } |
6430 if (t && t != void_list_node) | 6426 if (t && t != void_list_node) |
6431 { | 6427 { |
6432 tree argtype = TREE_VALUE (t); | |
6433 machine_mode mode = TYPE_MODE (argtype); | |
6434 rtx reg; | 6428 rtx reg; |
6435 if (pass_by_reference (&args_so_far_v, mode, argtype, true)) | 6429 function_arg_info arg (TREE_VALUE (t), /*named=*/true); |
6436 { | 6430 apply_pass_by_reference_rules (&args_so_far_v, arg); |
6437 argtype = build_pointer_type (argtype); | 6431 reg = targetm.calls.function_arg (args_so_far, arg); |
6438 mode = TYPE_MODE (argtype); | 6432 if (TREE_CODE (arg.type) == REFERENCE_TYPE |
6439 } | 6433 && INTEGRAL_TYPE_P (TREE_TYPE (arg.type)) |
6440 reg = targetm.calls.function_arg (args_so_far, mode, | |
6441 argtype, true); | |
6442 if (TREE_CODE (argtype) == REFERENCE_TYPE | |
6443 && INTEGRAL_TYPE_P (TREE_TYPE (argtype)) | |
6444 && reg | 6434 && reg |
6445 && REG_P (reg) | 6435 && REG_P (reg) |
6446 && GET_MODE (reg) == mode | 6436 && GET_MODE (reg) == arg.mode |
6447 && (GET_MODE_CLASS (mode) == MODE_INT | 6437 && (GET_MODE_CLASS (arg.mode) == MODE_INT |
6448 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT) | 6438 || GET_MODE_CLASS (arg.mode) == MODE_PARTIAL_INT) |
6449 && REG_P (x) | 6439 && REG_P (x) |
6450 && REGNO (x) == REGNO (reg) | 6440 && REGNO (x) == REGNO (reg) |
6451 && GET_MODE (x) == mode | 6441 && GET_MODE (x) == arg.mode |
6452 && item) | 6442 && item) |
6453 { | 6443 { |
6454 machine_mode indmode | 6444 machine_mode indmode |
6455 = TYPE_MODE (TREE_TYPE (argtype)); | 6445 = TYPE_MODE (TREE_TYPE (arg.type)); |
6456 rtx mem = gen_rtx_MEM (indmode, x); | 6446 rtx mem = gen_rtx_MEM (indmode, x); |
6457 cselib_val *val = cselib_lookup (mem, indmode, 0, VOIDmode); | 6447 cselib_val *val = cselib_lookup (mem, indmode, 0, VOIDmode); |
6458 if (val && cselib_preserved_value_p (val)) | 6448 if (val && cselib_preserved_value_p (val)) |
6459 { | 6449 { |
6460 item = gen_rtx_CONCAT (indmode, mem, val->val_rtx); | 6450 item = gen_rtx_CONCAT (indmode, mem, val->val_rtx); |
6490 } | 6480 } |
6491 break; | 6481 break; |
6492 } | 6482 } |
6493 } | 6483 } |
6494 } | 6484 } |
6495 targetm.calls.function_arg_advance (args_so_far, mode, | 6485 targetm.calls.function_arg_advance (args_so_far, arg); |
6496 argtype, true); | |
6497 t = TREE_CHAIN (t); | 6486 t = TREE_CHAIN (t); |
6498 } | 6487 } |
6499 } | 6488 } |
6500 | 6489 |
6501 /* Add debug arguments. */ | 6490 /* Add debug arguments. */ |
6640 n1 = VTI (bb)->mos.length (); | 6629 n1 = VTI (bb)->mos.length (); |
6641 /* This will record NEXT_INSN (insn), such that we can | 6630 /* This will record NEXT_INSN (insn), such that we can |
6642 insert notes before it without worrying about any | 6631 insert notes before it without worrying about any |
6643 notes that MO_USEs might emit after the insn. */ | 6632 notes that MO_USEs might emit after the insn. */ |
6644 cui.store_p = true; | 6633 cui.store_p = true; |
6645 note_stores (PATTERN (insn), add_stores, &cui); | 6634 note_stores (insn, add_stores, &cui); |
6646 n2 = VTI (bb)->mos.length () - 1; | 6635 n2 = VTI (bb)->mos.length () - 1; |
6647 mos = VTI (bb)->mos.address (); | 6636 mos = VTI (bb)->mos.address (); |
6648 | 6637 |
6649 /* Order the MO_VAL_USEs first (note_stores does nothing | 6638 /* Order the MO_VAL_USEs first (note_stores does nothing |
6650 on DEBUG_INSNs, so there are no MO_VAL_LOCs from this | 6639 on DEBUG_INSNs, so there are no MO_VAL_LOCs from this |
7062 edge e; | 7051 edge e; |
7063 int *bb_order; | 7052 int *bb_order; |
7064 int *rc_order; | 7053 int *rc_order; |
7065 int i; | 7054 int i; |
7066 int htabsz = 0; | 7055 int htabsz = 0; |
7067 int htabmax = PARAM_VALUE (PARAM_MAX_VARTRACK_SIZE); | 7056 int htabmax = param_max_vartrack_size; |
7068 bool success = true; | 7057 bool success = true; |
7069 | 7058 |
7070 timevar_push (TV_VAR_TRACKING_DATAFLOW); | 7059 timevar_push (TV_VAR_TRACKING_DATAFLOW); |
7071 /* Compute reverse completion order of depth first search of the CFG | 7060 /* Compute reverse completion order of depth first search of the CFG |
7072 so that the data-flow runs faster. */ | 7061 so that the data-flow runs faster. */ |
7180 if (htabmax && htabsz > htabmax) | 7169 if (htabmax && htabsz > htabmax) |
7181 { | 7170 { |
7182 if (MAY_HAVE_DEBUG_BIND_INSNS) | 7171 if (MAY_HAVE_DEBUG_BIND_INSNS) |
7183 inform (DECL_SOURCE_LOCATION (cfun->decl), | 7172 inform (DECL_SOURCE_LOCATION (cfun->decl), |
7184 "variable tracking size limit exceeded with " | 7173 "variable tracking size limit exceeded with " |
7185 "-fvar-tracking-assignments, retrying without"); | 7174 "%<-fvar-tracking-assignments%>, retrying without"); |
7186 else | 7175 else |
7187 inform (DECL_SOURCE_LOCATION (cfun->decl), | 7176 inform (DECL_SOURCE_LOCATION (cfun->decl), |
7188 "variable tracking size limit exceeded"); | 7177 "variable tracking size limit exceeded"); |
7189 success = false; | 7178 success = false; |
7190 break; | 7179 break; |
7330 /* Print the information about variables from hash table VARS to dump file. */ | 7319 /* Print the information about variables from hash table VARS to dump file. */ |
7331 | 7320 |
7332 static void | 7321 static void |
7333 dump_vars (variable_table_type *vars) | 7322 dump_vars (variable_table_type *vars) |
7334 { | 7323 { |
7335 if (vars->elements () > 0) | 7324 if (!vars->is_empty ()) |
7336 { | 7325 { |
7337 fprintf (dump_file, "Variables:\n"); | 7326 fprintf (dump_file, "Variables:\n"); |
7338 vars->traverse <void *, dump_var_tracking_slot> (NULL); | 7327 vars->traverse <void *, dump_var_tracking_slot> (NULL); |
7339 } | 7328 } |
7340 } | 7329 } |
8059 } | 8048 } |
8060 | 8049 |
8061 | 8050 |
8062 /* Structure for passing some other parameters to function | 8051 /* Structure for passing some other parameters to function |
8063 vt_expand_loc_callback. */ | 8052 vt_expand_loc_callback. */ |
8064 struct expand_loc_callback_data | 8053 class expand_loc_callback_data |
8065 { | 8054 { |
8055 public: | |
8066 /* The variables and values active at this point. */ | 8056 /* The variables and values active at this point. */ |
8067 variable_table_type *vars; | 8057 variable_table_type *vars; |
8068 | 8058 |
8069 /* Stack of values and debug_exprs under expansion, and their | 8059 /* Stack of values and debug_exprs under expansion, and their |
8070 children. */ | 8060 children. */ |
8326 | 8316 |
8327 static inline rtx | 8317 static inline rtx |
8328 vt_expand_var_loc_chain (variable *var, bitmap regs, void *data, | 8318 vt_expand_var_loc_chain (variable *var, bitmap regs, void *data, |
8329 bool *pendrecp) | 8319 bool *pendrecp) |
8330 { | 8320 { |
8331 struct expand_loc_callback_data *elcd | 8321 class expand_loc_callback_data *elcd |
8332 = (struct expand_loc_callback_data *) data; | 8322 = (class expand_loc_callback_data *) data; |
8333 location_chain *loc, *next; | 8323 location_chain *loc, *next; |
8334 rtx result = NULL; | 8324 rtx result = NULL; |
8335 int first_child, result_first_child, last_child; | 8325 int first_child, result_first_child, last_child; |
8336 bool pending_recursion; | 8326 bool pending_recursion; |
8337 rtx loc_from = NULL; | 8327 rtx loc_from = NULL; |
8465 static rtx | 8455 static rtx |
8466 vt_expand_loc_callback (rtx x, bitmap regs, | 8456 vt_expand_loc_callback (rtx x, bitmap regs, |
8467 int max_depth ATTRIBUTE_UNUSED, | 8457 int max_depth ATTRIBUTE_UNUSED, |
8468 void *data) | 8458 void *data) |
8469 { | 8459 { |
8470 struct expand_loc_callback_data *elcd | 8460 class expand_loc_callback_data *elcd |
8471 = (struct expand_loc_callback_data *) data; | 8461 = (class expand_loc_callback_data *) data; |
8472 decl_or_value dv; | 8462 decl_or_value dv; |
8473 variable *var; | 8463 variable *var; |
8474 rtx result, subreg; | 8464 rtx result, subreg; |
8475 bool pending_recursion = false; | 8465 bool pending_recursion = false; |
8476 bool from_empty = false; | 8466 bool from_empty = false; |
8489 GET_MODE (SUBREG_REG (x)), | 8479 GET_MODE (SUBREG_REG (x)), |
8490 SUBREG_BYTE (x)); | 8480 SUBREG_BYTE (x)); |
8491 | 8481 |
8492 /* Invalid SUBREGs are ok in debug info. ??? We could try | 8482 /* Invalid SUBREGs are ok in debug info. ??? We could try |
8493 alternate expansions for the VALUE as well. */ | 8483 alternate expansions for the VALUE as well. */ |
8494 if (!result) | 8484 if (!result && GET_MODE (subreg) != VOIDmode) |
8495 result = gen_rtx_raw_SUBREG (GET_MODE (x), subreg, SUBREG_BYTE (x)); | 8485 result = gen_rtx_raw_SUBREG (GET_MODE (x), subreg, SUBREG_BYTE (x)); |
8496 | 8486 |
8497 return result; | 8487 return result; |
8498 | 8488 |
8499 case DEBUG_EXPR: | 8489 case DEBUG_EXPR: |
8623 equivalences in VARS, updating their CUR_LOCs in the process. */ | 8613 equivalences in VARS, updating their CUR_LOCs in the process. */ |
8624 | 8614 |
8625 static rtx | 8615 static rtx |
8626 vt_expand_loc (rtx loc, variable_table_type *vars) | 8616 vt_expand_loc (rtx loc, variable_table_type *vars) |
8627 { | 8617 { |
8628 struct expand_loc_callback_data data; | 8618 class expand_loc_callback_data data; |
8629 rtx result; | 8619 rtx result; |
8630 | 8620 |
8631 if (!MAY_HAVE_DEBUG_BIND_INSNS) | 8621 if (!MAY_HAVE_DEBUG_BIND_INSNS) |
8632 return loc; | 8622 return loc; |
8633 | 8623 |
8645 in VARS, updating their CUR_LOCs in the process. */ | 8635 in VARS, updating their CUR_LOCs in the process. */ |
8646 | 8636 |
8647 static rtx | 8637 static rtx |
8648 vt_expand_1pvar (variable *var, variable_table_type *vars) | 8638 vt_expand_1pvar (variable *var, variable_table_type *vars) |
8649 { | 8639 { |
8650 struct expand_loc_callback_data data; | 8640 class expand_loc_callback_data data; |
8651 rtx loc; | 8641 rtx loc; |
8652 | 8642 |
8653 gcc_checking_assert (var->onepart && var->n_var_parts == 1); | 8643 gcc_checking_assert (var->onepart && var->n_var_parts == 1); |
8654 | 8644 |
8655 if (!dv_changed_p (var->dv)) | 8645 if (!dv_changed_p (var->dv)) |
9058 shared_hash *vars) | 9048 shared_hash *vars) |
9059 { | 9049 { |
9060 emit_note_data data; | 9050 emit_note_data data; |
9061 variable_table_type *htab = shared_hash_htab (vars); | 9051 variable_table_type *htab = shared_hash_htab (vars); |
9062 | 9052 |
9063 if (!changed_variables->elements ()) | 9053 if (changed_variables->is_empty ()) |
9064 return; | 9054 return; |
9065 | 9055 |
9066 if (MAY_HAVE_DEBUG_BIND_INSNS) | 9056 if (MAY_HAVE_DEBUG_BIND_INSNS) |
9067 process_changed_values (htab); | 9057 process_changed_values (htab); |
9068 | 9058 |
9536 vt_emit_notes (void) | 9526 vt_emit_notes (void) |
9537 { | 9527 { |
9538 basic_block bb; | 9528 basic_block bb; |
9539 dataflow_set cur; | 9529 dataflow_set cur; |
9540 | 9530 |
9541 gcc_assert (!changed_variables->elements ()); | 9531 gcc_assert (changed_variables->is_empty ()); |
9542 | 9532 |
9543 /* Free memory occupied by the out hash tables, as they aren't used | 9533 /* Free memory occupied by the out hash tables, as they aren't used |
9544 anymore. */ | 9534 anymore. */ |
9545 FOR_EACH_BB_FN (bb, cfun) | 9535 FOR_EACH_BB_FN (bb, cfun) |
9546 dataflow_set_clear (&VTI (bb)->out); | 9536 dataflow_set_clear (&VTI (bb)->out); |