Mercurial > projects > ldc
changeset 1300:329e45865d84
Add 'nounwind' attribute to the relevant runtime functions, and use it when
deciding whether or not to generate an invoke instead of a call.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Mon, 04 May 2009 20:26:45 +0200 |
parents | 847b767b2d0b |
children | 1e30cc395d2e |
files | gen/irstate.h gen/runtime.cpp |
diffstat | 2 files changed, 16 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/irstate.h Mon May 04 13:32:16 2009 +0200 +++ b/gen/irstate.h Mon May 04 20:26:45 2009 +0200 @@ -178,13 +178,12 @@ llvm::BasicBlock* pad; if(pad = func()->landingPad.get()) { - // intrinsics don't support invoking + // intrinsics don't support invoking and 'nounwind' functions don't need it. LLFunction* funcval = llvm::dyn_cast<LLFunction>(Callee); - if (funcval && funcval->isIntrinsic()) + if (funcval && (funcval->isIntrinsic() || funcval->doesNotThrow())) { llvm::CallInst* call = ir->CreateCall(Callee, ArgBegin, ArgEnd, Name); - if (LLFunction* fn = llvm::dyn_cast<LLFunction>(Callee)) - call->setAttributes(fn->getAttributes()); + call->setAttributes(funcval->getAttributes()); return call; }
--- a/gen/runtime.cpp Mon May 04 13:32:16 2009 +0200 +++ b/gen/runtime.cpp Mon May 04 20:26:45 2009 +0200 @@ -198,14 +198,20 @@ NoAttrs, Attr_NoAlias = NoAttrs.addAttr(0, NoAlias), + Attr_NoUnwind + = NoAttrs.addAttr(~0U, NoUnwind), Attr_ReadOnly = NoAttrs.addAttr(~0U, ReadOnly), + Attr_ReadOnly_NoUnwind + = Attr_ReadOnly.addAttr(~0U, NoUnwind), Attr_ReadOnly_1_NoCapture = Attr_ReadOnly.addAttr(1, NoCapture), Attr_ReadOnly_1_3_NoCapture = Attr_ReadOnly_1_NoCapture.addAttr(3, NoCapture), Attr_ReadOnly_1_4_NoCapture = Attr_ReadOnly_1_NoCapture.addAttr(4, NoCapture), + Attr_ReadOnly_NoUnwind_1_NoCapture + = Attr_ReadOnly_1_NoCapture.addAttr(~0U, NoUnwind), Attr_ReadNone = NoAttrs.addAttr(~0U, ReadNone), Attr_1_NoCapture @@ -507,7 +513,7 @@ types.push_back(voidPtrTy); const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly); + ->setAttributes(Attr_ReadOnly_NoUnwind); } // cast interface @@ -519,7 +525,7 @@ types.push_back(classInfoTy); const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly); + ->setAttributes(Attr_ReadOnly_NoUnwind); } // dynamic cast @@ -531,7 +537,7 @@ types.push_back(classInfoTy); const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly); + ->setAttributes(Attr_ReadOnly_NoUnwind); } ///////////////////////////////////////////////////////////////////////////////////// @@ -569,7 +575,8 @@ types.push_back(rt_array(byteTy)); types.push_back(sizeTy); const llvm::FunctionType* fty = llvm::FunctionType::get(rt_array(byteTy), types, false); - llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) + ->setAttributes(Attr_NoUnwind); } // void[] _adDupT(TypeInfo ti, void[] a) @@ -607,7 +614,7 @@ types.push_back(rt_array(byteTy)); const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly); + ->setAttributes(Attr_ReadOnly_NoUnwind); } // void[] _adSort(void[] a, TypeInfo ti) @@ -631,7 +638,7 @@ types.push_back(aaTy); const llvm::FunctionType* fty = llvm::FunctionType::get(sizeTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly_1_NoCapture); + ->setAttributes(Attr_ReadOnly_NoUnwind_1_NoCapture); } // void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey) @@ -760,32 +767,6 @@ ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// - // Object _d_dynamic_cast(Object o, ClassInfo c) - { - std::string fname("_d_dynamic_cast"); - std::vector<const LLType*> types; - types.push_back(objectTy); - types.push_back(classInfoTy); - const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); - llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly); - } - - // Object _d_interface_cast(void* p, ClassInfo c) - { - std::string fname("_d_interface_cast"); - std::vector<const LLType*> types; - types.push_back(voidPtrTy); - types.push_back(classInfoTy); - const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); - llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) - ->setAttributes(Attr_ReadOnly); - } - - ///////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////// - // void _d_throw_exception(Object e) { std::string fname("_d_throw_exception");