> gcc/ChangeLog: > > * Makefile.in: Add lto-ltrans-cache.o. > * lto-wrapper.cc: Use ltrans cache. > * lto-ltrans-cache.cc: New file. > * lto-ltrans-cache.h: New file. OK. > + > +/* Computes checksum for given file, returns NULL_CHECKSUM if not > + possible. > + */
As a formating nit, there should be "possible. */" > + FILE *f_first = fopen (first_filename, "rb"); > + if (!f_first) > + return false; > + > + FILE *f_second = fopen (second_filename, "rb"); > + if (!f_second) > + { > + fclose (f_first); > + return false; > + } > + > + for (;;) > + { > + int c1, c2; > + c1 = fgetc (f_first); > + c2 = fgetc (f_second); fgetc has kind of non-trivial overhead. For non-MMAP systems (is Windows such?), I think allocating some buffer, say 64K and doing fread/memcmp is probably better. > +/* Reads next cache item from cachedata file. > + Adds `dir/` prefix to filenames. */ > +static ltrans_file_cache::item* > +read_cache_item (FILE* f, const char* dir) > +{ > + checksum_t checksum; > + uint32_t last_used; > + > + if (fread (&checksum, 1, checksum.size (), f) != checksum.size ()) > + return NULL; > + if (fread (&last_used, sizeof (last_used), 1, f) != 1) > + return NULL; > + > + std::string input (dir); > + input.push_back ('/'); > + std::string output = input; /* Copy. */ > + > + int c; > + while ((c = getc (f))) > + { > + if (c == EOF) > + return NULL; > + input.push_back (c); > + } > + input.push_back (0); > + while ((c = getc (f))) > + { > + if (c == EOF) > + return NULL; > + output.push_back (c); > + } > + output.push_back (0); Isn't std::string always 0 terminated? Patch is OK, but please update the fgetc based file compare. Honza