LLVM获取加载指令的可能存储指令
我正在写一个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)
%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
}