2017-12-04 33 views
1

소스 코드에서 데이터 흐름을 추적하려고합니다. 이를 위해, 나는 그들이 유형 LoadInst의 명령 인LLVM - 레지스터가 주어지면 IR 표현에서 마지막으로 사용 된 위치를 얻습니다.

*(LI->getPointerOperand()) 

LI의 사용과에서 값을로드하는 등록 유형 load의 지시에보고 얻을 수 있어요. 이제이 레지스터가 마지막으로 액세스 된 위치를 알아야 해당 명령에서이 데이터 흐름으로 데이터 흐름을 확인할 수 있습니다. 모든 제안은 매우 감사하겠습니다.

+0

정적 분석 컨텍스트에서 "마지막 액세스"란 무엇을 의미합니까? 제어 흐름 그래프에서 가장 가까운 이전 액세스와 같은 것을 의미합니까? – compor

+0

예. 그것이 내가 의미하는 바입니다. 나를 안내 해줘. – eren555

답변

0

처음에는 단일 종료 및 단일 종료 그래프로 CFG 기능을 갖도록 여러 종료가있는 루프와 함수를 제외하여 문제를 단순화합니다.

처음과 같이 수행하여 모든 사용자를 찾을 것 하나 (아마도 단순한) 방법 : 그런 다음 PostDominatorTreeDomTreeNodeBasegetLevel 방법을 사용하여

llvm::Instruction i = [the register for that LoadInst]; 
auto users = i->users(); 

(나는 thisLLVM 5.0에 도입 된 생각 .0 버전에서 사용할 수없는 경우 getChildren을 사용하고 BFS 통과를 수행 할 수 있습니다.) 가장 높은 수준의 번호를 필터링 할 수 있습니다.

루프를 사용하여 무엇을하고 싶은지 확실하지 않지만 특별한 것이 없다면 위의 내용만으로 충분합니다. 함수의 여러 종료를 처리하려면 처리하기 전에 mergereturn 통과를 사용할 수 있습니다.