https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65536
--- Comment #17 from Manuel López-Ibáñez <manu at gcc dot gnu.org> --- (In reply to Jan Hubicka from comment #16) > Other easier to implement idea for GCC 5 may be to simply collect locaiton For GCC 5 you should just disable column numbers in line-maps. This will save you a lot of source_locations before overflowing. If you don't overflow the source_locations themselves, then the line numbers at least should come out right. Something like this (not even compiled): Index: src/libcpp/include/line-map.h =================================================================== --- src/libcpp/include/line-map.h (revision 221557) +++ src/libcpp/include/line-map.h (working copy) @@ -88,10 +88,14 @@ struct GTY(()) line_map_ordinary { /* This is the highest possible source location encoded within an ordinary or macro map. */ #define MAX_SOURCE_LOCATION 0x7FFFFFFF +/* We do not track column numbers higher than this one. */ +#define LINE_MAP_MAX_COLUMN_NUMBER 100000 + + struct cpp_hashnode; /* A macro line map encodes location of tokens coming from a macro expansion. Index: src/libcpp/line-map.c =================================================================== --- src/libcpp/line-map.c (revision 221557) +++ src/libcpp/line-map.c (working copy) @@ -536,11 +536,11 @@ linemap_line_start (struct line_maps *se else max_column_hint = set->max_column_hint; if (add_map) { int column_bits; - if (max_column_hint > 100000 || highest > 0x60000000) + if (max_column_hint > LINE_MAP_MAX_COLUMN_NUMBER || highest > 0x60000000) { /* If the column number is ridiculous or we've allocated a huge number of source_locations, give up on column numbers. */ max_column_hint = 0; if (highest > 0x70000000) @@ -598,11 +598,11 @@ linemap_position_for_column (struct line linemap_assert (!linemap_macro_expansion_map_p (LINEMAPS_LAST_ORDINARY_MAP (set))); if (to_column >= set->max_column_hint) { - if (r >= 0xC000000 || to_column > 100000) + if (r >= 0xC000000 || to_column > LINE_MAP_MAX_COLUMN_NUMBER) { /* Running low on source_locations - disable column numbers. */ return r; } else Index: src/gcc/lto-streamer-in.c =================================================================== --- src/gcc/lto-streamer-in.c (revision 221557) +++ src/gcc/lto-streamer-in.c (working copy) @@ -198,21 +198,23 @@ lto_input_location (struct bitpack_d *bp current_line = bp_unpack_var_len_unsigned (bp); if (column_change) current_col = bp_unpack_var_len_unsigned (bp); - if (file_change) + if (file_change) { if (prev_file) - linemap_add (line_table, LC_LEAVE, false, NULL, 0); - - linemap_add (line_table, LC_ENTER, false, current_file, current_line); + linemap_add (line_table, LC_RENAME, false, current_file, current_line); + else + linemap_add (line_table, LC_ENTER, false, current_file, current_line); } else if (line_change) - linemap_line_start (line_table, current_line, current_col); + /* Enough column_hint to disable columns */ + return linemap_line_start (line_table, current_line, LINE_MAP_MAX_COLUMN_NUMBER + 1); - return linemap_position_for_column (line_table, current_col); + /* Enough column_hint to disable columns */ + return linemap_position_for_column (line_table, LINE_MAP_MAX_COLUMN_NUMBER + 1); } /* Read a reference to a tree node from DATA_IN using input block IB. TAG is the expected node that should be found in IB, if TAG belongs