gpt4 book ai didi

LLVM 获取加载指令的可能存储指令

转载 作者:行者123 更新时间:2023-12-04 00:09:44 26 4
gpt4 key购买 nike

我正在编写一个 LLVM pass,我需要找到每条可以定义加载指令读取的内存的指令。例如:

%x = alloca i32, align 4
store i32 123, i32* %x, align 4
%0 = load i32, i32* %x, align 4

在这个例子中,我想从加载指令到每条可能已经初始化/改变 %x 的指令。在这种情况下,只是先前的存储指令。我尝试使用 use-def 链,但这给了我定义内存的指令,即 alloca 指令。

bool runOnModule(Module &M) override {
for(Function &fun : M) {
for(BasicBlock &bb : fun) {
for(Instruction &instr : bb) {

if(isa<LoadInst>(instr)){
for (Use &U : instr.operands()) {
if (Instruction *Inst = dyn_cast<Instruction>(U)) {
errs() << *Inst << "\n";
}
}
}

}
}
}
return false;
}
};

我怎样才能得到所有可能的存储指令,这些指令可以定义加载指令读取的内存?

最佳答案

您可以将 AllocaInst 转换为 Value,然后检查它的用途,看它们是加载还是存储。

仅作旁注:Value 是父类(super class) Value <-- User <-- Instruction <-- UnaryInst <-- AllocaInst,你也可以看看 http://llvm.org/docs/doxygen/html/classllvm_1_1Value.html#details 的继承图

Value* val = cast<Value>(alloca_x);
Value::use_iterator sUse = val->use_begin();
Value::use_iterator sEnd = val->use_end();
for (; sUse != sEnd; ++sUse) {
if(isa<LoadInst>(sUse)) // load inst
else if(isa<StoreInst>(sUse)) // store inst
}

还有内存依赖分析pass,依次使用别名分析,你可以查询存储指令,它会返回从内存加载或存储到内存的指令。见http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html获取更多信息。

关于LLVM 获取加载指令的可能存储指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37818618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com