Атрибут llvm :: NoUnwind - PullRequest
       2

Атрибут llvm :: NoUnwind

4 голосов
/ 27 сентября 2011

Я бегу внутри 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 в этом контексте?

1 Ответ

2 голосов
/ 28 сентября 2011

Это означает, что вам не нужно беспокоиться о генерации кода обработки исключений или оптимизации, как если бы исключение могло распространяться через этот раздел кода, поскольку вы уже сказали, что это не так. Если кто-то проходит через него, он должен правильно распространяться на следующий кадр стека в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...