【问题标题】:How can I write a front-end LLVM pass to insert an instruction at the beginning/end of every BasicBlock?如何编写前端 LLVM 通道以在每个 BasicBlock 的开头/结尾插入指令?
【发布时间】:2015-09-14 14:27:38
【问题描述】:

我尝试使用 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 时会引发分段错误。

【问题讨论】:

    标签: llvm llvm-clang llvm-ir


    【解决方案1】:

    LLVM 指令的构造函数包含插入位置的参数。此参数的默认值为 NULL,您在代码示例中使用了该参数。对于 AllocaInst,它的一个构造函数需要一个基本块插入到:

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

    我的第一个建议是使用为插入说明提供的功能。

    其次,AllocaInst 采用 Value* ArraySize,您将其提供为 0。0 可能被强制转换为 NULL 的 Value*。您可能想要创建一个适当数字的ConstantInt。 ConstantInt 继承自 Value,因此 LLVM 会安全地强制它。

    【讨论】:

    • 难道不能用 push_back(pa) 代替 allocainst 中提供的功能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2011-12-17
    相关资源
    最近更新 更多