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

LLVM获取加载指令的可能存储指令,llvm,code-analysis,static-analysis,Llvm,Code Analysis,Static Analysis,我正在写一个LLVM过程,我需要找到每个可以定义装入指令读取的内存的指令。例如: %x = alloca i32, align 4 store i32 123, i32* %x, align 4 %0 = load i32, i32* %x, align 4 在本例中,我希望从load指令获取可能已初始化/更改%x的每条指令。在本例中,仅使用上一条存储指令。我尝试使用use-def链,但这给了我内存定义的指令,即alloca指令 bool runOnModule(Module &M)

我正在写一个LLVM过程,我需要找到每个可以定义装入指令读取的内存的指令。例如:

%x = alloca i32, align 4
store i32 123, i32* %x, align 4
%0 = load i32, i32* %x, align 4
在本例中,我希望从load指令获取可能已初始化/更改%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;
    }
};
bool runnonmodule(模块&M)覆盖{
用于(功能和乐趣:M){
对于(BasicBlock和bb:乐趣){
用于(说明和仪表:bb){
if(isa(仪表)){
for(使用&U:instr.operans()){
if(指令*Inst=dyn_铸件(U)){

errs()您可以将AllocaInst强制转换为Value,然后检查其使用情况(如果是加载或存储)

仅作旁注:
值是超类值这实际上是可行的。但是有没有一个更简单的分析,比如达到LLVM中已经实现的定义?所以我不必做定义覆盖其他定义的分析等。还有内存依赖传递,它反过来使用别名分析,您可以查询存储指令,它将返回从该内存加载或存储到该内存的指令。有关更多信息,请参阅。
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
}