zhangjiantao/llvm-cxxapi

间接调用转换报错"No matching member function for call to 'CreateCall'"

Opened this issue · 2 comments

大神,请问下,间接调用函数,转换后到代码报错,这个要怎么修改,本人是菜鸟,求大佬指点, 谢谢


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
}

image

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

非常感谢, 我这边是因为工作原因,用的LLVM13,修复了一些版本适配小bug,大概能编译通过了
再次感谢作者的贡献!