如何通过LLVM C+调用Objective-C块+;应用程序编程接口?

如何通过LLVM C+调用Objective-C块+;应用程序编程接口?,llvm,objective-c-blocks,Llvm,Objective C Blocks,例如,我有一个Objective-C编译模块,它包含如下内容: typedef bool (^BoolBlock)(void); BoolBlock returnABlock(void) { return Block_copy(^bool(void){ printf("Block executing.\n"); return YES; }); } ……然后,使用LLVM C++ API,加载该模块并创建一个CaleNST来调用 RealababL

例如,我有一个Objective-C编译模块,它包含如下内容:

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

……然后,使用LLVM C++ API,加载该模块并创建一个CaleNST来调用<代码> RealababLe](< /代码>函数:

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

然后如何调用通过
returnABlockCall
对象返回的块?

恐怕这不是一个简单的答案。前端将块降低为对块运行时的调用。在clang的情况下,相关代码位于
clang/lib/CodeGen/CGBlocks.[h | cpp]


在列表中询问是否有办法将此代码分解出来,以便在其他前端重用是值得的。

在C中,我只是将分配给块的变量当作函数指针。以您的代码为例,将函数结果分配给“returnABlockCall”后,您可以编写:

returnABlockCall();
它应该会起作用


警告,这是C++中未测试的,但我看不出它为什么不能工作。< / P>谢谢,欧姆。我会在某个时候仔细研究一下这部分代码。虽然我现在看到你想用LLVM API调用它,而我只是直接调用了它,所以很可能我错了,在公共论坛上启动时也错了。是的,如果我执行
returnABlockCall()
,那将取消引用/跳转到
CallInst
类指针,不是指向my函数返回的块的指针。此时实际的块指针将不存在——我只是使用LLVMAPI来构造调用图;直到后来它才被执行。