對於我自己的Pass的開發,我想編寫單元測試 - 我有很多'純粹'的幫助器方法,所以它們看起來是單元測試的理想候選者。但其中一些需要一個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 */;
我的第一次嘗試是基於使用PassManager<Function>
(頁眉「LLVM/IR/PassManager.h」),AnalysisManager<Function>
,類LoopInfoWrapperPass
,但我無法在線找到任何用法示例LLVM 4.0和更舊的示例似乎使用了先前版本的PassManager,但我沒有看到如何使用LegacyPassManager
。我試圖尋找PassManager
的源代碼,但無法充分理解typedefs和模板參數(它們增加了我對C++作爲一種語言的不合理反感)。
如何填寫該存根?我如何在簡單的C++代碼中調用此分析通道(並獲取LoopInfo)?
PS:除了我需要使用的LoopInfoWrapperPass之外,還有更多的通行證,但我假設這種方式應該可以轉移到任何分析通行證。
PPS:我正在使用googletest作爲單元測試框架,使用CMake構建配置使得單元測試自己的目標,並且構建了LLVM 4.0二進制庫中的Pass out-tree。 1,如果有任何相關的話。