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) {