c++ - LLVM - 添加指令后设置 BasicBlock 的插入点会导致段错误
问题描述
我正在使用 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、嵌套块等。
为什么它会正确生成代码并最终崩溃?是有一个小问题还是我错过了一些东西而不能像这样完成?
解决方案
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 ) );
尝试这个。
推荐阅读
- laravel - Laravel 的signedURL 在使用api middlware 时生成错误的URL
- excel - Excel - 偏移到最后一个非空白单元格
- c++ - How dose base pointer address in derived class?
- c++ - DirectX 12 SDK LNK2001
- r - 排序ggplot2 geom_posterior图
- twitter-bootstrap - 为什么导航栏中的这个按钮不起作用?代码有问题吗?
- arrays - 有什么办法可以改进这个 Powershell 数组洗牌方法吗?
- javascript - 将变量发送到 JS 页面/函数
- azure-web-app-service - 如何在应用服务上禁用 HTTP 到 HTTPS 重定向?
- unity3d - Unity 游戏的主服务器 ->(主机 <-> 客户端)设置