Mercurial > projects > ldc
comparison gen/toir.cpp @ 315:a9697749e898 trunk
[svn r336] Made sure calls within a landing pad area are invokes.
Nested trys still need some consideration.
author | ChristianK |
---|---|
date | Thu, 03 Jul 2008 22:05:45 +0200 |
parents | 8d98e42ece93 |
children | 571959608194 |
comparison
equal
deleted
inserted
replaced
314:8d98e42ece93 | 315:a9697749e898 |
---|---|
1244 varname = "tmp"; | 1244 varname = "tmp"; |
1245 | 1245 |
1246 //Logger::cout() << "Calling: " << *funcval << '\n'; | 1246 //Logger::cout() << "Calling: " << *funcval << '\n'; |
1247 | 1247 |
1248 // call the function | 1248 // call the function |
1249 LLValue* retllval; | 1249 CallOrInvoke* call = gIR->CreateCallOrInvoke(funcval, llargs.begin(), llargs.end(), varname); |
1250 if(p->landingPads.empty()) | 1250 |
1251 { | 1251 LLValue* retllval = (retinptr) ? llargs[0] : call->get(); |
1252 llvm::CallInst* call = llvm::CallInst::Create(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); | 1252 |
1253 | 1253 if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { |
1254 retllval = (retinptr) ? llargs[0] : call; | 1254 const LLType* rettype = getPtrToType(DtoType(type)); |
1255 | 1255 if (retllval->getType() != rettype) { |
1256 if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { | 1256 Logger::println("llvmRunTimeHack==true - force casting return value"); |
1257 const LLType* rettype = getPtrToType(DtoType(type)); | 1257 Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; |
1258 if (retllval->getType() != rettype) { | 1258 retllval = DtoBitCast(retllval, rettype); |
1259 Logger::println("llvmRunTimeHack==true - force casting return value"); | 1259 } |
1260 Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; | 1260 } |
1261 retllval = DtoBitCast(retllval, rettype); | 1261 |
1262 } | 1262 // set calling convention |
1263 } | 1263 if (dfn && dfn->func) { |
1264 | 1264 int li = dfn->func->llvmInternal; |
1265 // set calling convention | 1265 if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { |
1266 if (dfn && dfn->func) { | |
1267 int li = dfn->func->llvmInternal; | |
1268 if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { | |
1269 call->setCallingConv(DtoCallingConv(dlink)); | |
1270 } | |
1271 } | |
1272 /*else if (delegateCall) { | |
1273 call->setCallingConv(DtoCallingConv(dlink)); | 1266 call->setCallingConv(DtoCallingConv(dlink)); |
1274 }*/ | 1267 } |
1275 else if (dfn && dfn->cc != (unsigned)-1) { | 1268 } |
1276 call->setCallingConv(dfn->cc); | 1269 /*else if (delegateCall) { |
1277 } | 1270 call->setCallingConv(DtoCallingConv(dlink)); |
1278 else { | 1271 }*/ |
1279 call->setCallingConv(DtoCallingConv(dlink)); | 1272 else if (dfn && dfn->cc != (unsigned)-1) { |
1280 } | 1273 call->setCallingConv(dfn->cc); |
1281 | 1274 } |
1282 // param attrs | 1275 else { |
1283 call->setParamAttrs(palist); | 1276 call->setCallingConv(DtoCallingConv(dlink)); |
1284 } | 1277 } |
1285 else | 1278 |
1286 { | 1279 // param attrs |
1287 llvm::BasicBlock* postinvoke = llvm::BasicBlock::Create("postinvoke", p->topfunc(), p->scopeend()); | 1280 call->setParamAttrs(palist); |
1288 llvm::InvokeInst* call = llvm::InvokeInst::Create(funcval, postinvoke, *p->landingPads.rbegin(), llargs.begin(), llargs.end(), varname, p->scopebb()); | |
1289 p->scope() = IRScope(postinvoke, p->scopeend()); | |
1290 | |
1291 | |
1292 //FIXME: Code duplication! | |
1293 retllval = (retinptr) ? llargs[0] : call; | |
1294 | |
1295 if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { | |
1296 const LLType* rettype = getPtrToType(DtoType(type)); | |
1297 if (retllval->getType() != rettype) { | |
1298 Logger::println("llvmRunTimeHack==true - force casting return value"); | |
1299 Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; | |
1300 retllval = DtoBitCast(retllval, rettype); | |
1301 } | |
1302 } | |
1303 | |
1304 // set calling convention | |
1305 if (dfn && dfn->func) { | |
1306 int li = dfn->func->llvmInternal; | |
1307 if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { | |
1308 call->setCallingConv(DtoCallingConv(dlink)); | |
1309 } | |
1310 } | |
1311 /*else if (delegateCall) { | |
1312 call->setCallingConv(DtoCallingConv(dlink)); | |
1313 }*/ | |
1314 else if (dfn && dfn->cc != (unsigned)-1) { | |
1315 call->setCallingConv(dfn->cc); | |
1316 } | |
1317 else { | |
1318 call->setCallingConv(DtoCallingConv(dlink)); | |
1319 } | |
1320 | |
1321 // param attrs | |
1322 call->setParamAttrs(palist); | |
1323 } | |
1324 | 1281 |
1325 return new DImValue(type, retllval, isInPlace); | 1282 return new DImValue(type, retllval, isInPlace); |
1326 } | 1283 } |
1327 | 1284 |
1328 ////////////////////////////////////////////////////////////////////////////////////////// | 1285 ////////////////////////////////////////////////////////////////////////////////////////// |