Я пишу интерфейс компилятора с использованием 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.
Почему он правильно генерирует код и дает сбой в конце? Есть небольшая проблема или я что-то упустил, и это просто невозможно сделать так?