Mercurial > projects > ldc
diff gen/toir.cpp @ 144:a27941d00351 trunk
[svn r149] fixed: a bunch of D-style variadics problems.
fixed: GotoDefaultStatement implemented.
fixed: some other minor bugs.
author | lindquist |
---|---|
date | Sat, 26 Jan 2008 17:13:22 +0100 |
parents | 336ec4f4bbb3 |
children | 2c336566ffed |
line wrap: on
line diff
--- a/gen/toir.cpp Fri Jan 25 01:42:36 2008 +0100 +++ b/gen/toir.cpp Sat Jan 26 17:13:22 2008 +0100 @@ -153,19 +153,25 @@ if (vd->ident == Id::_arguments) { Logger::println("Id::_arguments"); - if (!vd->getIrValue()) + /*if (!vd->getIrValue()) vd->getIrValue() = p->func()->decl->irFunc->_arguments; assert(vd->getIrValue()); - return new DVarValue(vd, vd->getIrValue(), true); + return new DVarValue(vd, vd->getIrValue(), true);*/ + llvm::Value* v = p->func()->decl->irFunc->_arguments; + assert(v); + return new DVarValue(vd, v, true); } // _argptr else if (vd->ident == Id::_argptr) { Logger::println("Id::_argptr"); - if (!vd->getIrValue()) + /*if (!vd->getIrValue()) vd->getIrValue() = p->func()->decl->irFunc->_argptr; assert(vd->getIrValue()); - return new DVarValue(vd, vd->getIrValue(), true); + return new DVarValue(vd, vd->getIrValue(), true);*/ + llvm::Value* v = p->func()->decl->irFunc->_argptr; + assert(v); + return new DVarValue(vd, v, true); } // _dollar else if (vd->ident == Id::dollar) @@ -1048,9 +1054,14 @@ std::vector<const llvm::Type*> vtypes; std::vector<llvm::Value*> vtypeinfos; + // number of non variadic args + int begin = tf->parameters->dim; + Logger::println("num non vararg params = %d", begin); + // build struct with argument types - for (int i=0; i<arguments->dim; i++) + for (int i=begin; i<arguments->dim; i++) { + Argument* argu = Argument::getNth(tf->parameters, i); Expression* argexp = (Expression*)arguments->data[i]; vtypes.push_back(DtoType(argexp->type)); } @@ -1059,30 +1070,30 @@ llvm::Value* mem = new llvm::AllocaInst(vtype,"_argptr_storage",p->topallocapoint()); // store arguments in the struct - for (int i=0; i<arguments->dim; i++) + for (int i=begin,k=0; i<arguments->dim; i++,k++) { Expression* argexp = (Expression*)arguments->data[i]; if (global.params.llvmAnnotate) DtoAnnotation(argexp->toChars()); - DtoVariadicArgument(argexp, DtoGEPi(mem,0,i,"tmp")); + DtoVariadicArgument(argexp, DtoGEPi(mem,0,k,"tmp")); } // build type info array assert(Type::typeinfo->irStruct->constInit); - const llvm::Type* typeinfotype = getPtrToType(Type::typeinfo->irStruct->constInit->getType()); - Logger::cout() << "typeinfo ptr type: " << *typeinfotype << '\n'; + const llvm::Type* typeinfotype = DtoType(Type::typeinfo->type); const llvm::ArrayType* typeinfoarraytype = llvm::ArrayType::get(typeinfotype,vtype->getNumElements()); llvm::Value* typeinfomem = new llvm::AllocaInst(typeinfoarraytype,"_arguments_storage",p->topallocapoint()); - for (int i=0; i<arguments->dim; i++) + Logger::cout() << "_arguments storage: " << *typeinfomem << '\n'; + for (int i=begin,k=0; i<arguments->dim; i++,k++) { Expression* argexp = (Expression*)arguments->data[i]; TypeInfoDeclaration* tidecl = argexp->type->getTypeInfoDeclaration(); DtoForceDeclareDsymbol(tidecl); assert(tidecl->getIrValue()); vtypeinfos.push_back(tidecl->getIrValue()); - llvm::Value* v = p->ir->CreateBitCast(vtypeinfos[i], typeinfotype, "tmp"); - p->ir->CreateStore(v, DtoGEPi(typeinfomem,0,i,"tmp")); + llvm::Value* v = p->ir->CreateBitCast(vtypeinfos[k], typeinfotype, "tmp"); + p->ir->CreateStore(v, DtoGEPi(typeinfomem,0,k,"tmp")); } // put data in d-array @@ -1096,7 +1107,18 @@ j++; llargs[j] = p->ir->CreateBitCast(mem, getPtrToType(llvm::Type::Int8Ty), "tmp"); j++; - llargs.resize(nimplicit+2); + + // pass non variadic args + for (int i=0; i<begin; i++) + { + Argument* fnarg = Argument::getNth(tf->parameters, i); + DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]); + llargs[j] = argval->getRVal(); + j++; + } + + // make sure arg vector has the right size + llargs.resize(nimplicit+begin+2); } // normal function else { @@ -1122,20 +1144,23 @@ } } } - Logger::println("%d params passed", n); - for (int i=0; i<n; ++i) { - assert(llargs[i]); - Logger::cout() << *llargs[i] << '\n'; - } } } + #if 1 + Logger::println("%d params passed", n); + for (int i=0; i<llargs.size(); ++i) { + assert(llargs[i]); + Logger::cout() << "arg["<<i<<"] = " << *llargs[i] << '\n'; + } + #endif + // void returns cannot not be named const char* varname = ""; if (llfnty->getReturnType() != llvm::Type::VoidTy) varname = "tmp"; - //Logger::cout() << "Calling: " << *funcval << '\n'; + Logger::cout() << "Calling: " << *funcval << '\n'; // call the function llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); @@ -2263,6 +2288,11 @@ } eval = DtoDynArrayIs(op,l,r); } + else if (t1->isfloating()) + { + llvm::FCmpInst::Predicate pred = (op == TOKidentity) ? llvm::FCmpInst::FCMP_OEQ : llvm::FCmpInst::FCMP_ONE; + eval = new llvm::FCmpInst(pred, l, r, "tmp", p->scopebb()); + } else { llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; if (t1->ty == Tpointer && v->isNull() && l->getType() != r->getType()) { @@ -2283,6 +2313,7 @@ DValue* u = e1->toElem(p); DValue* v = e2->toElem(p); + assert(e2->type == type); return v; } @@ -2991,7 +3022,9 @@ } Statement *AsmStatement::syntaxCopy() { - assert(0); + /*error("%s: inline asm is not yet implemented", loc.toChars()); + fatal(); + assert(0);*/ return 0; } @@ -3008,7 +3041,9 @@ int AsmStatement::comeFrom() { - assert(0); + /*error("%s: inline asm is not yet implemented", loc.toChars()); + fatal(); + assert(0);*/ return 0; }