Mercurial > projects > ldc
diff gen/toir.cpp @ 98:6789050b5ad1 trunk
[svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
Now uses the DMD _adEq(void[], void[], TypeInfo) runtime function for array equality comparison.
author | lindquist |
---|---|
date | Wed, 14 Nov 2007 23:39:10 +0100 |
parents | c4e161556a21 |
children | a676a7743642 |
line wrap: on
line diff
--- a/gen/toir.cpp Wed Nov 14 20:18:01 2007 +0100 +++ b/gen/toir.cpp Wed Nov 14 23:39:10 2007 +0100 @@ -64,6 +64,7 @@ //allocainst->setAlignment(vd->type->alignsize()); // TODO vd->llvmValue = allocainst; } + Logger::cout() << "llvm value for decl: " << *vd->llvmValue << '\n'; DValue* ie = DtoInitializer(vd->init); } @@ -1364,19 +1365,14 @@ Logger::print("SymOffExp::toElem: %s | %s\n", toChars(), type->toChars()); LOG_SCOPE; + assert(0 && "SymOffExp::toElem should no longer be called :/"); + if (VarDeclaration* vd = var->isVarDeclaration()) { Logger::println("VarDeclaration"); if (!vd->llvmTouched && vd->isDataseg()) vd->toObjFile(); - // TODO - /* - if (vd->isTypedefDeclaration()) { - e->istypeinfo = true; - } - */ - assert(vd->llvmValue); Type* t = DtoDType(type); Type* tnext = DtoDType(t->next); @@ -1540,6 +1536,7 @@ llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); llvm::Value* vtblidx = llvm::ConstantInt::get(llvm::Type::Int32Ty, (size_t)fdecl->vtblIndex, false); + Logger::cout() << "vthis: " << *vthis << '\n'; funcval = DtoGEP(vthis, zero, zero, "tmp", p->scopebb()); funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb()); funcval = DtoGEP(funcval, zero, vtblidx, toChars(), p->scopebb()); @@ -1871,15 +1868,10 @@ } eval = new llvm::FCmpInst(cmpop, l->getRVal(), r->getRVal(), "tmp", p->scopebb()); } - else if (t->ty == Tsarray) + else if (t->ty == Tsarray || t->ty == Tarray) { - Logger::println("static array"); - eval = DtoStaticArrayCompare(op,l->getRVal(),r->getRVal()); - } - else if (t->ty == Tarray) - { - Logger::println("dynamic array"); - eval = DtoDynArrayCompare(op,l->getRVal(),r->getRVal()); + Logger::println("static or dynamic array"); + eval = DtoArrayEquals(op,l,r); } else if (t->ty == Tdelegate) { @@ -2568,12 +2560,21 @@ else assert(0); + Logger::cout() << "array literal mem: " << *mem << '\n'; + for (unsigned i=0; i<elements->dim; ++i) { Expression* expr = (Expression*)elements->data[i]; llvm::Value* elemAddr = DtoGEPi(mem,0,i,"tmp",p->scopebb()); + DVarValue* vv = new DVarValue(expr->type, elemAddr, true); + p->exps.push_back(IRExp(NULL, expr, vv)); DValue* e = expr->toElem(p); - new llvm::StoreInst(e->getRVal(), elemAddr, p->scopebb()); + p->exps.pop_back(); + + DImValue* im = e->isIm(); + if (!im || !im->inPlace()) { + DtoAssign(vv, e); + } } if (ty->ty == Tsarray)