Вы должны попытаться остановить создание контекста и экземпляра компоновщика каждый раз, когда вы вызываете createEmptyBlock
. Для каждого потока требуется только один контекст и, в общем, один экземпляр компоновщика, поэтому llvm поможет вам отслеживать, куда вставить ir. Это действительно помогает при вызовах методов, таких как builder.GetInsertBlock()
Также вам не нужно прикреплять блок к функции каждый раз, когда вы ее создаете. Ваша функция теперь может выглядеть следующим образом
BasicBlock* createEmptyBlock(){
BasicBlock* mainblock = BasicBlock::Create(context, "entrypoint");
return mainblock;
}
, если вы хотите, чтобы все ваши метки блоков имели префикс «точка входа». Плюс, функциональное тело почти однострочное. Почему бы просто не встроить это, как это
Instruction *newBInst_0 = setBranchInst(F, inst, 1);//product a inst
llvm::BasicBlock *bb = BasicBlock::Create(context, "entrypoint");
bb->insertInto(&F,&block);
newBInst_0->insertBefore(bb->front());
, предположив, что ваши экземпляры builder
и context
являются глобальными переменными (что я рекомендую, что они должны).
Выглядит так, как будто вы не пользуюсь вашим экземпляром builder
. Попробуйте изучить некоторые из его методов, такие как builder.SetInsertPoint
и builder.CreateCondBr