2017-09-13 136 views
2

對於我自己的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::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 */; 

我的第一次嘗試是基於使用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,如果有任何相關的話。

回答

1

我不確定您的單元測試是如何構建的,但是在LLVM源代碼樹中瀏覽是個不錯的主意。

一個例子可以在CFGTest.cpphere中找到。 您需要自行創建PassManager和管道。從我在這方面的短時間經驗來看,它適用於小型測試,但是一旦您需要更大的數據或傳入/輸出數據,它實際上是有限制的,因爲LoopInfo數據只在管道內(又名runOn()方法和朋友)有意義。如果沒有使用pass manager基礎結構,你可能想要更簡單的,恕我直言,自己創建所需分析集合的方法(在LoopInfo的情況下只有支配者)。這個例子可以看到here

希望這會有所幫助。