В моем приложении у меня есть 2 модуля LLVM - исполняемый (который содержит void foo(int * a)
определение функции) и исполняемый (который я создаю с использованием LLVM C ++ API).
В моем исполняемом модуле я создаю int main(int argc, char ** argv)
и хочу поместить llvm::CallInst
в его тело, что вызовет функцию foo()
из модуля времени выполнения.
Вот мой код:
Function * fooF = Function::Create(runtimeModule->getFunction("foo")->getFunctionType(),
GlobalValue::WeakAnyLinkage, "foo", execModule);
После этого я связываю два модуля вместе:
Linker linker("blabla", execModule, false);
linker.LinkInFile("/path/to/runtime.bc", false);
execModule = linker.releaseModule();
Это компилируется нормально, однако, когда я запускаю проверку Verifier на связанном модуле, я получаю:
Global is external, but doesn't have external or dllimport or weak linkage!
void (%i32*)* @foo
invalid linkage type for function declaration
void (%i32*)* @foo
Стоит отметить, что все глобальные переменные в модуле времени выполнения интернализуются с помощью прохода Internalize. После связывания, но перед запуском Verifier, я запускаю Dead Global Elmination среди некоторых других оптимизаций. И когда я выполняю dump()
на получающемся модуле, я вижу, что @foo
, который поступает из модуля времени выполнения, тоже удаляется, несмотря на то, что он используется main()
. Кажется, LLVM считает, что определение @foo
во время выполнения и объявление @foo
в исполняемом файле не связаны.
Я пытался играть с типами связей - не повезло.
Итак, как правильно создать вызов функции из другого модуля?