Mercurial > projects > ldc
diff gen/toir.c @ 8:5e69b77a5c51 trunk
[svn r12] fixed accessing aggregate fields of aggregates
removed some useless branches for successive scopes ala {}{}{}
author | lindquist |
---|---|
date | Thu, 27 Sep 2007 06:03:06 +0200 |
parents | 35d93ce68cf4 |
children | dafae18f9c08 |
line wrap: on
line diff
--- a/gen/toir.c Wed Sep 26 19:17:54 2007 +0200 +++ b/gen/toir.c Thu Sep 27 06:03:06 2007 +0200 @@ -434,15 +434,15 @@ if (e1->type != e2->type) { if (e1->type->ty == Tpointer && e1->type->next->ty == Tstruct) { - assert(l->field); + //assert(l->field); llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); assert(r->type == elem::CONST); llvm::ConstantInt* cofs = llvm::cast<llvm::ConstantInt>(r->val); TypeStruct* ts = (TypeStruct*)e1->type->next; - llvm::Value* offset = llvm::ConstantInt::get(llvm::Type::Int32Ty, ts->sym->offsetToIndex(cofs->getZExtValue()), false); - - e->mem = LLVM_DtoGEP(l->getValue(), zero, offset, "tmp", p->scopebb()); + std::vector<unsigned> offsets(1,0); + ts->sym->offsetToIndex(cofs->getZExtValue(), offsets); + e->mem = LLVM_DtoGEP(l->getValue(), offsets, "tmp", p->scopebb()); e->type = elem::VAR; e->field = true; } @@ -1126,12 +1126,11 @@ if (vd->type->ty == Tstruct && !(type->ty == Tpointer && type->next == vd->type)) { TypeStruct* vdt = (TypeStruct*)vd->type; e = new elem; - llvm::Value* idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* idx1 = llvm::ConstantInt::get(llvm::Type::Int32Ty, (uint64_t)vdt->sym->offsetToIndex(offset), false); - //const llvm::Type* _typ = llvm::GetElementPtrInst::getIndexedType(LLVM_DtoType(type), idx1); + std::vector<unsigned> dst(1,0); + vdt->sym->offsetToIndex(offset, dst); llvm::Value* ptr = vd->llvmValue; assert(ptr); - e->mem = LLVM_DtoGEP(ptr,idx0,idx1,"tmp",p->scopebb()); + e->mem = LLVM_DtoGEP(ptr,dst,"tmp",p->scopebb()); e->type = elem::VAL; e->field = true; } @@ -1210,26 +1209,24 @@ Logger::print("e1->type=%s\n", e1->type->toChars()); if (VarDeclaration* vd = var->isVarDeclaration()) { - size_t vdoffset = (size_t)-1; + std::vector<unsigned> vdoffsets(1,0); llvm::Value* src = 0; if (e1->type->ty == Tpointer) { assert(e1->type->next->ty == Tstruct); TypeStruct* ts = (TypeStruct*)e1->type->next; - vdoffset = ts->sym->offsetToIndex(vd->offset); - Logger::println("Struct member offset:%d index:%d", vd->offset, vdoffset); + ts->sym->offsetToIndex(vd->offset, vdoffsets); + Logger::println("Struct member offset:%d", vd->offset); src = l->val; } else if (e1->type->ty == Tclass) { TypeClass* tc = (TypeClass*)e1->type; Logger::println("Class member offset: %d", vd->offset); - vdoffset = tc->sym->offsetToIndex(vd->offset); + tc->sym->offsetToIndex(vd->offset, vdoffsets); src = l->getValue(); } - assert(vdoffset != (size_t)-1); + assert(vdoffsets.size() != 1); assert(src != 0); - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* offset = llvm::ConstantInt::get(llvm::Type::Int32Ty, vdoffset, false); - llvm::Value* arrptr = LLVM_DtoGEP(src,zero,offset,"tmp",p->scopebb()); + llvm::Value* arrptr = LLVM_DtoGEP(src,vdoffsets,"tmp",p->scopebb()); e->mem = arrptr; Logger::cout() << "mem: " << *e->mem << '\n'; e->type = elem::VAR; @@ -2588,12 +2585,17 @@ llvm::BasicBlock* oldend = gIR->scopeend(); IRScope irs; - irs.begin = new llvm::BasicBlock("scope", gIR->topfunc(), oldend); + // remove useless branches by clearing and reusing the current basicblock + llvm::BasicBlock* bb = gIR->scopebegin(); + if (bb->empty()) { + irs.begin = bb; + } + else { + irs.begin = new llvm::BasicBlock("scope", gIR->topfunc(), oldend); + new llvm::BranchInst(irs.begin, gIR->scopebegin()); + } irs.end = new llvm::BasicBlock("endscope", gIR->topfunc(), oldend); - // pass the previous BB into this - new llvm::BranchInst(irs.begin, gIR->scopebegin()); - gIR->scope() = irs; statement->toIR(p);