私のアプリケーションには、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);
その後、2つのモジュールをリンクします。
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を実行する前に、他のいくつかの最適化の中でDeadGlobalEliminationパスを実行しています。そして、dump()
結果のモジュールで@foo
実行すると、ランタイムモジュールからのものも、によって使用されているにもかかわらず削除されmain()
ます。@foo
LLVMは、実行時の定義と@foo
実行可能ファイルの宣言は無関係であると考えているようです。
私はリンケージタイプで遊んでみました-運がありません。
では、別のモジュールから関数への呼び出しを作成する正しい方法は何ですか?