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