gpt4 book ai didi

c++ - LLVM - 添加指令后设置 BasicBlock 的插入点会导致段错误

转载 作者:行者123 更新时间:2023-12-02 10:11:47 25 4
gpt4 key购买 nike

我正在使用 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 模块、上下文和构建器的析构函数时?)它给出了段错误。我真的很想这样做,因为生成指令的函数可以引用 BBm_Builder.GetInsertBlock() .而且我想不出任何其他方式来实现 ifs、嵌套 block 等。
为什么它会正确生成代码并在最后崩溃?是有一个小问题还是我错过了一些东西而不能像这样完成?

最佳答案

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 ) );
试试这个。

关于c++ - LLVM - 添加指令后设置 BasicBlock 的插入点会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63255668/

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