From 5723fa7492ed241f8f376e4619f1b8bccfe5ca7f Mon Sep 17 00:00:00 2001 From: Frits van Bommel Date: Mon, 4 May 2009 20:26:45 +0200 Subject: [PATCH] Add 'nounwind' attribute to the relevant runtime functions, and use it when deciding whether or not to generate an invoke instead of a call. --- gen/irstate.h | 7 +++---- gen/runtime.cpp | 45 +++++++++++++-------------------------------- 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/gen/irstate.h b/gen/irstate.h index 79c9da7d..d9e532ad 100644 --- a/gen/irstate.h +++ b/gen/irstate.h @@ -178,13 +178,12 @@ llvm::CallSite IRState::CreateCallOrInvoke(LLValue* Callee, InputIterator ArgBeg 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(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(Callee)) - call->setAttributes(fn->getAttributes()); + call->setAttributes(funcval->getAttributes()); return call; } diff --git a/gen/runtime.cpp b/gen/runtime.cpp index 2647abdc..512b3238 100644 --- a/gen/runtime.cpp +++ b/gen/runtime.cpp @@ -198,14 +198,20 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() 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 @@ static void LLVM_D_BuildRuntimeModule() ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// - // Object _d_dynamic_cast(Object o, ClassInfo c) - { - std::string fname("_d_dynamic_cast"); - std::vector 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 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");