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

LLVM get possible store instructions for a load instruction

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

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

在这个例子中,我想从加载指令到每条可能有 initialized/altered %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 是超类 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
}

还有内存依赖分析通道,它又使用别名分析,你可以查询存储指令,它会return从内存加载或存储的指令。有关详细信息,请参阅 http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html