Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
49:e5c4bece7fa1 | 50:6fcc08a4d406 |
---|---|
873 { | 873 { |
874 std::vector<llvm::Value*> v(2); | 874 std::vector<llvm::Value*> v(2); |
875 v[0] = i0; | 875 v[0] = i0; |
876 v[1] = i1; | 876 v[1] = i1; |
877 Logger::cout() << "DtoGEP: " << *ptr << '\n'; | 877 Logger::cout() << "DtoGEP: " << *ptr << '\n'; |
878 return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb); | 878 return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); |
879 } | 879 } |
880 | 880 |
881 ////////////////////////////////////////////////////////////////////////////////////////// | 881 ////////////////////////////////////////////////////////////////////////////////////////// |
882 | 882 |
883 llvm::Value* LLVM_DtoGEP(llvm::Value* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb) | 883 llvm::Value* LLVM_DtoGEP(llvm::Value* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb) |
890 { | 890 { |
891 ostr << ' ' << i; | 891 ostr << ' ' << i; |
892 dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false); | 892 dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false); |
893 } | 893 } |
894 ostr << '\n'; | 894 ostr << '\n'; |
895 return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb); | 895 return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb()); |
896 } | 896 } |
897 | 897 |
898 ////////////////////////////////////////////////////////////////////////////////////////// | 898 ////////////////////////////////////////////////////////////////////////////////////////// |
899 | 899 |
900 llvm::Value* LLVM_DtoGEPi(llvm::Value* ptr, unsigned i, const std::string& var, llvm::BasicBlock* bb) | 900 llvm::Value* LLVM_DtoGEPi(llvm::Value* ptr, unsigned i, const std::string& var, llvm::BasicBlock* bb) |
901 { | 901 { |
902 return new llvm::GetElementPtrInst(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb); | 902 return new llvm::GetElementPtrInst(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb?bb:gIR->scopebb()); |
903 } | 903 } |
904 | 904 |
905 ////////////////////////////////////////////////////////////////////////////////////////// | 905 ////////////////////////////////////////////////////////////////////////////////////////// |
906 | 906 |
907 llvm::Value* LLVM_DtoGEPi(llvm::Value* ptr, unsigned i0, unsigned i1, const std::string& var, llvm::BasicBlock* bb) | 907 llvm::Value* LLVM_DtoGEPi(llvm::Value* ptr, unsigned i0, unsigned i1, const std::string& var, llvm::BasicBlock* bb) |
908 { | 908 { |
909 std::vector<llvm::Value*> v(2); | 909 std::vector<llvm::Value*> v(2); |
910 v[0] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i0, false); | 910 v[0] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i0, false); |
911 v[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i1, false); | 911 v[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i1, false); |
912 return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb); | 912 return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); |
913 } | 913 } |
914 | 914 |
915 ////////////////////////////////////////////////////////////////////////////////////////// | 915 ////////////////////////////////////////////////////////////////////////////////////////// |
916 | 916 |
917 llvm::Function* LLVM_DtoDeclareFunction(FuncDeclaration* fdecl) | 917 llvm::Function* LLVM_DtoDeclareFunction(FuncDeclaration* fdecl) |
1164 assert(0 && "parameter type that was actually passed is invalid"); | 1164 assert(0 && "parameter type that was actually passed is invalid"); |
1165 } | 1165 } |
1166 return retval; | 1166 return retval; |
1167 } | 1167 } |
1168 | 1168 |
1169 | 1169 ////////////////////////////////////////////////////////////////////////////////////////// |
1170 | |
1171 llvm::Value* LLVM_DtoNestedVariable(VarDeclaration* vd) | |
1172 { | |
1173 FuncDeclaration* fd = vd->toParent()->isFuncDeclaration(); | |
1174 assert(fd != NULL); | |
1175 | |
1176 IRFunction* fcur = &gIR->func(); | |
1177 FuncDeclaration* f = fcur->decl; | |
1178 | |
1179 // on this stack | |
1180 if (fd == f) { | |
1181 return LLVM_DtoGEPi(vd->llvmValue,0,unsigned(vd->llvmNestedIndex),"tmp"); | |
1182 } | |
1183 | |
1184 // on a caller stack | |
1185 llvm::Value* ptr = f->llvmThisVar; | |
1186 assert(ptr); | |
1187 | |
1188 f = f->toParent()->isFuncDeclaration(); | |
1189 assert(f); | |
1190 assert(f->llvmNested); | |
1191 const llvm::Type* nesttype = f->llvmNested->getType(); | |
1192 assert(nesttype); | |
1193 | |
1194 ptr = gIR->ir->CreateBitCast(ptr, nesttype, "tmp"); | |
1195 | |
1196 Logger::cout() << "nested var reference:" << '\n' << *ptr << *nesttype << '\n'; | |
1197 | |
1198 while (f) { | |
1199 if (fd == f) { | |
1200 return LLVM_DtoGEPi(ptr,0,vd->llvmNestedIndex,"tmp"); | |
1201 } | |
1202 else { | |
1203 ptr = LLVM_DtoGEPi(ptr,0,0,"tmp"); | |
1204 ptr = gIR->ir->CreateLoad(ptr,"tmp"); | |
1205 } | |
1206 f = f->toParent()->isFuncDeclaration(); | |
1207 } | |
1208 | |
1209 assert(0 && "nested var not found"); | |
1210 return NULL; | |
1211 } |