Mercurial > projects > ldc
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;