【发布时间】:2020-08-04 21:59:20
【问题描述】:
我正在使用 LLVM 编写编译器前端。如果我创建一个BasicBlock,向它添加一些说明,最后设置插入点,一切正常。但是当我打电话给SetInsertPoint 然后添加一些这样的指令:
Function * MainFunction = Function::Create( FT, Function::ExternalLinkage, "main", m_Module );
BasicBlock * BB = BasicBlock::Create( m_Parser->m_Context, "entry", MainFunction );
m_Builder.SetInsertPoint( BB );
CallInst * call = m_Builder.CreateCall( m_Module.getFunction( "writeln" ), {ConstantInt::get( m_Context, APInt( INT_SIZE, 1 ) )}, "calltmp" );
BB->getInstList().push_back( call );
m_Builder.CreateRet( ConstantInt::get( Type::getInt32Ty( m_Context ), 0 ) );
程序正确生成 LLVM IR,但在最后(当调用 LLVM 模块、上下文和构建器的析构函数时?)它给出了段错误。我真的很想这样做,因为生成指令的函数可以将BB 称为m_Builder.GetInsertBlock()。而且我想不出任何其他方式来实现 ifs、嵌套块等。
为什么它会正确生成代码并在最后崩溃?是有什么小问题,还是我遗漏了一些东西而无法像这样完成?
【问题讨论】:
-
我不使用builder,我自己构建,所以无法回答。但我可以评论:在 valgrind 下运行你的代码,它通常会直接指出这些问题的根源。