static void get_inline_stack (location_t locus, inline_stack *stack) { if (LOCATION_LOCUS (locus) == UNKNOWN_LOCATION) return; tree block = LOCATION_BLOCK (locus); if (block && TREE_CODE (block) == BLOCK) { int level = 0; for (block = BLOCK_SUPERCONTEXT (block); block && (TREE_CODE (block) == BLOCK); block = BLOCK_SUPERCONTEXT (block)) { location_t tmp_locus = BLOCK_SOURCE_LOCATION (block); if (LOCATION_LOCUS (tmp_locus) == UNKNOWN_LOCATION) continue; tree decl = get_function_decl_from_block (block); stack->safe_push ( std::make_pair (decl, get_combined_location (locus, decl))); locus = tmp_locus; level++; } } stack->safe_push ( std::make_pair (current_function_decl, get_combined_location (locus, current_function_decl))); }
static void unpack_ts_block_value_fields (struct data_in *data_in, struct bitpack_d *bp, tree expr) { BLOCK_ABSTRACT (expr) = (unsigned) bp_unpack_value (bp, 1); /* BLOCK_NUMBER is recomputed. */ stream_input_location (&BLOCK_SOURCE_LOCATION (expr), bp, data_in); }
static unsigned get_relative_location_for_stmt (gimple *stmt) { location_t locus = gimple_location (stmt); if (LOCATION_LOCUS (locus) == UNKNOWN_LOCATION) return UNKNOWN_LOCATION; for (tree block = gimple_block (stmt); block && (TREE_CODE (block) == BLOCK); block = BLOCK_SUPERCONTEXT (block)) if (LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) != UNKNOWN_LOCATION) return get_combined_location (locus, get_function_decl_from_block (block)); return get_combined_location (locus, current_function_decl); }
static void pack_ts_block_value_fields (struct output_block *ob, struct bitpack_d *bp, tree expr) { bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1); /* BLOCK_NUMBER is recomputed. */ /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those that represent inlined function scopes. For the rest them on the floor instead of ICEing in dwarf2out.c. */ if (inlined_function_outer_scope_p (expr)) stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr)); else stream_output_location (ob, bp, UNKNOWN_LOCATION); }
static tree get_function_decl_from_block (tree block) { tree decl; if (LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block) == UNKNOWN_LOCATION)) return NULL_TREE; for (decl = BLOCK_ABSTRACT_ORIGIN (block); decl && (TREE_CODE (decl) == BLOCK); decl = BLOCK_ABSTRACT_ORIGIN (decl)) if (TREE_CODE (decl) == FUNCTION_DECL) break; return decl; }