LLVM-添加指令后设置BasicBlock的插入点会导致segfault



我正在使用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模块、上下文和生成器的析构函数时?(,它给出了segfault。我真的很想这样做,因为生成指令的函数可以将BB称为m_Builder.GetInsertBlock()。我想不出任何其他方法来实现if、嵌套块等

为什么它正确地生成代码并在最后崩溃?是有什么小问题,还是我错过了什么,不能这样做?

m_Builder.SetInsertPoint( BB );
m_Builder.CreateCall( m_Module.getFunction( "writeln" ), {ConstantInt::get( m_Context, APInt( INT_SIZE, 1 ) )}, "calltmp" );
m_Builder.CreateRet( ConstantInt::get( Type::getInt32Ty( m_Context ), 0 ) );

试试这个。

最新更新