Как построить пустой базовый блок и вставить инструкцию впереди? - PullRequest
0 голосов
/ 13 апреля 2020

Я пишу функцию для создания пустого базового блока:

BasicBlock* createEmptyBlock(){
    llvm::LLVMContext context;
    IRBuilder<> builder(context);
    Function *mainFunction;
    mainFunction->setDoesNotReturn();
    BasicBlock* mainblock = BasicBlock::Create(context, "entrypoint", mainFunction);
    return mainblock;
}

, но когда вставляю свою инструкцию перед этим главным блоком:

 Instruction *newBInst_0 = setBranchInst(F, inst, 1);//product a inst
                            llvm::BasicBlock *bb;
                            bb=createEmptyBlock();                      
                            newBInst_0->insertBefore(bb->front());//there are some errors
                            bb->insertInto(&F,&block);

Я обнаружил некоторые ошибки при вставке Что с этим не так?

1 Ответ

0 голосов
/ 06 мая 2020

Вы должны попытаться остановить создание контекста и экземпляра компоновщика каждый раз, когда вы вызываете 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

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