间接调用转换报错"No matching member function for call to 'CreateCall'"
Opened this issue · 2 comments
keroushe commented
大神,请问下,间接调用函数,转换后到代码报错,这个要怎么修改,本人是菜鸟,求大佬指点, 谢谢
const char *str = "test_global";
static void backupProtection(void)
{
printf("abc");
}
int test() {
void (*tmpFuc)(void) = backupProtection;
tmpFuc();
return 0;
}
IR代码如下
define i32 @test() #0 {
%1 = alloca void ()*, align 8
store void ()* @backupProtection, void ()** %1, align 8
%2 = load void ()*, void ()** %1, align 8
call void %2() // 这一行转换调用CreateCall出错
ret i32 0
}
zhangjiantao commented
IR代码如下
define i32 @test() #0 { %1 = alloca void ()*, align 8 store void ()* @backupProtection, void ()** %1, align 8 %2 = load void ()*, void ()** %1, align 8 call void %2() // 这一行转换调用CreateCall出错 ret i32 0 }
这个问题修掉了
新的生成为
/* %2 = load void ()*, void ()** %1, align 8 */
auto PtrFunc = IRB.CreateAlignedLoad(PtrPtrFunc, 8);
/* call void %2() */
IRB.CreateCall(FuncTy1, PtrFunc, {});
你应该在使用LLVM11或之后的版本在编译生成的cpp代码
自LLVM11起,IRBuilder模板类删掉了一个接口,所以你编不过
不过这个问题即便解决了
自LLVM8起,删掉了<llvm/IR/TypeBuilder.h>
这个头文件,需要你从旧版本找一个,总体上你也很难编译通过
建议所有工作基于LLVM 7
keroushe commented
非常感谢, 我这边是因为工作原因,用的LLVM13,修复了一些版本适配小bug,大概能编译通过了
再次感谢作者的贡献!