Я бегу внутри http://llvm.org/demo следующий фрагмент:
class X { public: ~X() __attribute((nothrow)); };
void a(X* p);
void nothr() throw();
void b() { try { X x; a(&x); } catch (X* foo) { nothr(); } }
Я вижу, что некоторые из вызовов (например, func_llvm_eh_typeid_for) имеют набор Attribute :: NoUnwind:
CallInst* int32_71 = CallInst::Create(func_llvm_eh_typeid_for, const_ptr_43, "", label_49);
int32_71->setCallingConv(CallingConv::C);
int32_71->setTailCall(false);
AttrListPtr int32_71_PAL;
{
SmallVector<AttributeWithIndex, 4> Attrs;
AttributeWithIndex PAWI;
PAWI.Index = 4294967295U; PAWI.Attrs = 0 | Attribute::NoUnwind;
Attrs.push_back(PAWI);
int32_71_PAL = AttrListPtr::get(Attrs.begin(), Attrs.end());
}
int32_71->setAttributes(int32_71_PAL);
Поскольку эти вызовы создаются с помощью CallInst, а не InvokeInst, я предполагаю, что сам вызов не может генерировать вызов, поэтому мне интересно, какова цель атрибута Unwind в этом контексте?