gpt4 book ai didi

llvm - llvm 中没有生成基本 block 终止符

转载 作者:行者123 更新时间:2023-12-01 16:55:38 26 4
gpt4 key购买 nike

我对 llvm 还很陌生,只在这里完成了在线教程:http://llvm.org/docs/tutorial/LangImpl1.html现在我想做自己的小语言,但遇到了一些问题。我想解析这个:

(def i 1)

它应该做两件事:

  1. 定义一个返回 1 的新函数
  2. 返回一个值,以便可以将其用作表达式

该函数已正确创建,但我在将其用作表达式时遇到问题。 AST 看起来像这样:

FunctionAST // the whole statement
- Prototype // is an nameless statement
- Body // contains the definition expression
- DefExprAST
- Body // contains the Function definition
- FunctionAST
- Prototype // named i
- Body // the value 1

该函数的代码创建代码如下所示:

Function *FunctionAST::Codegen() {
NamedValues.clear();

Function *TheFunction = Proto->Codegen();
if ( TheFunction == 0 ) return 0;

BasicBlock *BB = BasicBlock::Create( getGlobalContext(), "entry", TheFunction );
Builder.SetInsertPoint( BB );

if ( Value *RetVal = Body->Codegen() ) {
Builder.CreateRet( RetVal );

verifyFunction( *TheFunction );

return TheFunction;
}
return 0;
}

DefExprAST 像这样:

Value *DefExprAST::Codegen() {
if ( Body->Codegen() == 0 ) return 0;

return ConstantFP::get( getGlobalContext(), APFloat( 0.0 ) );
}

verifyFunction 给出以下错误:

Basic Block in function '' does not have terminator!
label %entry
LLVM ERROR: Broken module, no Basic Block terminator!

事实上,生成的函数没有 ret 条目。它是空的:

define double @0() {
entry:
}

但是 RetVal 已正确填充 double 值,并且 Builder.CreateRet( RetVal ) 返回 ret 语句,但它不会插入到条目中。

最佳答案

有时提出一个问题并稍事休息有助于很好地解决问题。我更改了 DefExprAST::Codegen 以记住 Parent block 并将其设置为返回值的插入点。

Value *DefExprAST::Codegen() {
BasicBlock *Parent = Builder.GetInsertBlock();
if ( Body->Codegen() == 0 ) return 0;

Builder.SetInsertPoint( Parent );

return ConstantFP::get( getGlobalContext(), APFloat( 0.0 ) );
}

关于llvm - llvm 中没有生成基本 block 终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15875759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com