Ошибка в обработке исключений с LLVM - PullRequest
4 голосов
/ 29 января 2012

Я пытаюсь скомпилировать код C ++ с CLANG ++ в качестве внешнего интерфейса и бэкэнда как LLVM. Версия 3.0. Кажется, есть проблема с обработкой исключений. Всякий раз, когда код выдает исключение, программа просто завершается с сообщением «Завершение после создания исключения».

Вот один из примеров кода, который я пробовал с CLANG ++.

struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : virtual A {};
struct E : private B, public C, private D {};

extern "C" void abort ();

void fne (E *e)
{
  throw e;
}

void check(E *e)
{
  int caught;

  caught = 0;
  try { fne(e); }
  catch(A *p) { caught = 1; if (p != e) abort();}
  catch(...) { abort(); }
  if (!caught) abort();

  caught = 0;
  try { fne(e); }
  catch(B *p) { abort ();}
  catch(...) { caught = 1; }
  if (!caught) abort();

  caught = 0;
  try { fne(e); }
  catch(C *p) { caught = 1; if (p != e) abort();}
  catch(...) { abort(); }
  if (!caught) abort();

  caught = 0;
  try { fne(e); }
  catch(D *p) { abort ();}
  catch(...) { caught = 1; }
  if (!caught) abort();

  return;
}

int main ()
{
  E e;

  check (&e);
  check ((E *)0);

  return 0;
}

Я новичок в LLVM, поэтому не имею об этом большого представления. Также имеет ли это что-нибудь, связанное с генерацией таблицы обработки исключений LLVM. Вышеуказанная проблема сохраняется для любого кода. Я скомпилировал приведенный выше код на машине Linux. Также я попытался поместить printf в каждое предложение catch, но ответа не было. Таким образом, кажется, что когда было сгенерировано исключение, для него не было найдено подходящего улова, и это привело к вызову функции terminate

1 Ответ

2 голосов
/ 30 января 2012

Видя другой ваш вопрос ... Если вы используете arm / linux - тогда такой результат ожидается. Поддержка EH на этом не закончена, поэтому она может быть произвольно нарушена.

...