Mercurial > projects > ldc
diff gen/toir.c @ 77:714057ff2dbb trunk
[svn r81] Fixed: Union support was very buggy. Should be fairly solid now.
author | lindquist |
---|---|
date | Wed, 31 Oct 2007 09:34:18 +0100 |
parents | 9e1bd80a7e98 |
children | 2332006e1fa4 |
line wrap: on
line diff
--- a/gen/toir.c Wed Oct 31 07:24:02 2007 +0100 +++ b/gen/toir.c Wed Oct 31 09:34:18 2007 +0100 @@ -640,9 +640,8 @@ llvm::ConstantInt* cofs = llvm::cast<llvm::ConstantInt>(r->val); TypeStruct* ts = (TypeStruct*)e1type->next; - std::vector<unsigned> offsets(1,0); - ts->sym->offsetToIndex(t->next, cofs->getZExtValue(), offsets); - e->mem = LLVM_DtoGEP(l->getValue(), offsets, "tmp", p->scopebb()); + std::vector<unsigned> offsets; + e->mem = LLVM_DtoIndexStruct(l->getValue(), ts->sym, t->next, cofs->getZExtValue(), offsets); e->type = elem::VAR; e->field = true; } @@ -1454,8 +1453,9 @@ e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp"); } else { - std::vector<unsigned> dst(1,0); - size_t fo = vdt->sym->offsetToIndex(tnext, offset, dst); + std::vector<unsigned> dst; + e->mem = LLVM_DtoIndexStruct(llvalue,vdt->sym, tnext, offset, dst); + /*size_t fo = vdt->sym->offsetToIndex(tnext, offset, dst); llvm::Value* ptr = llvalue; assert(ptr); e->mem = LLVM_DtoGEP(ptr,dst,"tmp"); @@ -1469,7 +1469,7 @@ } else if (fo) { e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(fo), "tmp", p->scopebb()); - } + }*/ } e->type = elem::VAL; e->field = true; @@ -1564,25 +1564,26 @@ Logger::print("e1->type=%s\n", e1type->toChars()); if (VarDeclaration* vd = var->isVarDeclaration()) { - std::vector<unsigned> vdoffsets(1,0); - llvm::Value* src = 0; + llvm::Value* arrptr; if (e1type->ty == Tpointer) { assert(e1type->next->ty == Tstruct); TypeStruct* ts = (TypeStruct*)e1type->next; - ts->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); Logger::println("Struct member offset:%d", vd->offset); - src = l->val ? l->val : l->mem; + llvm::Value* src = l->val ? l->val : l->mem; + std::vector<unsigned> vdoffsets; + arrptr = LLVM_DtoIndexStruct(src, ts->sym, vd->type, vd->offset, vdoffsets); } else if (e1->type->ty == Tclass) { TypeClass* tc = (TypeClass*)e1type; Logger::println("Class member offset: %d", vd->offset); + std::vector<unsigned> vdoffsets(1,0); tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); - src = l->getValue(); + llvm::Value* src = l->getValue(); + Logger::cout() << "src: " << *src << '\n'; + arrptr = LLVM_DtoGEP(src,vdoffsets,"tmp",p->scopebb()); } - assert(vdoffsets.size() != 1); - assert(src != 0); - Logger::cout() << "src: " << *src << '\n'; - llvm::Value* arrptr = LLVM_DtoGEP(src,vdoffsets,"tmp",p->scopebb()); + else + assert(0); e->mem = arrptr; Logger::cout() << "mem: " << *e->mem << '\n'; e->type = elem::VAR; @@ -1698,7 +1699,10 @@ } const llvm::StructType* t = llvm::StructType::get(tys); if (t != llt) { - assert(gTargetData->getTypeSize(t) == gTargetData->getTypeSize(llt)); + if (gTargetData->getTypeSize(t) != gTargetData->getTypeSize(llt)) { + Logger::cout() << "got size " << gTargetData->getTypeSize(t) << ", expected " << gTargetData->getTypeSize(llt) << '\n'; + assert(0 && "type size mismatch"); + } sptr = p->ir->CreateBitCast(sptr, llvm::PointerType::get(t), "tmp"); Logger::cout() << "sptr type is now: " << *t << '\n'; }