저는 LLVM 패스를 작성하고 있는데,로드 명령어로 읽은 메모리를 정의 할 수있는 모든 명령어를 찾아야합니다. 예 : LLVM로드 명령어에 대한 저장 명령어를 얻을 수 있습니다.
%x = alloca i32, align 4
store i32 123, i32* %x, align 4
%0 = load i32, i32* %x, align 4
이 예에서는 % x을 초기화/변경했을 수있는 모든 명령어에 대한로드 명령어를 가져 오려고합니다. 이 경우 이전 저장 명령입니다. use-def chain을 사용하려고 시도했지만, 이것은 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;
}
};
로드 명령어로 읽을 수있는 메모리를 정의 할 수있는 모든 가능한 저장 명령어를 얻으려면 어떻게해야합니까?
이것은 실제로 작동합니다. LLVM에 이미 구현되어있는 정의에 도달하는 것과 같은 간단한 분석이 아닌가? 그래서 어떤 정의가 다른 정의를 덮어 쓰는 분석을 할 필요가 없습니다. – user2600312
또한 메모리 의존성 패스가 있습니다. 이것은 차례로 별칭 분석을 사용합니다. 저장소 명령어를 쿼리 할 수 있으며로드하거나로드하는 명령어를 해당 메모리에 반환합니다. . 자세한 내용은 http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html을 참조하십시오. –