changeset 1067:7ce8355fbcc6

Improved template emission control for singleobj building.
author Christian Kamm <kamm incasoftware de>
date Sun, 08 Mar 2009 16:21:56 +0100
parents 186d44690036
children 7db4bb9602ed
files dmd/template.c dmd/template.h gen/cl_options.cpp gen/cl_options.h gen/llvmhelpers.cpp gen/llvmhelpers.h gen/main.cpp
diffstat 7 files changed, 24 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/template.c	Sun Mar 08 16:21:11 2009 +0100
+++ b/dmd/template.c	Sun Mar 08 16:21:56 2009 +0100
@@ -2875,6 +2875,7 @@
     this->errors = 0;
 
     // LDC
+    this->emittedInModule = NULL;
     this->tinst = NULL;
     this->tmodule = NULL;
 }
--- a/dmd/template.h	Sun Mar 08 16:21:11 2009 +0100
+++ b/dmd/template.h	Sun Mar 08 16:21:56 2009 +0100
@@ -327,6 +327,7 @@
     // LDC
     TemplateInstance *tinst; // enclosing template instance
     Module* tmodule; // module from outermost enclosing template instantiation
+    Module* emittedInModule; // which module this template instance has been emitted in
     void printInstantiationTrace();
 };
 
--- a/gen/cl_options.cpp	Sun Mar 08 16:21:11 2009 +0100
+++ b/gen/cl_options.cpp	Sun Mar 08 16:21:56 2009 +0100
@@ -326,6 +326,11 @@
     cl::ValueDisallowed);
 
 
+cl::opt<bool> singleObj("singleobj",
+    cl::desc("Create only a single output object file"),
+    cl::ZeroOrMore);
+
+
 static cl::extrahelp footer("\n"
 "-d-debug can also be specified without options, in which case it enables all\n"
 "debug checks (i.e. (asserts, boundchecks, contracts and invariants) as well\n"
--- a/gen/cl_options.h	Sun Mar 08 16:21:11 2009 +0100
+++ b/gen/cl_options.h	Sun Mar 08 16:21:56 2009 +0100
@@ -43,6 +43,7 @@
     extern cl::opt<std::string> mCPU;
     extern cl::list<std::string> mAttrs;
     extern cl::opt<std::string> mTargetTriple;
+    extern cl::opt<bool> singleObj;
 
     // Arguments to -d-debug
     extern std::vector<std::string> debugArgs;
--- a/gen/llvmhelpers.cpp	Sun Mar 08 16:21:11 2009 +0100
+++ b/gen/llvmhelpers.cpp	Sun Mar 08 16:21:56 2009 +0100
@@ -20,6 +20,7 @@
 #include "gen/functions.h"
 #include "gen/typeinf.h"
 #include "gen/todebug.h"
+#include "gen/cl_options.h"
 #include "ir/irmodule.h"
 
 #include <stack>
@@ -833,11 +834,11 @@
 //      TEMPLATE HELPERS
 ////////////////////////////////////////////////////////////////////////////////////////*/
 
-Module* DtoIsTemplateInstance(Dsymbol* s)
+TemplateInstance* DtoIsTemplateInstance(Dsymbol* s)
 {
     if (!s) return NULL;
     if (s->isTemplateInstance() && !s->isTemplateMixin())
-        return s->isTemplateInstance()->tmodule;
+        return s->isTemplateInstance();
     else if (s->parent)
         return DtoIsTemplateInstance(s->parent);
     return NULL;
@@ -1536,34 +1537,25 @@
 
 bool mustDefineSymbol(Dsymbol* s)
 {
-#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;
+    TemplateInstance* tinst = DtoIsTemplateInstance(s);
+    if (tinst)
+    {
+        if (!opts::singleObj)
+            return true;
+    
+        if (!tinst->emittedInModule)
+            tinst->emittedInModule = gIR->dmodule;
+        return tinst->emittedInModule == gIR->dmodule;
     }
-    return s->getCompilationModule() == gIR->dmodule;
-#endif
+    
+    return s->getModule() == gIR->dmodule;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
 bool needsTemplateLinkage(Dsymbol* s)
 {
-#if 1
-    return DtoIsTemplateInstance(s) != NULL;
-#else
-    Module* M = DtoIsTemplateInstance(s);
-    // only return true if the symbol is a template instances
-    // and if this instance originated in the current module
-    if (M)
-        return M == gIR->dmodule;
-    return false;
-#endif
+    return DtoIsTemplateInstance(s) && mustDefineSymbol(s);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
--- a/gen/llvmhelpers.h	Sun Mar 08 16:21:11 2009 +0100
+++ b/gen/llvmhelpers.h	Sun Mar 08 16:21:56 2009 +0100
@@ -62,7 +62,7 @@
 DValue* DtoPaintType(Loc& loc, DValue* val, Type* to);
 
 // is template instance check, returns module where instantiated
-Module* DtoIsTemplateInstance(Dsymbol* s);
+TemplateInstance* DtoIsTemplateInstance(Dsymbol* s);
 
 // these are all basically drivers for the codegeneration called by the main loop
 void DtoResolveDsymbol(Dsymbol* dsym);
--- a/gen/main.cpp	Sun Mar 08 16:21:11 2009 +0100
+++ b/gen/main.cpp	Sun Mar 08 16:21:56 2009 +0100
@@ -43,10 +43,6 @@
 extern void backend_init();
 extern void backend_term();
 
-static cl::opt<bool> singleObj("singleobj",
-    cl::desc("Create only a single output object file"),
-    cl::ZeroOrMore);
-
 static cl::opt<bool> noDefaultLib("nodefaultlib",
     cl::desc("Don't add a default library for linking implicitly"),
     cl::ZeroOrMore);