Mercurial > projects > ldc
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 ////////////////////////////////////////////////////////////////////////////////////////// |