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 }