Hi Diego! Sorry to have missed this talk at the GCC Summit, this work looks interesting.
> We have created a new branch for the incremental parsing work > that Lawrence and I described at the last GCC Summit > (http://gcc.gnu.org/wiki/summit2010?action=AttachFile&do=get&target=IncrementalCompiler.pdf). > > To get the branch: > > $ svn co svn+ssh://gcc.gnu.org/svn/gcc/branches/pph I've been trying to use this, and have some basic usage questions for you. From your description in the email above, in particular: " The code currently implements a token cache on disk. This is currently enabled with -fpth (for Pre-Tokenized Headers). Each file in a translation unit gets its own .pth image. When a file is found unchanged wrt the .pth image, its tokens are instantiated out of the image instead of the text stream. This saves on average ~15% of compilation time on C++. PTH images are factored, so a change in one file does require building the complete PTH image for the whole TU. Additionally, each PTH file is segmented into token hunks, each of which can be validated and applied separately. This allows reusing the same PTH file in different translation units." However, in use I am having problems with this. For instance, take the following two files: 1.cc #include <vector> #include <iostream> int main() { using namespace std; vector<int> v; for(unsigned int i = 0; i<100; ++i) v.push_back(i); cout << v[10] << endl; return 0; } 2.cc #include <string> #include <iostream> int main() { using namespace std; string s("100 count vector"); cout << s << endl; return 0; } To compile the first, I check out and build the branch. I use this like so: mkdir tmp; cd tmp g++ -fpth ../1.cc This seems fine. I end up with an a.out executable, and 89 separate .pth files. The pth files are named like: _usr_include_ctype_h.pth or _mnt_share_bin_H_x86_64_gcc_pph_branch_20101201_bin____lib_gcc_x86_64_unknown_linux_gnu_4_6_0_____________include_c___4_6_0_x86_64_unknown_linux_gnu_bits_os_defines_h.pth This seems as expected. Now, I should be able to compile again, exact same compile line, and use the cache. Like: %g++ -fpth ../1.cc In file included from ../test_multi_1.cc:33554432:0: /usr/include/locale.h:179:2: error: #endif without #if In file included from ../test_multi_1.cc:33554432:0: /usr/include/sched.h:98:2: error: #endif without #if In file included from ../test_multi_1.cc:33554432:0: /usr/include/pthread.h:1119:2: error: #endif without #if In file included from ../test_multi_1.cc:33554432:0: /usr/include/unistd.h:938:2: error: #endif without #if In file included from ../test_multi_1.cc:33554432:0: /usr/include/wctype.h:7:2: error: #endif without #if In file included from ../test_multi_1.cc:33554432:0: /usr/include/wctype.h:285:2: error: #endif without #if This seems to be an error. This is supposed to work, correct? Then, assuming this worked, then (re-using 1's images) %g++ -fpth ../2.cc Should in theory re-use 1's images and generate any new images that are necessary (according to the initial email. I understand results may vary at the moment.) This does not work atm, but gets errors similar to the #endif without #if errors above, but for a different file than locale.h. From discussing this with you via email, it looks like there are two options for -fpth, one with uses a timestamp (-fpth) and one that uses an md5 hash (-fpth-md5). -fpth // use timestamp -fpth-md5 // use md5 of file Please note the -fpth-md5 does not do anything on the branch at the moment. (Ie using it means no .pth files are generated.) Anyway. This is from my initial use and probing. Is it worth filing these bugs in bugzilla for the pph branch, or is this branch kind of dead while you work on the thing-after-pph-branch? I'd like to start documenting this project/branch on the GCC wiki. At least the command options in gcc/c-family/c.opt, and have usage examples. You'd mentioned that this may use the incremental linker page, but as PPH/PTH is but one part of this I'm hoping to convince you to use a new page, say PrettyCachedHeader or PPHPTH or FECaching or something. Thoughts? -benjamin