私のアプリケーションでは、実行時のモジュール(機能定義がvoid foo(int * a)
)と実行可能なもの(LLVM C++ APIを使用して作成しています)が2つあります。別のllvm :: Moduleから関数宣言を取得する
int main(int argc, char ** argv)
を作成し、ランタイムモジュールから
foo()
関数を呼び出すことになる、それの体内に
llvm::CallInst
を置きたい私の実行可能モジュールで
。ここで
が私のコードです:その後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();
これは、[OK]をコンパイル私は検証がリンクされたモジュールに渡す実行した場合しかし、私は得る:
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
ランタイムモジュールのすべてのグローバルが内部化されていることに言及することは重要です パス。リンクした後、Verifierを実行する前に、私はDead Global Eliminationのパスをいくつかの他の最適化の中で実行しています。そして、結果のモジュールでdump()
を実行すると、main()
によって使用されているにもかかわらず、ランタイムモジュールから来ている@foo
も削除されることがわかります。 LLVMは実行時に@foo
定義を、実行可能ファイルに@foo
宣言は無関係であると考えているようです。
リンケージタイプで遊ぼうとしました。運が悪いです。
したがって、別のモジュールの関数呼び出しを作成する正しい方法は何ですか?
クイックq:これらの2つのモジュールは同じコンテキストを共有しますか? –
コンテキストとは何ですか? LLVMContext?ダンノー。 – arrowd
タイプは、同じコンテキスト内でのみ "互換性"があります。あなたのモジュールがそれらを共有することを確認してください。詳細については、http://llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.htmlを参照してください。 –