Как я могу написать интерфейсный проход LLVM для вставки инструкции в начале/конце каждого BasicBlock?

Я попытался использовать AllocaInst и вставил его в конец данного BB следующим образом:

bool runOnBasicBlock(BasicBlock &BB) override {
// BB is the address to a BasicBlock instance
    errs() << BB.getName() << '\t';
    BasicBlock *pb=&BB;
    AllocaInst* pa = new AllocaInst(Type::getInt32Ty(getGlobalContext()), 0, "data");
    pb->getInstList().push_back(pa); //Inserts pa in the end of basic block pb

    //errs() << "\tstarts at\t" << i << "\tends at \t" << j << '\n';
    return false;
    }

Мне удалось связать и создать файл LLVMBasicBlock.so. Но когда я запускаю его для преобразования образца файла .bc, он выдает ошибку сегментации, пока работает с %data.


person Insanely curious    schedule 14.09.2015    source источник


Ответы (1)


Конструкторы для инструкций LLVM включают параметр для вставки. Этот параметр по умолчанию имеет значение NULL, которое вы использовали в своем примере кода. Для AllocaInst один из его конструкторов берет базовый блок для вставки в конце:

AllocaInst (Type *Ty, Value *ArraySize, const Twine &Name, BasicBlock *InsertAtEnd)

Моей первой рекомендацией было бы использовать функциональность, предусмотренную для вставки инструкций.

Во-вторых, AllocaInst принимает Value* ArraySize, которое вы предоставляете как 0. 0, вероятно, приводится к значению * NULL. Вместо этого вы, вероятно, захотите создать ConstantInt соответствующего числа. ConstantInt наследуется от Value, поэтому LLVM безопасно принуждает его.

person Brian    schedule 14.09.2015
comment
Разве нельзя использовать push_back(pa) вместо функций, предоставляемых в allocainst? - person Insanely curious; 14.09.2015