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。
我正在编写一个 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。