Mercurial > projects > ldc
comparison gen/toir.cpp @ 378:d8234836b40f
Get rid of runTimeHack and instead add proper argument info to the frontend
declatation.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Tue, 22 Jul 2008 19:24:40 +0200 |
parents | 519adb3128b1 |
children | d632801b15f0 |
comparison
equal
deleted
inserted
replaced
377:4731f3eed1f0 | 378:d8234836b40f |
---|---|
999 | 999 |
1000 // hidden struct return arguments | 1000 // hidden struct return arguments |
1001 // TODO: use sret param attr | 1001 // TODO: use sret param attr |
1002 if (retinptr) { | 1002 if (retinptr) { |
1003 llargs[j] = new llvm::AllocaInst(argiter->get()->getContainedType(0),"rettmp",p->topallocapoint()); | 1003 llargs[j] = new llvm::AllocaInst(argiter->get()->getContainedType(0),"rettmp",p->topallocapoint()); |
1004 | |
1005 if (dfn && dfn->func && dfn->func->runTimeHack) { | |
1006 const LLType* rettype = getPtrToType(DtoType(type)); | |
1007 if (llargs[j]->getType() != llfnty->getParamType(j)) { | |
1008 Logger::println("llvmRunTimeHack==true - force casting return value param"); | |
1009 Logger::cout() << "casting: " << *llargs[j] << " to type: " << *llfnty->getParamType(j) << '\n'; | |
1010 llargs[j] = DtoBitCast(llargs[j], llfnty->getParamType(j)); | |
1011 } | |
1012 } | |
1013 | |
1014 ++j; | 1004 ++j; |
1015 ++argiter; | 1005 ++argiter; |
1016 } | 1006 } |
1017 | 1007 |
1018 // this arguments | 1008 // this arguments |
1162 llargs[j] = DtoBitCast(llargs[j], llfnty->getParamType(j)); | 1152 llargs[j] = DtoBitCast(llargs[j], llfnty->getParamType(j)); |
1163 } | 1153 } |
1164 | 1154 |
1165 if (fnarg && fnarg->llvmByVal) | 1155 if (fnarg && fnarg->llvmByVal) |
1166 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); | 1156 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); |
1167 | |
1168 // this hack is necessary :/ | |
1169 // thing is DMD doesn't create correct signatures for the DMD generated calls to the runtime. | |
1170 // only the return type is right, no arguments (parameters==NULL) ... | |
1171 if (dfn && dfn->func && dfn->func->runTimeHack) { | |
1172 llvm::Function* fn = dfn->func->ir.irFunc->func; | |
1173 assert(fn); | |
1174 if (fn->getParamAttrs().paramHasAttr(j+1, llvm::ParamAttr::ByVal)) | |
1175 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); | |
1176 | |
1177 if (llfnty->getParamType(j) != NULL) { | |
1178 if (llargs[j]->getType() != llfnty->getParamType(j)) { | |
1179 Logger::println("llvmRunTimeHack==true - force casting argument"); | |
1180 Logger::cout() << "casting: " << *llargs[j] << " to type: " << *llfnty->getParamType(j) << '\n'; | |
1181 llargs[j] = DtoBitCast(llargs[j], llfnty->getParamType(j)); | |
1182 } | |
1183 } | |
1184 } | |
1185 } | 1157 } |
1186 } | 1158 } |
1187 | 1159 |
1188 #if 0 | 1160 #if 0 |
1189 Logger::println("%d params passed", n); | 1161 Logger::println("%d params passed", n); |
1202 | 1174 |
1203 // call the function | 1175 // call the function |
1204 CallOrInvoke* call = gIR->CreateCallOrInvoke(funcval, llargs.begin(), llargs.end(), varname); | 1176 CallOrInvoke* call = gIR->CreateCallOrInvoke(funcval, llargs.begin(), llargs.end(), varname); |
1205 | 1177 |
1206 LLValue* retllval = (retinptr) ? llargs[0] : call->get(); | 1178 LLValue* retllval = (retinptr) ? llargs[0] : call->get(); |
1207 | |
1208 if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { | |
1209 const LLType* rettype = getPtrToType(DtoType(type)); | |
1210 if (retllval->getType() != rettype) { | |
1211 Logger::println("llvmRunTimeHack==true - force casting return value"); | |
1212 Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; | |
1213 retllval = DtoBitCast(retllval, rettype); | |
1214 } | |
1215 } | |
1216 | 1179 |
1217 // set calling convention | 1180 // set calling convention |
1218 if (dfn && dfn->func) { | 1181 if (dfn && dfn->func) { |
1219 int li = dfn->func->llvmInternal; | 1182 int li = dfn->func->llvmInternal; |
1220 if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { | 1183 if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { |