use*_*312 3 code-analysis static-analysis llvm
我正在编写一个 LLVM 通行证,我需要找到可以定义加载指令读取的内存的每条指令。例如:
%x = alloca i32, align 4
store i32 123, i32* %x, align 4
%0 = load i32, i32* %x, align 4
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想从加载指令到每个可能已经初始化/改变 %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;
}
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得所有可能的存储指令,这些指令可以定义加载指令读取的内存?
您可以将 AllocaInst 转换为 Value,然后检查其用途,如果它们是加载或存储。
仅供参考:Value 是超类 Value <-- User <-- Instruction <-- UnaryInst <-- AllocaInst,您还可以查看http://llvm.org/docs/doxygen/html/classllvm_1_1Value的继承图.html#详细信息
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
}
Run Code Online (Sandbox Code Playgroud)
还有内存依赖分析通道,它依次使用别名分析,您可以查询存储指令,它将返回从该内存加载或存储到该内存的指令。有关更多信息,请参阅http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html。