Бросок исключения LLVM
Я прочитал этот пост в блоге, эту страницу документации и этот пример, но я до сих пор не понимаю, как создать базовое исключение, используя LLVM IRBuilder для не-С++-ориентированного языка.
С моей точки зрения, я должен:
- Создайте
llvm::Value
, содержащий значение, которое выбрано.
- Вызвать "функцию", передав ее заброшенное значение. Эта функция не вернется.
В примере используется функция перемотки системы (_Unwind_RaiseException
), чтобы исключить исключение С++, и я не понимаю, как использовать мою собственную функцию повышения (поскольку мне нужно всего лишь набросить указатель на объект), Что мне не хватает?
Ответы
Ответ 1
Короткий ответ заключается в том, что _Unwind_RaiseException
не является специфической для С++ функцией. Он исходит из библиотеки libunwind и позволяет вызывать любой тип исключения.
Более подробную информацию можно найти на в этих сообщениях в блоге.
Ответ 2
Поскольку вы не хотите использовать существующую инфраструктуру обработки исключений С++, вам нужно будет реплицировать ее части для своего языка.
Вы можете использовать реализацию C unwinder в compiler-rt (или значительно более сложный в libstdС++) и вызывать разматывание в libstdС++ для начала.