2010-12-31 12 views
2

言ってやるが、例えば、私のようなものが含まれているObjective-Cのコンパイルされたモジュールを持って、次LLVM C++ APIを介してObjective-Cブロックを呼び出す方法は?

typedef bool (^BoolBlock)(void); 
BoolBlock returnABlock(void) 
{ 
    return Block_copy(^bool(void){ 
     printf("Block executing.\n"); 
     return YES; 
    }); 
} 

...その後、LLVM C++ APIを使用して、私はそのモジュールをロードし、呼び出しCallInstを作成returnABlock()機能:

Function *returnABlockFunction = returnABlockModule->getFunction(std::string("returnABlock")); 
CallInst *returnABlockCall = CallInst::Create(returnABlockFunction, "returnABlockCall", entryBlock); 

どのように私はそのブロックがreturnABlockCallオブジェクトを介して返さ呼び出すことができますか?

答えて

2

ここでは簡単な答えではありませんが、恐れ入ります。ブロックは、フロントエンドによってブロックランタイムへの呼び出しに引き下げられます。 clangの場合、関連コードはclang/lib/CodeGen/CGBlocks.[h|cpp]です。

他のフロントエンドで再利用するためにこのコードを考慮する方法がある場合は、cfe-devリストに質問する価値があります。

+0

ありがとう、ohmantics。私は時々仲間のソースのその部分を掘り下げます。 – smokris

0

Cでは、ブロックに割り当てられたvarが関数ポインタであるかのように機能します。

returnABlockCall(); 

をし、それが動作するはずです:あなたが関数に「returnABlockCall」の結果を代入した後、一例として、あなたのコードを使用して、あなただけ書くことができます。

警告、これはC++ではテストされていませんが、動作しない理由はありません。

+0

今私はLLVM APIを使って呼び出すことを望んでいましたが、私はそれを直接呼び出したので、私は間違っている可能性があり、公開フォーラムでは間違っている可能性があります。 –

+0

ええ、 'returnABlockCall()'を実行すると、私の関数が返すブロックへのポインタではなく、 'CallInst'クラスのポインタに参照/ジャンプします。実際のブロックポインタはその時点では存在しません---私はLLVM APIを使ってコールグラフを作成しています。それは後になるまで実行されません。 – smokris

関連する問題