2012-01-26 7 views
3

私のアプリケーションでは、実行時のモジュール(機能定義が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宣言は無関係であると考えているようです。

リンケージタイプで遊ぼうとしました。運が悪いです。

したがって、別のモジュールの関数呼び出しを作成する正しい方法は何ですか?

+0

クイックq:これらの2つのモジュールは同じコンテキストを共有しますか? –

+0

コンテキストとは何ですか? LLVMContext?ダンノー。 – arrowd

+0

タイプは、同じコンテキスト内でのみ "互換性"があります。あなたのモジュールがそれらを共有することを確認してください。詳細については、http://llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.htmlを参照してください。 –

答えて

0

いいえ、私はそれを修正しましたが、私はまだ問題が何かを理解できません。私のランタイムビットコードモジュールの構築中に、私は内部変換を適用しています。だから私は実行時にこれをリンクしようとしたが、それは私を助けた。

ああ、私はGlobalValue::WeakAnyLinkageを使用しています。

関連する問題