Бросок исключения LLVM

Я прочитал этот пост в блоге, эту страницу документации и этот пример, но я до сих пор не понимаю, как создать базовое исключение, используя LLVM IRBuilder для не-С++-ориентированного языка.

С моей точки зрения, я должен:

  • Создайте llvm::Value, содержащий значение, которое выбрано.
  • Вызвать "функцию", передав ее заброшенное значение. Эта функция не вернется.

В примере используется функция перемотки системы (_Unwind_RaiseException), чтобы исключить исключение С++, и я не понимаю, как использовать мою собственную функцию повышения (поскольку мне нужно всего лишь набросить указатель на объект), Что мне не хватает?

Ответы

Ответ 1

Короткий ответ заключается в том, что _Unwind_RaiseException не является специфической для С++ функцией. Он исходит из библиотеки libunwind и позволяет вызывать любой тип исключения.

Более подробную информацию можно найти на в этих сообщениях в блоге.

Ответ 2

Поскольку вы не хотите использовать существующую инфраструктуру обработки исключений С++, вам нужно будет реплицировать ее части для своего языка.

Вы можете использовать реализацию C unwinder в compiler-rt (или значительно более сложный в libstdС++) и вызывать разматывание в libstdС++ для начала.