changeset 1403:e5c5d354c649

Tentative fix for semantic3 on imported modules and unnecessary template function definition issue. Please test! Also change linkage of __interfaceInfos to external (same as __Class, __vtbl, __init). The other change might make this superfluous.
author Christian Kamm <kamm incasoftware de>
date Thu, 21 May 2009 10:56:04 +0200
parents 1311dabc6a1f
children 11b122f92136
files gen/llvmhelpers.cpp gen/main.cpp ir/irclass.cpp
diffstat 3 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/gen/llvmhelpers.cpp	Wed May 20 21:13:41 2009 +0200
+++ b/gen/llvmhelpers.cpp	Thu May 21 10:56:04 2009 +0200
@@ -1371,6 +1371,11 @@
     {
         if (fd->isArrayOp)
             return true;
+            
+        // we can't (and probably shouldn't?) define functions 
+        // that weren't semantic3'ed
+        if (fd->semanticRun < 4)
+            return false;
     }
 
     TemplateInstance* tinst = DtoIsTemplateInstance(s);
--- a/gen/main.cpp	Wed May 20 21:13:41 2009 +0200
+++ b/gen/main.cpp	Thu May 21 10:56:04 2009 +0200
@@ -811,7 +811,6 @@
          */
         if (!global.params.useArrayBounds && !global.params.useAssert)
         {
-#endif
             // Do pass 3 semantic analysis on all imported modules,
             // since otherwise functions in them cannot be inlined
             for (int i = 0; i < Module::amodules.dim; i++)
@@ -823,7 +822,6 @@
             }
             if (global.errors)
                 fatal();
-#if !IN_LLVM
         }
 
         for (int i = 0; i < modules.dim; i++)
@@ -834,9 +832,9 @@
             m->inlineScan();
         }
     }
-#endif
     if (global.errors)
         fatal();
+#endif
 
     // write module dependencies to file if requested
     if (global.params.moduleDepsFile != NULL) 
--- a/ir/irclass.cpp	Wed May 20 21:13:41 2009 +0200
+++ b/ir/irclass.cpp	Thu May 21 10:56:04 2009 +0200
@@ -120,7 +120,9 @@
     std::string name("_D");
     name.append(cd->mangle());
     name.append("16__interfaceInfosZ");
-    classInterfacesArray = new llvm::GlobalVariable(array_type, true, DtoLinkage(cd), NULL, name, classInfo);
+
+    llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(aggrdecl);
+    classInterfacesArray = new llvm::GlobalVariable(array_type, true, _linkage, NULL, name, classInfo);
 
     return classInterfacesArray;
 }