Mercurial > projects > ldc
diff gen/tollvm.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/tollvm.c Wed Sep 26 19:17:54 2007 +0200 +++ b/gen/tollvm.c Thu Sep 27 06:03:06 2007 +0200 @@ -460,7 +460,11 @@ VarDeclaration* vd = (VarDeclaration*)si->vars.data[i]; assert(vd); Logger::println("vars[%d] = %s", i, vd->toChars()); - unsigned idx = si->ad->offsetToIndex(vd->offset); + + std::vector<unsigned> idxs; + si->ad->offsetToIndex(vd->offset, idxs); + assert(idxs.size() == 1); + unsigned idx = idxs[0]; llvm::Constant* v = 0; @@ -819,3 +823,17 @@ v[1] = i1; return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb); } + +llvm::Value* LLVM_DtoGEP(llvm::Value* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb) +{ + size_t n = src.size(); + std::vector<llvm::Value*> dst(n); + Logger::cout() << "indices:"; + for (size_t i=0; i<n; ++i) + { + Logger::cout() << ' ' << i; + dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false); + } + Logger::cout() << '\n'; + return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb); +}