Вообще говоря, при написании внешнего интерфейса llvm нужно взять AST и сначала проверить, что его семантика четко определена. После этого, возьмите AST и выполните этап построения IR.
Мне было интересно, насколько реалистично выполнить непосредственно фазу сборки IR на AST, и, если во время процесса сборки будут обнаружены ошибки, отменить какие-либо частичные изменения объекта модуля?
Полагаю, что-то вроде этого потребуется:
- удалить определенные типы
- удалить определенные глобалы
- что-нибудь еще мне не хватает?
Есть идеи по этому поводу? каковы общие рекомендации относительно того, что необходимо сделать для полного возврата изменений модуля после неудачной фазы сборки?
Теперь, это мышление с точки зрения оптимистической компиляции, и изящная ошибка, если что-то идет не так. Вполне может быть, что это совершенно невозможно или не рекомендуется в рамках текущей модели LLVM. Четкий и хорошо документированный ответ в этом отношении также вполне приемлем
Редактировать В конце я просто хочу разумный способ постепенного добавления функций, но постепенно вернуться к предыдущему состоянию модуля и / или LLVMContext
, если сборка функции завершается неудачно. Какой бы ни был предпочтительный подход для этого, он будет полностью удовлетворительным.
спасибо!