I have been trying to cleanup the location where the persistent ipa information is stored.

The original way that I did this was that I had a field in the var_ann structure that pointed to the ipa_information. Now that danny has reorganized the decls, the plan was to just add a field to the function_decl.

Danny has suggested that if I was going to add such a field, it should be a pointer to the cgraph_node and then store the persistent ipa information there.

I noticed that if I did this, there should be a lot of stuff that could fall away. There would be no need to have the hash table that points from function_decls to cgraph nodes as well as there was no need for the master_clone field since the cgraph node that the decl pointed to would be just this good. All of this sounds great... smaller, faster.

This has not gone as easy as I had hoped. Danny found the first stumbling block yesterday that the c decl merging needed to be enhanced.

The second bug appears to be harder. In c++, there really can be multiple function_decls with the same uid.

The kludge to handle them is documented in cp/name-lookup.c around line 670 and one test case to generate them is in gcc/testsuite/g++.dg/opt/inline2.C. There are several ways to go about fixing this: One is to just abandon my fix and let others (such as the code sourcery people deal with it when they go to build a real symbol table.)

It seems like a better way is to build a table of merges that need to be done and find some place after the c++ front end is finished but before the cgraph gets built and do one scan of the code and replace all of the offending decls.
Does such a location exist?

Is this the correct plan?

Kenny


Reply via email to