aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-streamer-in.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-03-27 07:58:59 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-03-27 06:58:59 +0000
commiteaeec5ecfa45ef6af7642c6bf45c3d77dd4de6b9 (patch)
treecbd2e935efaa0cca2a297c9acffbbdf68e1c834d /gcc/tree-streamer-in.c
parent38147a2a4e7c553840b45ba7d099a5f93ac192a4 (diff)
downloadgcc-eaeec5ecfa45ef6af7642c6bf45c3d77dd4de6b9.zip
gcc-eaeec5ecfa45ef6af7642c6bf45c3d77dd4de6b9.tar.gz
gcc-eaeec5ecfa45ef6af7642c6bf45c3d77dd4de6b9.tar.bz2
re PR lto/65536 (LTO line number information garbled)
PR lto/65536 * lto-streamer.h (class lto_location_cache): New. (struct data_in): Add location_cache. (lto_input_location): Update prototype. (stream_input_location_now): New. * streamer-hooks.h (struct streamer_hooks): Make input_location to take pointer to location. (stream_input_location): Update. * ipa-devirt.c: Include streamer-hooks.h and lto-streamer.h (warn_odr): Apply location cache before warning. (lto_input_location): Update prototype. * gimple-streamer-in.c (input_phi, input_gimple_stmt): Use stream_input_location_now. * lto/lto.c (unify_scc): Revert location cache when unification suceeded. (lto_read_decls): Accept location cache after sucess; apply location cache before calling debug hooks. * lto-streamer-in.c (lto_location_cache::current_cache): New static variable. (lto_location_cache::cmp_loc): New function. (lto_location_cache::apply_location_cache): New function. (lto_location_cache::accept_location_cache): New function. (lto_location_cache::revert_location_cache): New function. (lto_location_cache::input_location): New function. (lto_input_location): Do location caching. (stream_input_location_now): New function. (input_eh_region, input_struct_function_base): Use stream_input_location_now. (lto_data_in_create): use new. (lto_data_in_delete): Use delete. * tree-streamer-in.c (unpack_ts_block_value_fields, unpack_ts_omp_clause_value_fields, streamer_read_tree_bitfields, lto_input_ts_exp_tree_pointers): Update for cached location api. From-SVN: r221720
Diffstat (limited to 'gcc/tree-streamer-in.c')
-rw-r--r--gcc/tree-streamer-in.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c
index 42e2a73..6d84efb 100644
--- a/gcc/tree-streamer-in.c
+++ b/gcc/tree-streamer-in.c
@@ -411,7 +411,7 @@ unpack_ts_block_value_fields (struct data_in *data_in,
{
BLOCK_ABSTRACT (expr) = (unsigned) bp_unpack_value (bp, 1);
/* BLOCK_NUMBER is recomputed. */
- BLOCK_SOURCE_LOCATION (expr) = stream_input_location (bp, data_in);
+ stream_input_location (&BLOCK_SOURCE_LOCATION (expr), bp, data_in);
}
/* Unpack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL
@@ -433,7 +433,7 @@ static void
unpack_ts_omp_clause_value_fields (struct data_in *data_in,
struct bitpack_d *bp, tree expr)
{
- OMP_CLAUSE_LOCATION (expr) = stream_input_location (bp, data_in);
+ stream_input_location (&OMP_CLAUSE_LOCATION (expr), bp, data_in);
switch (OMP_CLAUSE_CODE (expr))
{
case OMP_CLAUSE_DEFAULT:
@@ -503,7 +503,7 @@ streamer_read_tree_bitfields (struct lto_input_block *ib,
unpack_ts_fixed_cst_value_fields (&bp, expr);
if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
- DECL_SOURCE_LOCATION (expr) = stream_input_location (&bp, data_in);
+ stream_input_location (&DECL_SOURCE_LOCATION (expr), &bp, data_in);
if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
unpack_ts_decl_common_value_fields (&bp, expr);
@@ -522,7 +522,7 @@ streamer_read_tree_bitfields (struct lto_input_block *ib,
if (CODE_CONTAINS_STRUCT (code, TS_EXP))
{
- SET_EXPR_LOCATION (expr, stream_input_location (&bp, data_in));
+ stream_input_location (&EXPR_CHECK (expr)->exp.locus, &bp, data_in);
if (code == MEM_REF
|| code == TARGET_MEM_REF)
{
@@ -905,11 +905,20 @@ lto_input_ts_exp_tree_pointers (struct lto_input_block *ib,
struct data_in *data_in, tree expr)
{
int i;
+ tree block;
for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
TREE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
- TREE_SET_BLOCK (expr, stream_read_tree (ib, data_in));
+ block = stream_read_tree (ib, data_in);
+
+ /* TODO: Block is stored in the locus information. It may make more sense to
+ to make it go via the location cache. */
+ if (block)
+ {
+ data_in->location_cache.apply_location_cache ();
+ TREE_SET_BLOCK (expr, block);
+ }
}