2017-09-13 7 views
2

내 자신의 패스 개발을 위해 단위 테스트를 작성하고 싶습니다. 저는 '순수한'헬퍼 메소드가 많기 때문에 단위 테스트를위한 이상적인 후보로 보입니다. 그러나 그들 중 일부는 llvm :: LoopInfo의 인스턴스를 인수로 요구합니다. 내 (기능 -) 패스에서(비 -LLVM) 코드에서 llvm :: LoopInfo 가져 오기?

난 그냥이 정보 객체를 얻을 수

void getAnalysisUsage(llvm::AnalysisUsage &AU) const override { 
    AU.setPreservesCFG(); 
    AU.addRequired<llvm::LoopInfoWrapperPass>(); 
} 
... 
llvm::LoopInfo &loopInfo = getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo(); 

를 사용합니다. 내 단위 테스트에서

나는 현재 내 llvm::Functionvoid foo()이 같은 디스크에서 (나는 내 ​​분석을 실행하려는) 해석 : 나는 다음과 같은 스텁을 작성해야

llvm::SMDiagnostic Err; 
llvm::LLVMContext Context; 
std::unique_ptr<llvm::Module> module(parseIRFile(my_bc_filename, Err, Context)); 
llvm::Function* foo = module.operator*().getFunction("foo"); 

내 테스트를 마무리하기 :

llvm::LoopInfo& = /*run LoopInfoWrapperPass on foo and return LoopInfo element */; 

나의 첫번째 시도는, ("LLVM/IR/PassManager.h"헤더에) AnalysisManager<Function> 및 클래스 LoopInfoWrapperPassPassManager<Function>를 사용하여 기반으로했다,하지만 난 온라인에 대한 사용 예를 찾을 수 없습니다 LLVM 4.0 및 이전 예제는 이전 버전의 PassManager를 사용하는 것으로 보였으 나 LegacyPassManager을 사용하는 방법을 알지 못했습니다. PassManager의 소스를 조사하려고했지만 typedef와 템플릿 인수에 대한 충분한 이해를 할 수 없었습니다. (언어로서 C++에 대한 제 비합리적 혐오감이 커지고 있습니다).

스텁은 어떻게 작성합니까? C# 코드에서이 Analysis Pass를 호출하고 LoopInfo를 얻으려면 어떻게해야합니까?

추 신 : LoopInfoWrapperPass 이외의 패스가 더 있습니다. 사용할 필 요하지만, 분석 패스로 전달할 수 있어야합니다.

PPS : 단위 테스트 프레임 워크로 googletest를 사용하고 단위 테스트를 자체 테스트 대상으로 만드는 CMake 빌드 구성을 사용하며 LLVM 4.0의 바이너리 라이브러리에 대해 Pass-of-Tree를 구축하고 있습니다. 1, 그 중 어떤 것이 든 관련이 있다면.

답변

1

유닛 테스트 구조가 어떻게되어 있는지 모르겠지만 LLVM 소스 트리를 둘러 보는 것이 좋습니다.

하나의 예는 CFGTest.cpphere에서 찾을 수 있습니다. PassManager과 파이프 라인을 직접 만들어야합니다. 이 짧은 경험으로 작은 테스트에서는 잘 작동하지만, 데이터가 더 커지거나 전달이 필요한 경우에는 LoopInfo 데이터가 파이프 라인 (예 : runOn() 메소드 및 친구)에서만 의미가 있으므로 실제로 제한됩니다.

그렇지 않은 경우 통과 관리자 인프라를 사용하지 않고 직접 필요한 분석 세트를 작성하는 간단한 IMHO 방법 (도우미 만있는 경우 LoopInfo)을 사용하는 것이 좋습니다 (말장난 없음). 이 예는 here입니다.

희망이 도움이됩니다.