3

私のアプリケーションには、2つのLLVMモジュールがあります。ランタイムモジュール(void foo(int * a)関数定義を含む)と実行可能モジュール(LLVM C ++ APIを使用して作成しています)です。

私の実行可能モジュールで、実行可能モジュールから関数を呼び出す実行可能モジュールを作成し、その本体にint main(int argc, char ** argv)入れたいと思います。llvm::CallInstfoo()

これが私のコードです:

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()ます。@fooLLVMは、実行時の定義と@foo実行可能ファイルの宣言は無関係であると考えているようです。

私はリンケージタイプで遊んでみました-運がありません。

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

4

1 に答える 1

0

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

ああ、私は使ってきましたGlobalValue::WeakAnyLinkage

于 2012-02-02T09:31:26.307 に答える