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

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)

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

Chi*_*tel 5

您可以将 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_1MemoryDe​​pendenceAnalysis.html