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);