2016-06-14 2 views
1

저는 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; 
    } 
}; 

로드 명령어로 읽을 수있는 메모리를 정의 할 수있는 모든 가능한 저장 명령어를 얻으려면 어떻게해야합니까?

답변

2

AllocaInst를 값으로 변환 한 다음로드 또는 저장하는 경우 해당 용도를 확인할 수 있습니다. 그냥 보조 노트에 대한

는 : 값은 슈퍼 클래스 값 < - 사용자 < - 수업 < - 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 
} 

에서 상속 다이어그램을 볼 수 있습니다 또한 메모리 종속성 분석 패스는 차례로 별칭 분석을 사용합니다. 저장소 명령어를 쿼리 할 수 ​​있으며로드하거나로드하는 명령어를 해당 메모리로 반환합니다. 자세한 내용은 http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html을 참조하십시오.

+0

이것은 실제로 작동합니다. LLVM에 이미 구현되어있는 정의에 도달하는 것과 같은 간단한 분석이 아닌가? 그래서 어떤 정의가 다른 정의를 덮어 쓰는 분석을 할 필요가 없습니다. – user2600312

+0

또한 메모리 의존성 패스가 있습니다. 이것은 차례로 별칭 분석을 사용합니다. 저장소 명령어를 쿼리 할 수 ​​있으며로드하거나로드하는 명령어를 해당 메모리에 반환합니다. . 자세한 내용은 http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html을 참조하십시오. –

관련 문제