LLVM - установка точки вставки BasicBlock после добавления инструкций вызывает segfault - PullRequest
1 голос
/ 05 августа 2020

Я пишу интерфейс компилятора с использованием 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(). И я не могу придумать другого способа реализовать ifs, вложенные блоки и т. Д. c.

Почему он правильно генерирует код и дает сбой в конце? Есть небольшая проблема или я что-то упустил, и это просто невозможно сделать так?

1 Ответ

1 голос
/ 05 августа 2020
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 ) );

Попробуйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...