llvm: стратегии постепенного создания JIT-контента - PullRequest
0 голосов
/ 05 февраля 2012

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

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

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

1 Ответ

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

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

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


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

...