Получить объявление функции из другого llvm :: Module - PullRequest
3 голосов
/ 26 января 2012

В моем приложении у меня есть 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 в исполняемом файле не связаны.

Я пытался играть с типами связей - не повезло.

Итак, как правильно создать вызов функции из другого модуля?

1 Ответ

0 голосов
/ 02 февраля 2012

Хорошо, я исправил это, но я все еще не могу понять, в чем была проблема. Во время сборки моего модуля битового кода во время выполнения я применял к нему преобразование интернализации. Поэтому я попытался сделать это во время выполнения после компоновки, и это помогло мне.

Ах, и я использую GlobalValue::WeakAnyLinkage.

...