首页 > 解决方案 > 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 模块、上下文和构建器的析构函数时?)它给出了段错误。我真的很想这样做,因为生成指令的函数可以引用BBm_Builder.GetInsertBlock(). 而且我想不出任何其他方式来实现 ifs、嵌套块等。

为什么它会正确生成代码并最终崩溃?是有一个小问题还是我错过了一些东西而不能像这样完成?

标签: c++llvm

解决方案


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 ) );

尝试这个。


推荐阅读