2017-11-06 9 views
0

LLVM IR에서 루프를 식별하고 싶습니다. loopInfo를 얻기 위해 LoopInfoWrapperPass를 사용하고 있습니다.while, for 및 do-while과 같이 LLVM IR에서 다른 루프 유형을 식별하는 방법은 무엇입니까?

LoopInfo & LoopInfo = getAnalysis (* F) .getLoopInfo();

다른 루프 유형을 구별하는 관련 API를 찾을 수 없습니다.

+0

LoopInfo & LoopInfo = getAnalysis (* F) .getLoopInfo(); –

+1

정확히 같은 LLVM 코드를 생성하기 때문에 while 루프와 LLVM 레벨의 동등한 for 루프를 구분할 방법이 없습니다. – sepp2k

+0

@ sepp2k 고맙습니다. –

답변

0

LLVM IR의 경우 Loop API를 보면 getStartLoc과 같은 관련 호출이 있습니다. 이제 여기에 소스 코드 라인에서

llvm::SmallVector<llvm::Loop *> workList; 
auto &LI = getAnalysis<llvm::LoopInfoWrapperPass>(CurFunc).getLoopInfo(); 

std::for_each(LI.begin(), LI.end(), [&workList](llvm::Loop *e) { workList.push_back(e); }); 

for(auto *e : workList) { 
     auto line = e->getStartLoc().getLine(); 
     auto *scope = llvm::dyn_cast<llvm::DIScope>(e->getStartLoc().getScope()); 
     auto filename = scope->getFilename(); 

     // do stuff here 
    } 

을 당신은이 루프의 종류를 식별 할 수 있습니다 그래서 당신은, (예를 들어, llvm::Function 패스의 runOn 방법 내부) 같은 것을 할 수 있습니다.