llvm: стратегии постепенного создания JIT-контента

Я хочу, чтобы мой языковой бэкэнд создавал функции и типы постепенно, но не загрязнял основной модуль и контекст, когда функции и типы не могут быть успешно построены (из-за проблем с пользовательским вводом).

Я задаю более ранний вопрос по этому поводу. Одна стратегия, которую я вижу, это построить все во временном модуле и LLVMContext, переход на основной контекст только после успеха, но я не уверен, возможно ли это с текущим API. Например, я не знал бы, переносить ли этот контент между различными контекстами, поскольку они должны представлять собой отдельные островки функциональности LLVM, но, возможно, всегда есть альтернатива сохранить все в.bc и загрузить куда-нибудь еще?

Какие еще стратегии вы бы предложили для достижения этой цели?

1 ответ

Решение

Предполагая, что у вас есть два модуля - источник и место назначения, можно скопировать функцию из источника в место назначения. Код в LLVM, который вы можете использовать в качестве примера, это тело компоновщика LLVM, в lib/linker/LinkModules.cpp,

В частности, посмотрите на linkFunctionProto а также linkFunctionBody методы в этом файле. linkFunctionBody копирует определение функции и использует llvm::CloneFunctionInto утилита для поднятия тяжестей.


Что касается LLVMContext, если вам не требуется запускать несколько экземпляров LLVM одновременно в разных потоках, не слишком переживайте по этому поводу и просто используйте getGlobalContext() везде контекст необходим. Прочитайте эту страницу документа для получения дополнительной информации.

Другие вопросы по тегам