Mercurial > projects > ldc
diff gen/tollvm.c @ 50:6fcc08a4d406 trunk
[svn r54] Added support for nested delegates referencing parent's stack variables.
Replaced tester.sh with a version written in D.
A few bugfixes.
author | lindquist |
---|---|
date | Mon, 22 Oct 2007 15:40:56 +0200 |
parents | e5c4bece7fa1 |
children | 61bc1b4ad3c4 |
line wrap: on
line diff
--- a/gen/tollvm.c Fri Oct 19 17:43:46 2007 +0200 +++ b/gen/tollvm.c Mon Oct 22 15:40:56 2007 +0200 @@ -875,7 +875,7 @@ v[0] = i0; v[1] = i1; Logger::cout() << "DtoGEP: " << *ptr << '\n'; - return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb); + return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -892,14 +892,14 @@ dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false); } ostr << '\n'; - return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb); + return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// llvm::Value* LLVM_DtoGEPi(llvm::Value* ptr, unsigned i, const std::string& var, llvm::BasicBlock* bb) { - return new llvm::GetElementPtrInst(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb); + return new llvm::GetElementPtrInst(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -909,7 +909,7 @@ std::vector<llvm::Value*> v(2); v[0] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i0, false); v[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i1, false); - return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb); + return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1166,4 +1166,46 @@ return retval; } +////////////////////////////////////////////////////////////////////////////////////////// +llvm::Value* LLVM_DtoNestedVariable(VarDeclaration* vd) +{ + FuncDeclaration* fd = vd->toParent()->isFuncDeclaration(); + assert(fd != NULL); + + IRFunction* fcur = &gIR->func(); + FuncDeclaration* f = fcur->decl; + + // on this stack + if (fd == f) { + return LLVM_DtoGEPi(vd->llvmValue,0,unsigned(vd->llvmNestedIndex),"tmp"); + } + + // on a caller stack + llvm::Value* ptr = f->llvmThisVar; + assert(ptr); + + f = f->toParent()->isFuncDeclaration(); + assert(f); + assert(f->llvmNested); + const llvm::Type* nesttype = f->llvmNested->getType(); + assert(nesttype); + + ptr = gIR->ir->CreateBitCast(ptr, nesttype, "tmp"); + + Logger::cout() << "nested var reference:" << '\n' << *ptr << *nesttype << '\n'; + + while (f) { + if (fd == f) { + return LLVM_DtoGEPi(ptr,0,vd->llvmNestedIndex,"tmp"); + } + else { + ptr = LLVM_DtoGEPi(ptr,0,0,"tmp"); + ptr = gIR->ir->CreateLoad(ptr,"tmp"); + } + f = f->toParent()->isFuncDeclaration(); + } + + assert(0 && "nested var not found"); + return NULL; +}