LLVM,无法通过LLVM IRBuilder类创建调用指令

LLVM,无法通过LLVM IRBuilder类创建调用指令,llvm,Llvm,我想为PL/0语言编写一个简单的前端,lexer和解析器似乎工作得很好,但在生成call语句LLVM IR时出现了一个bug 下面是我为PL/0 call语句生成IR的代码:callident。它无法执行Builder.CreateCall(F,None,“calltmp”) 控制台显示: pl0: /root/llvm-6.0/lib/IR/Value.cpp:247: void llvm::Value::setNameImpl(const llvm::Twine&): Asser

我想为PL/0语言编写一个简单的前端,lexer和解析器似乎工作得很好,但在生成call语句LLVM IR时出现了一个bug

下面是我为PL/0 call语句生成IR的代码:
callident
。它无法执行
Builder.CreateCall(F,None,“calltmp”)

控制台显示:

pl0: /root/llvm-6.0/lib/IR/Value.cpp:247: 
void llvm::Value::setNameImpl(const llvm::Twine&): 
Assertion `!getType()->isVoidTy() && "Cannot assign a name to void values!"' failed.
Aborted (core dumped)
TheModule->getFunction()
获取正确的函数。我的实现中的所有函数都有函数类型
void..()
,没有返回值,也没有参数

我试着用
gdb
调试它;似乎由
Builder.CreateCall(…)
创建的指令已“优化”

这个怎么了

生成call语句的代码:

bool CallStatAST::codegen()
{
    auto F = TheModule->getFunction(Callee);
    if(!F)
    logErrorL("Failing to get function from module at  CallStatAST::codegen()!\n");

    //std::vector<Value*> Args;
    Builder.CreateCall(F,None,"calltmp");
    return true;
}
我真傻! 我想给一个空的返回值指定一个名称,但没有一个值,如何为它设置一个名称? 转换:

致:

一切又开始了

我真傻! 我想给一个空的返回值指定一个名称,但没有一个值,如何为它设置一个名称? 转换:

致:


一切又开始了

请。。。不要这样格式化你的帖子。请。。。不要那样格式化你的帖子。我也是!感谢您解决Builder.CreateCall(let_func,{chan_function->arg_begin()});我也是!感谢您解决Builder.CreateCall(let_func,{chan_function->arg_begin()});
1. (gdb) break 391 
Breakpoint 1 at 0x4713a5: file pl0.cpp, line 391.
2. (gdb) run < test1.pl0 
Starting program: /root/my_llvm/PL0/pl0 < test1.pl0
3. Breakpoint 1, get (this=optimized out) at /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/unique_ptr.h:234
234       { return std::get<0>(_M_t); }

4. (gdb) n
CallStatAST::codegen (this=0xa165d0) at pl0.cpp:392
392     auto F = TheModule->getFunction(Callee);
5. (gdb) p F->dump()

            define internal void @myfun() 
            {
                entry:
                %i = alloca double
                %a = load double, double* @a
                %b = load double, double* @b
                %addtmp = fadd double %a, %b
                store double %addtmp, double* %i
                ret void
            }
            $1 = void
6. (gdb) p F->getName()
$2 = {static npos = 18446744073709551615, Data = 0xa17310 "myfun", Length = 5}
(gdb) n
397     Builder.CreateCall(F,None,"calltmp");

7. (gdb) s
Twine (Str=0xa17278 "\300P\241", this=optimized out) at /usr/local/include/llvm/ADT/Twine.h:270
270         LHS.cString = Str;

8. (gdb) n
CallStatAST::codegen (this=optimized out) at pl0.cpp:397
397     Builder.CreateCall(F,None,"calltmp");
Builder.CreateCall(F,None,"calltmp");
Builder.CreateCall(F,None);