diff gen/functions.cpp @ 1155:ba9d6292572a

Fixed forward reference problem in struct methods on x86-64.
author Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
date Sat, 28 Mar 2009 09:00:32 +0100
parents 521dd1626d76
children 0424e7dfadb1
line wrap: on
line diff
--- a/gen/functions.cpp	Sat Mar 28 08:25:58 2009 +0100
+++ b/gen/functions.cpp	Sat Mar 28 09:00:32 2009 +0100
@@ -303,6 +303,16 @@
         return; // ignore declaration completely
     }
 
+    if (AggregateDeclaration* ad = fdecl->isMember())
+    {
+        ad->codegen(Type::sir);
+        if (ad->isStructDeclaration() && llvm::isa<llvm::OpaqueType>(DtoType(ad->type)))
+        {
+            ad->ir.irStruct->structFuncs.push_back(fdecl);
+            return;
+        }
+    }
+
     //printf("resolve function: %s\n", fdecl->toPrettyChars());
 
     if (fdecl->parent)
@@ -434,6 +444,8 @@
 
 void DtoDeclareFunction(FuncDeclaration* fdecl)
 {
+    DtoResolveFunction(fdecl);
+
     if (fdecl->ir.declared) return;
     fdecl->ir.declared = true;
 
@@ -478,6 +490,9 @@
     if (!func)
         func = llvm::Function::Create(functype, DtoLinkage(fdecl), mangled_name, gIR->module);
 
+    if (Logger::enabled())
+        Logger::cout() << "func = " << *func << std::endl;
+
     // add func to IRFunc
     fdecl->ir.irFunc->func = func;
 
@@ -594,6 +609,8 @@
 
 void DtoDefineFunction(FuncDeclaration* fd)
 {
+    DtoDeclareFunction(fd);
+
     if (fd->ir.defined) return;
     fd->ir.defined = true;