https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65536
--- Comment #22 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
(In reply to Jan Hubicka from comment #20)
> It seems that manuel just commented out the actual insertion to linemap,
> columns are still streamed and ignored.
>
> Doing so will clearly make ODR waring more difficult to follow, so perhaps
> we could try to go for it only after reading sufficiently large portion of
> program?
The problem is that by creating the line_table with physical locations
out-of-order, LTO is
1) creating a lot of maps, even for small column changes. Thus, consuming a lot
of extra memory.
2) increasing location_t values rapidly, thus probably triggering an overflow.
The line-maps.c code already dynamically disables column numbers when
location_t values get very large (I think this is the reason that there are no
column numbers in the examples you show). If the location_t numbers get even
larger, it will start returning UNKNOWN_LOCATION. Now I think that if you see
wrong line numbers is most probably because of wrong location info in the
front-ends, not because linemaps overflowed.
There is also some mismatch between the limits used by linemap_line_start():
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)
return 0; /* Give up completely and return UKNOWN_LOCATION */
column_bits = 0;
}
and the limits used by linemap_position_for_column:
if (to_column >= set->max_column_hint)
{
if (r >= 0xC000000 || to_column > LINE_MAP_MAX_COLUMN_NUMBER)
{
/* Running low on source_locations - disable column numbers. */
return r;
}
else
{
struct line_map *map = LINEMAPS_LAST_ORDINARY_MAP (set);
r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50);
}
}
I'm not sure if the gap may lead to some problem, but it seems unlikely. In the
worst case, it should return 0, thus UNKNOWN_LOCATION (I can see some instances
of this in your examples).