llvm: возможно ли объединить валидацию и компиляцию в один этап? - PullRequest
0 голосов
/ 02 февраля 2012

Вообще говоря, при написании внешнего интерфейса llvm нужно взять AST и сначала проверить, что его семантика четко определена. После этого, возьмите AST и выполните этап построения IR. Мне было интересно, насколько реалистично выполнить непосредственно фазу сборки IR на AST, и, если во время процесса сборки будут обнаружены ошибки, отменить какие-либо частичные изменения объекта модуля?

Полагаю, что-то вроде этого потребуется:

  • удалить определенные типы
  • удалить определенные глобалы
  • что-нибудь еще мне не хватает?

Есть идеи по этому поводу? каковы общие рекомендации относительно того, что необходимо сделать для полного возврата изменений модуля после неудачной фазы сборки?

Теперь, это мышление с точки зрения оптимистической компиляции, и изящная ошибка, если что-то идет не так. Вполне может быть, что это совершенно невозможно или не рекомендуется в рамках текущей модели LLVM. Четкий и хорошо документированный ответ в этом отношении также вполне приемлем

Редактировать В конце я просто хочу разумный способ постепенного добавления функций, но постепенно вернуться к предыдущему состоянию модуля и / или LLVMContext, если сборка функции завершается неудачно. Какой бы ни был предпочтительный подход для этого, он будет полностью удовлетворительным.

спасибо!

1 Ответ

1 голос
/ 03 февраля 2012

Многие компиляторы (не обязательно связанные с LLVM) смешивают семантический анализ с генерацией кода, поэтому это определенно можно сделать. Тем не менее, я озадачен вашей ссылкой на «отменить любые частичные изменения в объекте модуля». Когда вы начинаете строить модуль IR и сталкиваетесь с семантической ошибкой в ​​AST, каков ваш план? Хотите плевать на незавершенный модуль? Зачем? Размышляя о том, как работает любой обычный компилятор, если в коде есть семантические ошибки (то есть ссылка на неопределенную переменную), выход не создается. Хотите что-нибудь другое?

...