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 //////////////////////////////////////////////////////////////////////////////////////////