내 자신의 패스 개발을 위해 단위 테스트를 작성하고 싶습니다. 저는 '순수한'헬퍼 메소드가 많기 때문에 단위 테스트를위한 이상적인 후보로 보입니다. 그러나 그들 중 일부는 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::Function
void 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>
및 클래스 LoopInfoWrapperPass
을 PassManager<Function>
를 사용하여 기반으로했다,하지만 난 온라인에 대한 사용 예를 찾을 수 없습니다 LLVM 4.0 및 이전 예제는 이전 버전의 PassManager를 사용하는 것으로 보였으 나 LegacyPassManager
을 사용하는 방법을 알지 못했습니다. PassManager
의 소스를 조사하려고했지만 typedef와 템플릿 인수에 대한 충분한 이해를 할 수 없었습니다. (언어로서 C++에 대한 제 비합리적 혐오감이 커지고 있습니다).
스텁은 어떻게 작성합니까? C# 코드에서이 Analysis Pass를 호출하고 LoopInfo를 얻으려면 어떻게해야합니까?
추 신 : LoopInfoWrapperPass 이외의 패스가 더 있습니다. 사용할 필 요하지만, 분석 패스로 전달할 수 있어야합니다.
PPS : 단위 테스트 프레임 워크로 googletest를 사용하고 단위 테스트를 자체 테스트 대상으로 만드는 CMake 빌드 구성을 사용하며 LLVM 4.0의 바이너리 라이브러리에 대해 Pass-of-Tree를 구축하고 있습니다. 1, 그 중 어떤 것이 든 관련이 있다면.