llvm: стратегии постепенного создания JIT-контента
Я хочу, чтобы мой языковой бэкэнд создавал функции и типы постепенно, но не загрязнял основной модуль и контекст, когда функции и типы не могут быть успешно построены (из-за проблем с пользовательским вводом).
Я задаю более ранний вопрос по этому поводу. Одна стратегия, которую я вижу, это построить все во временном модуле и LLVMContext
, переход на основной контекст только после успеха, но я не уверен, возможно ли это с текущим API. Например, я не знал бы, переносить ли этот контент между различными контекстами, поскольку они должны представлять собой отдельные островки функциональности LLVM, но, возможно, всегда есть альтернатива сохранить все в.bc и загрузить куда-нибудь еще?
Какие еще стратегии вы бы предложили для достижения этой цели?
1 ответ
Предполагая, что у вас есть два модуля - источник и место назначения, можно скопировать функцию из источника в место назначения. Код в LLVM, который вы можете использовать в качестве примера, это тело компоновщика LLVM, в lib/linker/LinkModules.cpp
,
В частности, посмотрите на linkFunctionProto
а также linkFunctionBody
методы в этом файле. linkFunctionBody
копирует определение функции и использует llvm::CloneFunctionInto
утилита для поднятия тяжестей.
Что касается LLVMContext
, если вам не требуется запускать несколько экземпляров LLVM одновременно в разных потоках, не слишком переживайте по этому поводу и просто используйте getGlobalContext()
везде контекст необходим. Прочитайте эту страницу документа для получения дополнительной информации.