[cfe-dev] Controlling instantiation of templates from PCH
Lubos Lunak via cfe-dev
cfe-dev at lists.llvm.org
Wed May 29 04:18:07 PDT 2019
On Wednesday 29 of May 2019, Hans Wennborg wrote:
> On Tue, May 28, 2019 at 9:38 PM Lubos Lunak via cfe-dev
> > /Yc /Yu could act that way without extra flags, but I think they don't.
> > I've just skimmed over the sources, so I may be mistaken, but it seems to
> > me the /Yc mode is not different there. Unless /Yc somehow already
> > instantiates everything in the PCH and avoids such instantiations in TUs
> > using the PCH, there is still going to be the cost of
> > Sema::PerformPendingInstantiations() doing something that's not needed.
> > Remember that this is actually about improving the build time, not
> > necessarily the build result.
...
> I think this is more in the vein of
> http://llvm.org/viewvc/llvm-project?view=revision&revision=335466
>
> We could know that the definitions of the instantiated templates are
> in the PCH .obj file, and could hopefully skip it in other users of
> the PCH. And that's probably how MSVC does it.
That commit is based on the same idea as mine, but it's not exactly the same.
The point is that ASTContext::DeclMustBeEmitted() comes only after
Sema::InstantiateFunctionDefinition(). So your commit should result in
smaller object files and save the work of generating code for instantiations
from PCH in every TU, but I do not see anything that'd affect
Sema::InstantiateFunctionDefinition(), which is where the main cost of build
time is in my case. Moreover your patch always emits decls if they're
referenced, so it passes on the possibility to skip emitting those that are
already in the PCH's object file. I think your patch as it is in practice
makes a difference only for (dll)export-ed decls and nothing else, am I
getting that right?
But seeing that commit it makes sense to me to use the same base mechanism
for deciding if these optimizations can be done. Am I getting it right
that -building-pch-with-obj is really just a flag that gets written to
the .pch file? Then I think I can map my intended use to that easily
(use -building-pch-with-obj when creating the .pch just to add the flag, use
building-pch-with-obj -include-pch for empty source to create the
accompanying .o and then remaining files use the .pch normally).
--
Lubos Lunak
More information about the cfe-dev
mailing list