comparison gen/toir.cpp @ 120:5ce8ab11e75a trunk

[svn r124] Fixed another D vararg + return in ptr bug. Fixed some nested function calls failed to resolve the context ptr.
author lindquist
date Mon, 26 Nov 2007 07:26:21 +0100
parents 79c9ac745fbc
children 9c79b61fb638
comparison
equal deleted inserted replaced
119:79c9ac745fbc 120:5ce8ab11e75a
934 // this arguments 934 // this arguments
935 if (dfn && dfn->vthis) { 935 if (dfn && dfn->vthis) {
936 Logger::println("This Call"); 936 Logger::println("This Call");
937 if (dfn->vthis->getType() != argiter->get()) { 937 if (dfn->vthis->getType() != argiter->get()) {
938 //Logger::cout() << *fn->thisparam << '|' << *argiter->get() << '\n'; 938 //Logger::cout() << *fn->thisparam << '|' << *argiter->get() << '\n';
939 llargs[j] = new llvm::BitCastInst(dfn->vthis, argiter->get(), "tmp", p->scopebb()); 939 llargs[j] = DtoBitCast(dfn->vthis, argiter->get());
940 } 940 }
941 else { 941 else {
942 llargs[j] = dfn->vthis; 942 llargs[j] = dfn->vthis;
943 } 943 }
944 ++j; 944 ++j;
954 } 954 }
955 // nested call 955 // nested call
956 else if (dfn && dfn->func && dfn->func->isNested()) { 956 else if (dfn && dfn->func && dfn->func->isNested()) {
957 Logger::println("Nested Call"); 957 Logger::println("Nested Call");
958 llvm::Value* contextptr = p->func()->decl->llvmNested; 958 llvm::Value* contextptr = p->func()->decl->llvmNested;
959 assert(contextptr); 959 if (!contextptr)
960 llargs[j] = p->ir->CreateBitCast(contextptr, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); 960 contextptr = llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
961 llargs[j] = DtoBitCast(contextptr, llvm::PointerType::get(llvm::Type::Int8Ty));
961 ++j; 962 ++j;
962 ++argiter; 963 ++argiter;
963 } 964 }
964 965
965 // va arg function special argument passing 966 // va arg function special argument passing
968 for (int i=0; i<n; i++,j++) 969 for (int i=0; i<n; i++,j++)
969 { 970 {
970 Argument* fnarg = Argument::getNth(tf->parameters, i); 971 Argument* fnarg = Argument::getNth(tf->parameters, i);
971 Expression* exp = (Expression*)arguments->data[i]; 972 Expression* exp = (Expression*)arguments->data[i];
972 DValue* expelem = exp->toElem(p); 973 DValue* expelem = exp->toElem(p);
973 llargs[j] = p->ir->CreateBitCast(expelem->getLVal(), llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); 974 llargs[j] = DtoBitCast(expelem->getLVal(), llvm::PointerType::get(llvm::Type::Int8Ty));
974 } 975 }
975 } 976 }
976 // regular arguments 977 // regular arguments
977 else { 978 else {
978 if (tf->linkage == LINKd && tf->varargs == 1) 979 if (tf->linkage == LINKd && tf->varargs == 1)
979 { 980 {
980 Logger::println("doing d-style variadic arguments"); 981 Logger::println("doing d-style variadic arguments");
982
983 size_t nimplicit = j;
981 984
982 std::vector<const llvm::Type*> vtypes; 985 std::vector<const llvm::Type*> vtypes;
983 std::vector<llvm::Value*> vvalues; 986 std::vector<llvm::Value*> vvalues;
984 std::vector<llvm::Value*> vtypeinfos; 987 std::vector<llvm::Value*> vtypeinfos;
985 988
1018 1021
1019 llargs[j] = typeinfoarrayparam;; 1022 llargs[j] = typeinfoarrayparam;;
1020 j++; 1023 j++;
1021 llargs[j] = p->ir->CreateBitCast(mem, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); 1024 llargs[j] = p->ir->CreateBitCast(mem, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
1022 j++; 1025 j++;
1023 llargs.resize(2); 1026 llargs.resize(nimplicit+2);
1024 } 1027 }
1025 else { 1028 else {
1026 Logger::println("doing normal arguments"); 1029 Logger::println("doing normal arguments");
1027 for (int i=0; i<arguments->dim; i++,j++) { 1030 for (int i=0; i<arguments->dim; i++,j++) {
1028 Argument* fnarg = Argument::getNth(tf->parameters, i); 1031 Argument* fnarg = Argument::getNth(tf->parameters, i);