Mercurial > projects > ldc
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); |