https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65536
--- Comment #23 from Manuel López-Ibáñez <manu at gcc dot gnu.org> --- (In reply to Manuel López-Ibáñez from comment #15) > (In reply to Jakub Jelinek from comment #14) > > By streaming the line_table directly you'd stream lots of location_t that > > are not actually used for anything that is streamed into the LTO. > > I don't understand why the tables would be huge, the string would of course > > use normal LTO section string sharing, and if we stream right now every > > location_t as the triplet, it would mean in case a single location_t is > > never used by more than one tree we'd stream an integer extra to what we > > stream now (just the triplets would be streamed in a different place), but > > in the more common case where one location_t is used by many trees, we'd > > stream less than what we stream now, due to the additional indirection. > [...] > Of course, if you are really unlucky, each location_t used by LTO may belong > to a different map, thus you cannot remove anything and then it would have > been more efficient to use a file:line:column table. In this worst case, the > overhead would be approximately sizeof(struct line_map) * number of rows in > the file:line:column table. In fact, looking at struct GTY(()) line_map_ordinary { const char *to_file; linenum_type to_line; /* An index into the set that gives the line mapping at whose end the current one was included. File(s) at the bottom of the include stack have this set to -1. */ int included_from; /* SYSP is one for a system header, two for a C system header file that therefore needs to be extern "C" protected in C++, and zero otherwise. This field isn't really needed now that it's in cpp_buffer. */ unsigned char sysp; /* Number of the low-order source_location bits used for a column number. */ unsigned int column_bits : 8; }; If we do not care about sysp and included_from, then even in the worst case, it will be more efficient to stream out the line_table than the file:line:column table. And it has the benefit that it is already sorted and the location_t values within trees/gimple can be streamed out directly without calling linemap_lookup to get the file:line:column for each of them. And since a location_t takes 1/3 of space that file:line:column, that would reduce the streamed out data even further.