> > I added new graph for 'xloc.column = 0' hack, just applied this > single patch to trunk. > Link: > https://drive.google.com/file/d/0B0pisUJ80pO1MW11WHdjMk9KQnc/edit?usp=sharing
Good, does these two patches combine together well? (they are rater orthogonal, but perhaps with columns disabled linemaps are no longer big enough to matter). Honza > > Martin > > > > >>Martin > >> > >> > >>>Honza > >>> > >>>Index: lto-streamer-in.c > >>>=================================================================== > >>>--- lto-streamer-in.c (revision 209047) > >>>+++ lto-streamer-in.c (working copy) > >>>@@ -145,21 +145,49 @@ canon_file_name (const char *string) > >>> } > >>> +/* location_cache is used at LTO read in to avoid too many duplicates > >>>in > >>>+ the linemap tables. */ > >>>+ > >>>+#define LOCATION_CACHE_SIZE 524287 > >>>+struct location_cache_entry > >>>+{ > >>>+ const char *file; > >>>+ int line; > >>>+ int col; > >>>+ location_t location; > >>>+}; > >>>+static struct location_cache_entry *location_cache; > >>>+ > >>>+/* Return hash of FILE/LINE/COL. */ > >>>+ > >>>+int > >>>+location_cache_hash (const char *file, int line, int col) > >>>+{ > >>>+ return iterative_hash_hashval_t ((size_t)file, > >>>+ iterative_hash_hashval_t (line, col)) > >>>% LOCATION_CACHE_SIZE; > >>>+} > >>>+ > >>>+ > >>> /* Read a location bitpack from input block IB. */ > >>> location_t > >>> lto_input_location (struct bitpack_d *bp, struct data_in *data_in) > >>> { > >>>- static const char *current_file; > >>>- static int current_line; > >>>+ static const char *current_file, *last_file; > >>>+ static int current_line, last_line; > >>> static int current_col; > >>> bool file_change, line_change, column_change; > >>> unsigned len; > >>>- bool prev_file = current_file != NULL; > >>>+ bool prev_file = last_file != NULL; > >>>+ int hash; > >>>+ const char *cfile; > >>> if (bp_unpack_value (bp, 1)) > >>> return UNKNOWN_LOCATION; > >>> + if (!location_cache) > >>>+ location_cache = XCNEWVEC (struct location_cache_entry, > >>>LOCATION_CACHE_SIZE); > >>>+ > >>> file_change = bp_unpack_value (bp, 1); > >>> line_change = bp_unpack_value (bp, 1); > >>> column_change = bp_unpack_value (bp, 1); > >>>@@ -175,18 +203,32 @@ lto_input_location (struct bitpack_d *bp > >>> if (column_change) > >>> current_col = bp_unpack_var_len_unsigned (bp); > >>>+ cfile = current_file; > >>>+ hash = location_cache_hash (cfile, current_line, current_col); > >>> - if (file_change) > >>>+ if (location_cache[hash].file == cfile > >>>+ && location_cache[hash].line == current_line > >>>+ && location_cache[hash].col == current_col + 1) > >>>+ return location_cache[hash].location; > >>>+ location_cache[hash].file = cfile; > >>>+ location_cache[hash].line = current_line; > >>>+ location_cache[hash].col = current_col + 1; > >>>+ > >>>+ if (current_file != last_file) > >>> { > >>> if (prev_file) > >>> linemap_add (line_table, LC_LEAVE, false, NULL, 0); > >>> linemap_add (line_table, LC_ENTER, false, current_file, > >>>current_line); > >>> } > >>>- else if (line_change) > >>>+ else if (current_line != last_line) > >>> linemap_line_start (line_table, current_line, current_col); > >>> - return linemap_position_for_column (line_table, current_col); > >>>+ location_cache[hash].location > >>>+ = linemap_position_for_column (line_table, current_col); > >>>+ last_file = current_file; > >>>+ last_line = current_line; > >>>+ return location_cache[hash].location; > >>> } > >>> @@ -981,6 +1023,27 @@ input_function (tree fn_decl, struct dat > >>> } > >>> bsi = gsi_start_bb (bb); > >>> while (!gsi_end_p (bsi)) > >>>+ { > >>>+ gimple stmt = gsi_stmt (bsi); > >>>+ /* If we're recompiling LTO objects with debug stmts but > >>>+ we're not supposed to have debug stmts, remove them now. > >>>+ We can't remove them earlier because this would cause uid > >>>+ mismatches in fixups, but we can do it at this point, as > >>>+ long as debug stmts don't require fixups. */ > >>>+ if (!MAY_HAVE_DEBUG_STMTS && is_gimple_debug (stmt)) > >>>+ { > >>>+ gimple_stmt_iterator gsi = bsi; > >>>+ gsi_next (&bsi); > >>>+ gsi_remove (&gsi, true); > >>>+ } > >>>+ else > >>>+ { > >>>+ gsi_next (&bsi); > >>>+ stmts[gimple_uid (stmt)] = stmt; > >>>+ } > >>>+ } > >>>+ bsi = gsi_start_bb (bb); > >>>+ while (!gsi_end_p (bsi)) > >>> { > >>> gimple stmt = gsi_stmt (bsi); > >>> /* If we're recompiling LTO objects with debug stmts but > >>