comparison gen/toir.cpp @ 314:8d98e42ece93 trunk

[svn r335] The basics of exception handling are in place. Still need to make sure calls are turned into invokes everywhere. (NewExpression for instance) Still some rough edges and corner cases to figure out. Needs testing!
author ChristianK
date Wed, 02 Jul 2008 22:20:18 +0200
parents a498b736a0bd
children a9697749e898
comparison
equal deleted inserted replaced
313:a498b736a0bd 314:8d98e42ece93
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 llvm::CallInst* call = llvm::CallInst::Create(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); 1249 LLValue* retllval;
1250 LLValue* retllval = (retinptr) ? llargs[0] : call; 1250 if(p->landingPads.empty())
1251 1251 {
1252 if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { 1252 llvm::CallInst* call = llvm::CallInst::Create(funcval, llargs.begin(), llargs.end(), varname, p->scopebb());
1253 const LLType* rettype = getPtrToType(DtoType(type)); 1253
1254 if (retllval->getType() != rettype) { 1254 retllval = (retinptr) ? llargs[0] : call;
1255 Logger::println("llvmRunTimeHack==true - force casting return value"); 1255
1256 Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; 1256 if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) {
1257 retllval = DtoBitCast(retllval, rettype); 1257 const LLType* rettype = getPtrToType(DtoType(type));
1258 } 1258 if (retllval->getType() != rettype) {
1259 } 1259 Logger::println("llvmRunTimeHack==true - force casting return value");
1260 1260 Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n';
1261 // set calling convention 1261 retllval = DtoBitCast(retllval, rettype);
1262 if (dfn && dfn->func) { 1262 }
1263 int li = dfn->func->llvmInternal; 1263 }
1264 if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { 1264
1265 // set calling convention
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) {
1265 call->setCallingConv(DtoCallingConv(dlink)); 1273 call->setCallingConv(DtoCallingConv(dlink));
1266 } 1274 }*/
1267 } 1275 else if (dfn && dfn->cc != (unsigned)-1) {
1268 /*else if (delegateCall) { 1276 call->setCallingConv(dfn->cc);
1269 call->setCallingConv(DtoCallingConv(dlink)); 1277 }
1270 }*/ 1278 else {
1271 else if (dfn && dfn->cc != (unsigned)-1) { 1279 call->setCallingConv(DtoCallingConv(dlink));
1272 call->setCallingConv(dfn->cc); 1280 }
1273 } 1281
1274 else { 1282 // param attrs
1275 call->setCallingConv(DtoCallingConv(dlink)); 1283 call->setParamAttrs(palist);
1276 } 1284 }
1277 1285 else
1278 // param attrs 1286 {
1279 call->setParamAttrs(palist); 1287 llvm::BasicBlock* postinvoke = llvm::BasicBlock::Create("postinvoke", p->topfunc(), p->scopeend());
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 }
1280 1324
1281 return new DImValue(type, retllval, isInPlace); 1325 return new DImValue(type, retllval, isInPlace);
1282 } 1326 }
1283 1327
1284 ////////////////////////////////////////////////////////////////////////////////////////// 1328 //////////////////////////////////////////////////////////////////////////////////////////