Mercurial > projects > ldc
changeset 948:780530d1cad3
Revert templates to old behavior.
While emitting a template instantiation only once is good for compile times
and binary sizes, it doesn't work with linkonce linkage as inlined function
bodies could be discarded. Since we don't want to inhibit inlining, templates
are reverted to the previous behavior, where an instantiation is emitted for
each module using it.
In the future, a custom inlining pass may allow us to switch back to
common/weak linkage and reenable smart template instance emission.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 08 Feb 2009 21:44:46 +0100 |
parents | 9a10fa839dc5 |
children | b2d27ddf8f45 e71c61befd6d |
files | dmd/template.c gen/llvmhelpers.cpp |
diffstat | 2 files changed, 7 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/dmd/template.c Sun Feb 08 18:51:32 2009 +0100 +++ b/dmd/template.c Sun Feb 08 21:44:46 2009 +0100 @@ -2873,7 +2873,10 @@ this->havetempdecl = 0; this->isnested = NULL; this->errors = 0; + + // LDC this->tinst = NULL; + this->tmodule = NULL; } /***************** @@ -2988,6 +2991,7 @@ tmodule = tinst->tmodule; else tmodule = sc->module; + //printf("%s in %s\n", toChars(), tmodule->toChars()); #if LOG printf("\tdo semantic\n");
--- a/gen/llvmhelpers.cpp Sun Feb 08 18:51:32 2009 +0100 +++ b/gen/llvmhelpers.cpp Sun Feb 08 21:44:46 2009 +0100 @@ -1557,13 +1557,14 @@ bool mustDefineSymbol(Dsymbol* s) { -#if 0 +#if 1 return s->getModule() == gIR->dmodule || DtoIsTemplateInstance(s) != NULL; #else Module* M = DtoIsTemplateInstance(s); // if it's a template instance, check the instantiating module // not the module that defines the template if (M) { + //Logger::println("TINST %s from %s cur %s", s->toPrettyChars(), M->toChars(), gIR->dmodule->toChars()); return M == gIR->dmodule; } return s->getCompilationModule() == gIR->dmodule; @@ -1574,7 +1575,7 @@ bool needsTemplateLinkage(Dsymbol* s) { -#if 0 +#if 1 return DtoIsTemplateInstance(s) != NULL; #else Module* M = DtoIsTemplateInstance(s);