Подтвердить что ты не робот

Динамическое связывание с LLVM

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

Я надеюсь использовать Linker::linkModules, но это всегда разрушает исходный модуль. Это нормально для одного модуля, в зависимости от одного, поскольку, если он изменился, это не имеет большого значения, но разве это не слишком сложно перестраивать и переписывать модули N-1, которые не менялись только из-за одного, который изменился?

Интересно, существует ли неразрушающая версия linkModules, которая может работать для выполнения JIT.

4b9b3361

Ответ 1

Попробуйте следующее:

Linker::LinkModules(destinationModule, sourceModule, Linker::PreserveSource, &error);

Если вы передадите Linker::PreserveSource вместо Linker::DestroySource, вы можете продолжать использовать sourceModule после вызова.

Ответ 2

Мы сделали что-то подобное в среде динамической компиляции внутри нашего продукта Fabric Engine (http://fabricengine.com/). LLVM в настоящее время не очень хорошо адаптирован к этой сложной среде "JIT", но нам удалось заставить ее работать, связываясь с дополнительным уровнем косвенности (т.е. С двойным указателем), а затем подклассифицируя llvm:: MemoryManager для перегрузки llvm:: MemoryManager:: getPointerToNamedFunction для разрешения символов по всему миру между модулями. Используя двойной указатель, вы можете изменить один модуль, не меняя других. Вы должны быть осторожны, но это не так уж плохо.

Ответ 3

Я не думаю, что это возможно, как вы описываете его проблему.

В вашем идеальном решении, если модули A и B были связаны, изменение B было бы немедленно наблюдаемым в A?

Если это так, я не считаю, что это возможно. (попробуйте посмотреть содержимое A после ссылки B. Символы B были скопированы в A)

Если вы просто хотите сохранить информацию в B, вы можете скопировать B сначала с помощью llvm::CloneModule, передав результат в Linker::linkModules.